“ int'对象不可下标”

问题描述 投票:2回答:1

我开始学习GEKKO。现在,我正在解决一个要学习的knapsak问题,但是这次我得到了错误“ int'对象不可下标”。你能看一下这段代码吗?问题的根源是什么?如何定义1.10矩阵?

from gekko import GEKKO    
import numpy as np

m = GEKKO(remote=False)
x = m.Var((10),lb=0,ub=1,integer=True)
#x = m.Array(m.Var,(1,10),lb=0,ub=1,integer=True)
v=np.array([2, 2, 7, 8, 2, 1, 7, 9, 4, 10])
w=np.array([2, 2, 2, 2, 2, 1, 6, 7, 3, 3])
capacity=16

for j in range(10):
           m.Maximize(v[j]*x[j])

for i in range(10):
        m.Equation(m.sum(x[i]*w[i])<=capacity)

m.options.solver = 1
m.solve()
#print('Objective Function: ' + str(m.options.objfcnval))
print(x)

我的第二个问题是MATLAB中有一个名为“ showproblem()”的函数。 GEKKO是否具有此功能?

感谢您的帮助。根据答案的新问题。我可以在这里写这种样式吗(如果不行,请写工作样式)(我想写这种样式,因为我认为这种样式更容易理解。)]

for i in range(10):
    xw = x[i]*w[i] 
    m.Equation(m.sum(xw)<=capacity)

代替此。

xw = [x[i]*w[i] for i in range(10)]
m.Equation(m.sum(xw)<=capacity)
python gekko
1个回答
2
投票

这里是修改版本,解决了gekko中的混合整数问题。

from gekko import GEKKO    
import numpy as np

m = GEKKO(remote=False)
x = m.Array(m.Var,10,lb=0,ub=1,integer=True)
v=np.array([2, 2, 7, 8, 2, 1, 7, 9, 4, 10])
w=np.array([2, 2, 2, 2, 2, 1, 6, 7, 3, 3])
capacity=16

for j in range(10):
    m.Maximize(v[j]*x[j])

xw = [x[i]*w[i] for i in range(10)]
m.Equation(m.sum(xw)<=capacity)

m.options.solver = 1
m.solve()
print('Objective Function: ' + str(-m.options.objfcnval))
print(x)

您的问题表述很接近。您只需要定义用于形成容量约束的列表xw。如果要使用循环而不是列表理解,则建议使用以下内容代替xw = [x[i]*w[i] for i in range(10)]

xw = []
for i in range(10):
    xw.append(x[i]*w[i])
© www.soinside.com 2019 - 2024. All rights reserved.