2

I am using GEKKO for solving an MINLP problem in Python that involves a co-simulation with PowerFactory, a power system simulation software. The MINLP problem objective function needs to call PowerFactory from within and execute particular tasks before returning the values to the MILP problem definition. In the equality constraint definition, I need to also use two Pandas data frames (tables with 10000x2 cells) to get particular values corresponding to the values of the decision variables in the constraint expression. But, I am getting errors while writing any code involving loops, or Pandas 'loc' or 'iloc' functions, within the objective/constraint functions due to some issues with the nature of GEKKO variables in these function calls. Any help in this regard would be much appreciated. The structure of the code is given below:

    import powerfactory as pf
    from gekko import GEKKO
    import pandas as pd
    
    # Execute the PF setup commands for Python
    
    # Pandas dataframe in question
    df1 = pd.read_csv("table1.csv")
    df2 = pd.read_csv("table2.csv")
    
    def constraint1(X):
          P = 0
          for i in range(length(X)):
            V = X[i] * 1000
            D = round(V, 1)
            P += df1.loc[D, "ColumnName"]
          return P
    def objective(X):
            for i in range(length(X)):
                 V = X[i] * 1000
                 D = round(V, 1)
                 I = df2.loc[D, "ColumnName"]
        # A list with the different values of 'I' is generated for passing to PF    
        # Some PowerFactory based commands below, involving inputs, and extracting results from PF, using a list generated from the values of 'I'. PF returns some result values to the code
         return results
    # MINLP problem definition:
    m = GEKKO(remote=False)
    x = m.Array(m.Var, nInv, value=1.0, lb=0.533, ub=1.0)
    m.Equation(constraint1(x) == 30)
    m.Minimize(objective(x))
    m.options.SOLVER = 3
    m.solve(disp=False)
    # Command for exporting the results to a .txt file        
           

In another problem formulation, I am trying to run MINLP optimization problems within the objective and constraint function as a nested optimization problem. However, I am running into errors in that as well. The structure of the code is as follows:

    import powerfactory as pf
    from gekko import GEKKO
    
    # Execute the PF setup commands for Python
    
    def constraint1(X):
          P = 0
          for i in range(length(X)):
            V = X[i] * 1000
            # 2nd MINLP problem: Finds 'I' from value of 'V', a single element
            # Calculate 'Pcal' from 'I'
            P += Pcal
          return P
    def objective(X):
            Iset = []
            for i in range(length(X)):
                 V = X[i] * 1000
                 # 3rd MINLP problem: Finds 'I' from value of 'V'
                 # Appends 'I' to a 'Iset'
            # 'Iset' list passed on to PF    
        # Some PowerFactory based commands below, involving inputs, and extracting results from PF, using the 'Iset' list. PF returns some result values to the code
         return results
    # Main MINLP problem definition:
    m = GEKKO(remote=False)
    x = m.Array(m.Var, nInv, value=1.0, lb=0.533, ub=1.0)
    m.Equation(constraint1(x) == 30)
    m.Minimize(objective(x))
    m.options.SOLVER = 3
    m.solve(disp=False)
    # Command for exporting the results to a .txt file  

1 Answers1

0

Gekko does not have call-backs to external functions. This is because the solvers are gradient-based and a precursor steps is automatic differentiation to obtain exact 1st and 2nd derivatives in sparse form. Similar to Gekko and CoolProp, one option is to build an approximation to your external (in this case PowerFactory) model that the optimizer can use. Two options are the cubic spline (cspline) or the basis spline (bspline).

Basis Spline

If you can't use these approximations then I recommend switching to a different platform for solving the optimization problem. Perhaps you could try scipy.optimize.minimize that can obtain gradients by finite difference and add branch and bound to solve the mixed integer portion.

John Hedengren
  • 12,068
  • 1
  • 21
  • 25