Проблема с задачей смешанного целочисленного нелинейного программирования в GEKKO - PullRequest
2 голосов
/ 01 августа 2020

Я использую GEKKO для решения задачи MINLP в Python, которая включает совместное моделирование с PowerFactory, программой моделирования энергосистемы. Целевая функция задачи MINLP должна вызывать PowerFactory изнутри и выполнять определенные задачи перед возвратом значений в определение проблемы MILP. В определении ограничения равенства мне также нужно использовать два кадра данных Pandas (таблицы с ячейками 10000x2), чтобы получить конкретные значения, соответствующие значениям переменных решения в выражении ограничения. Но я получаю ошибки при написании любого кода, включающего циклы или функции Pandas 'lo c' или 'ilo c' в рамках функций цели / ограничения из-за некоторых проблем с природой переменных GEKKO в этих вызовы функций. Любая помощь в этом отношении будет принята с благодарностью. Структура кода приведена ниже:

    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        
           

В другой формулировке проблемы я пытаюсь запустить задачи оптимизации MINLP в рамках функции цели и ограничения как вложенную задачу оптимизации. Однако я тоже сталкиваюсь с ошибками. Структура кода следующая:

    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 Ответ

1 голос
/ 01 августа 2020

Gekko не имеет обратных вызовов для внешних функций. Это связано с тем, что решатели основаны на градиенте, а предшествующие шаги - это автоматическое c дифференцирование для получения точных 1-й и 2-й производных в разреженной форме. Подобно Gekko и CoolProp , одним из вариантов является построение приближения к вашей внешней (в данном случае PowerFactory) модели, которую оптимизатор может использовать. Два варианта: cubi c spline (cspline) или base 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 ветвь и bound для решения смешанной целочисленной части.

...