使用 gekko 变量求和的意外结果

Unexpected results from sum using gekko variable

我正在优化一个简单的问题,在该问题中,我正在为总和需要低于特定预算的约束求和中间变量。

当我使用 sumnp.sum 打印总和时,我得到以下结果:(((((((((((((((((((((((((((((i429+i430)+i431)+i432)+i433)+i434)+i435)+i436)+i437)+i438)+i439)+i440)+i441)+i442)+i443)+i444)+i445)+i446)+i447)+i448)+i449)+i450)+i451)+i452)+i453)+i454)+i455)+i456)+i457)+i458)

这是创建变量和总和的命令。

x = m.Array(m.Var, (len(bounds)),integer=True) 
sums = [m.Intermediate(objective_inverse2(x,y)) for x,y in zip(x,reg_feats)]

我对中间变量的理解是根据x的值动态计算的变量,是决策变量

这是最大预算约束的求和函数。

m.Equation(np.sum(sums) < max_budget)

正在解决问题 returns 一个错误,指出没有可行的解决方案,即使通过简单的解决方案也存在。此外,删除此约束 returns 自然不会违反最大预算约束的解决方案。

我对中间变量有什么误解以及如何对它们求和。

如果没有完整的、最小的问题,很难诊断问题。这是重现问题的尝试:

from gekko import GEKKO
import numpy as np

m = GEKKO()
nb = 5
x = m.Array(m.Var,nb,value=1,lb=0,ub=1,integer=True)
y = m.Array(m.Var,nb,lb=0)

i = []  # intermediate list
for xi,yi in zip(x,y):
    i.append(m.Intermediate(xi*yi))
m.Maximize(m.sum(i))
m.Equation(m.sum(i)<=100)

m.options.SOLVER = 1
m.solve()

print(x)
print(y)

除了创建一个中间体列表,求和也可以用列表推导的结果进行。这样,只创建了一个中间值。

from gekko import GEKKO
import numpy as np

m = GEKKO()
nb = 5
x = m.Array(m.Var,nb,value=1,lb=0,ub=1,integer=True)
y = m.Array(m.Var,nb,lb=0)
sums = m.Intermediate(m.sum([xi*yi for xi,yi in zip(x,y)]))
m.Maximize(sums)
m.Equation(sums<=100)

m.options.SOLVER = 1
m.solve()

print(sums.value)
print(x)
print(y)

两种情况下,最优解为:

 ---------------------------------------------------
 Solver         :  APOPT (v1.0)
 Solution time  :   1.560000001336448E-002 sec
 Objective      :   -100.000000000000     
 Successful solution
 ---------------------------------------------------
 
[100.0]
[[1.0] [1.0] [1.0] [1.0] [1.0]]
[[20.0] [20.0] [20.0] [20.0] [20.0]]

尝试使用 Gekko m.sum() 函数来提高求解效率,尤其是对于大型问题。