我不熟悉优化,我想实现以下目标:
假设我有3个常量列表:
list_1 = [1, 2, 3, 4]
list_2 = [5, 8, 10, 11]
list_3 = [20, 27, 89, 100]
我想找3个索引i1, i2, i3
,与上面的3个列表相对应,这样总和就会最小化:min(list_1[i1] + list_2[i2] + list_3[i3])
受一些限制的限制:
i1 >= 0
i2 >= 0
i3 >= 0
i1 + i2 + i3 == 4
64 * i1 + 72 * i2 + 74 * i3 >= 240
我试着写成:
from gekko import GEKKO
m = GEKKO()
x_1_storage = m.Array(m.Const, 4)
x_1_values = [1, 2, 3, 4]
i = 0
for xi in x_1_storage:
xi.value = x_1_values[i]
i += 1
x_2_storage = m.Array(m.Const, 4)
x_2_values = [5, 8, 10, 11]
i = 0
for xi in x_2_storage:
xi.value = x_2_values[i]
i += 1
x_3_storage = m.Array(m.Const, 4)
x_3_values = [20, 27, 89, 100]
i = 0
for xi in x_3_storage:
xi.value = x_3_values[i]
i += 1
x,y,z = m.Array(m.Var,3,integer=True,lb=0)
m.Minimize(x_1_storage[x.value.value] + x_2_storage[y.value.value] + x_3_storage[z.value.value])
m.Equations([x>=0,
y>=0,
z>=0,
x+y+z==4,
64*x + 72*y + 74*z >= 240])
m.options.SOLVER = 1
m.solve()
print('Objective: ', m.options.OBJFCNVAL)
print('x: ', x.value[0])
print('y: ', y.value[0])
print('z: ', z.value[0])
然而,打印的目标值是26,而正确的目标值应该是4,因为x_1_storage[4] = 4
.以某种方式,每个列表中的第一个元素被添加为目标值.我的印象是,表达目标的方式有问题:
m.Minimize(x_1_storage[x.value.value] + x_2_storage[y.value.value] + x_3_storage[z.value.value])
然而,我不太确定在这种情况下该怎么做.如有任何提示,我们不胜感激.