GEKKO - 矩阵形式的 MINLP - 使用 m.axb() 的错误

GEKKO - MINLP in Matrix Form - Errors using m.axb()

我正在尝试使用 GEKKO 解决 MINLP 问题。我的代码如下:

m = GEKKO(remote = True)
m.options.SOLVER = 3

m.solver_options = ['minlp_maximum_iterations 500', \
                # minlp iterations with integer solution
                'minlp_max_iter_with_int_sol 10', \
                # treat minlp as nlp
                'minlp_as_nlp 0', \
                # nlp sub-problem max iterations
                'nlp_maximum_iterations 50', \
                # 1 = depth first, 2 = breadth first
                'minlp_branch_method 1', \
                # maximum deviation from whole number
                'minlp_integer_tol 0.05', \
                # covergence tolerance
                'minlp_gap_tol 0.01']

# Array Variable
rows  = nb_phases + 3*b_max*(nb_phases+1)#48
columns = 1
x = np.empty((rows,columns),dtype=object)
for i in range(3*nb_phases*b_max+nb_phases+1):
    for j in range(columns):
        x[i,j] = m.Var(value = xinit[i,j], lb = LB[i,j], ub = UB[i,j], integer = False)

for i in range(3*nb_phases*b_max+nb_phases+1, (3*nb_phases+3)*b_max+nb_phases):
    for j in range(columns):
        x[i,j] = m.Var(value = xinit[i,j], lb = LB[i,j], ub = UB[i,j], integer = True)

# Constraints
#m.axb(A = A,b = B, x = x, etype = '<=', sparse = False)
m.axb(A,B, etype = '<=',sparse=False) 

#m.axb(A = A_eq,b = B_eq, x = x, etype = '=', sparse = False)
m.axb(A_eq,B_eq, etype = '=',sparse=False)

for i in range(rows):
    for j in range(columns):
        m.Minimize((x[i,j]-i*j)**2)

#Solver
m.solve(disp = True)

调用axb函数时,如果我在参数中声明变量x如下:

m.axb(A = A,b = B, x = x, etype = '<=', sparse = False)

我收到错误消息:列表 x 必须由 GEKKO 参数或变量组成。我不太明白为什么会出现此错误,因为 x 是一个 gekko 变量。

如果我没有在 axb 函数的参数中声明变量 x:

m.axb(A,B, etype = '<=',sparse=False)

我收到以下错误:AXB 缺少配置文件,错误:缺少 AXB 对象:axb1.txt,示例配置文件:axb1.txt

我在想也许问题是 x 没有定义为数组。因此,考虑到 x[i,j],我试图通过在循环中编码矩阵乘积 A.x 来显式方程 Ax<=b 以避免调用 m.axb 但我不确定如何声明后的方程。我的代码如下:

Ax = []

for i in range(rows):
    temp = []
    for j in range(columns):
        temp.append(A[i,j]*x[j,0])
    Ax.append(sum(temp))

for i in range(rows):
    m.Equations(Ax[i] <= B[i])

我收到错误:'int' 对象不可订阅

有谁能帮我解决这个问题吗? 有没有办法将 x 定义为数组? (因为它的一些元素是整数而另一些不是)

非常感谢!

这是一个适用于尚未发布但可在 GitHub 上使用的较新版本 Gekko 的解决方案。您需要将最新版本的 gekko.py (v1.0) 放入 Lib/site_packages/gekko 文件夹和本地可执行文件(apm.exe for Windows,apm_mac对于 MacOS,apm for Linux) 在 Lib/site_packages/gekko/bin 文件夹中使用 remote=False.

from gekko import GEKKO
import numpy as np
m = GEKKO(remote = False)
m.options.SOLVER = 3
nb_phases = 2
b_max = 3

m.solver_options = ['minlp_maximum_iterations 500', \
                # minlp iterations with integer solution
                'minlp_max_iter_with_int_sol 10', \
                # treat minlp as nlp
                'minlp_as_nlp 0', \
                # nlp sub-problem max iterations
                'nlp_maximum_iterations 50', \
                # 1 = depth first, 2 = breadth first
                'minlp_branch_method 1', \
                # maximum deviation from whole number
                'minlp_integer_tol 0.05', \
                # covergence tolerance
                'minlp_gap_tol 0.01']

# Array Variable
rows  = nb_phases + 3*b_max*(nb_phases+1)#48
columns = 1
xinit = np.ones(rows)
LB = np.zeros(rows)
UB = np.ones(rows)*10.0
#x = m.Array(m.Var,(rows))
x = np.empty(rows,dtype=object)
for i in range(3*nb_phases*b_max+nb_phases+1):
    x[i] = m.Var(value = xinit[i], lb = LB[i], ub = UB[i], integer = False)

for i in range(3*nb_phases*b_max+nb_phases+1, (3*nb_phases+3)*b_max+nb_phases):
    x[i] = m.Var(value = xinit[i], lb = LB[i], ub = UB[i], integer = True)

# Constraints
#m.axb(A = A,b = B, x = x, etype = '<=', sparse = False)
A = np.ones((1,rows)); B = np.zeros(1)
m.axb(A,B,x,etype = '<=',sparse=False) 

#m.axb(A = A_eq,b = B_eq, x = x, etype = '=', sparse = False)
m.axb(A,B,x,etype = '=',sparse=False)

for i in range(rows):
    m.Minimize((x[i]-i)**2)

#Solver
m.options.SOLVER = 1
m.solve(disp = True)

这产生了解决方案:

 ----------------------------------------------------------------
 APMonitor, Version 1.0.0
 APMonitor Optimization Suite
 ----------------------------------------------------------------
 
 
 --------- APM Model Size ------------
 Each time step contains
   Objects      :  2
   Constants    :  0
   Variables    :  29
   Intermediates:  0
   Connections  :  58
   Equations    :  29
   Residuals    :  29
 
 Number of state variables:    29
 Number of total equations: -  2
 Number of slack variables: -  0
 ---------------------------------------
 Degrees of freedom       :    27
 
 ----------------------------------------------
 Steady State Optimization with APOPT Solver
 ----------------------------------------------
Iter:     1 I:  0 Tm:     -0.00 NLPi:    2 Dpth:    0 Lvs:    0 Obj:  7.71E+03 Gap:  0.00E+00
 Successful solution
 
 ---------------------------------------------------
 Solver         :  APOPT (v1.0)
 Solution time  :  0.019000000000000003 sec
 Objective      :  7714.
 Successful solution
 ---------------------------------------------------