我正在优化一个简单的问题,我正在为总和需要低于特定预算的约束对中间变量求和。
当我使用 sum
或 np.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)
解决问题会返回一个错误,指出没有可行的解决方案,即使存在微不足道的解决方案。此外,去除此约束会返回一个自然不会违反最大预算约束的解决方案。
我对中间变量以及如何对它们求和有什么误解。
答案 0 :(得分:1)
如果没有一个完整的、最小的问题,就很难诊断问题。这是重新创建问题的尝试:
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()
函数来提高求解效率,尤其是对于大型问题。