gpt4 book ai didi

python - GEKKO:将数组中的出现次数作为条件进行计数

转载 作者:行者123 更新时间:2023-12-04 13:35:19 27 4
gpt4 key购买 nike

我将 gekko 用于 INLP,即整数非线性规划。
我有一个整数变量数组;但是,我的条件是没有值必须出现多次,即

enter image description here

代码:

from gekko import GEKKO

model = GEKKO()

model.options.SOLVER = 1

x = model.Array(model.Var, 2, lb=0, ub=10, integer=True)

for m in range(11):
model.Equation(x.count(m) <= 1)

model.Obj(sum(x))

model.solve()

给出错误:
类型错误:“int”类型的对象没有 len()

为什么我不能这样做?

最佳答案

NumPy count函数不为求解器提供梯度,因此在 gekko 方程中不受支持。解决问题的另一种方法是使用二进制变量 b确定在 0 和 10 之间选择了哪 2 个数字。

from gekko import GEKKO
model = GEKKO()
model.options.SOLVER = 1

n = 10
b = model.Array(model.Var, 11, lb=0, ub=1, integer=True)
y = [model.Intermediate(b[i]*i) for i in range(11)]
model.Equation(model.sum(b)==2)
model.Minimize(model.sum(y))

model.solve()

print('b: ' + str(b))
print('y: ' + str(y))

解决办法是:
b: [[1.0] [1.0] [0.0] [0.0] [0.0] [0.0] [0.0] [0.0] [0.0] [0.0] [0.0]]
y: [[0.0], [1.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0]]

这是正确的,因为选择了 0 和 1 来最小化总和。如果您切换到 m.Maximize(model.sum(y))然后求解器选择 9 和 10。
b: [[0.0] [0.0] [0.0] [0.0] [0.0] [0.0] [0.0] [0.0] [0.0] [1.0] [1.0]]
y: [[0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [9.0], [10.0]]

这并没有给出 x 的解决方案作为只有 2 个数字的数组。您也可以使用 y在您的应用程序中。

这里有一种浓缩方式 y下至 x :

from gekko import GEKKO
model = GEKKO()
model.options.SOLVER = 1

b = model.Array(model.Var, (11,2), lb=0, ub=1, integer=True)
x = [None]*2
for j in range(2):
x[j] = model.sum([model.Intermediate(b[i,j]*i) for i in range(11)])

model.Equations([model.sum(b[:,j])==1 for j in range(2)])
model.Equations([model.sum(b[i,:])<=1 for i in range(11)])

model.Minimize(model.sum(x))

model.solve()

print('b: ' + str(b))
print('x: ' + str(x))

这给出了解决方案:
b: [[[0.0] [1.0]]
[[1.0] [0.0]]
[[0.0] [0.0]]
[[0.0] [0.0]]
[[0.0] [0.0]]
[[0.0] [0.0]]
[[0.0] [0.0]]
[[0.0] [0.0]]
[[0.0] [0.0]]
[[0.0] [0.0]]
[[0.0] [0.0]]]
x: [[1.0], [0.0]]

这种方法需要更多的二进制变量,但解决方案仍然很快。

关于python - GEKKO:将数组中的出现次数作为条件进行计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62472560/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com