如何解决GEKKO - 矩阵形式的 MINLP - 使用 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,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):
for j in range(columns):
x[i,integer = True)
# Constraints
#m.axb(A = A,b = B,x = x,etype = '<=',sparse = False)
m.axb(A,B,sparse=False)
#m.axb(A = A_eq,b = B_eq,etype = '=',sparse = False)
m.axb(A_eq,B_eq,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)
m.axb(A = A,sparse = False)
我收到错误:列表 x 必须由 GEKKO 参数或变量组成。我真的不明白为什么我会收到这个错误,因为 x 是一个 gekko 变量。
如果我没有在 axb 函数的参数中声明变量 x:
m.axb(A,sparse=False)
我收到以下错误:AXB 缺少配置文件,错误:AXB 对象丢失:axb1.txt,示例配置文件:axb1.txt
我在想问题可能在于 x 未定义为数组。因此,考虑到 x[i,j],我试图通过在循环中编码矩阵乘积 A.x 来明确方程 Ax
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
for Windows,apm.exe
for MacOS,apm_mac
{1}} for Linux)在 apm
文件夹中使用 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],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,sparse=False)
#m.axb(A = A_eq,b = B_eq,etype = '=',sparse = False)
m.axb(A,sparse=False)
for i in range(rows):
m.Minimize((x[i]-i)**2)
#Solver
m.options.SOLVER = 1
m.solve(disp = True)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。