微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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)

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

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 举报,一经查实,本站将立刻删除。