我正在优化一个简单的问题,其中我正在对中间变量求和,以满足约束,其中总和需要低于某个预算。
当我使用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)
解决问题会返回一个错误,指出没有可行的解决方案,即使存在微不足道的解决方案也是如此。此外,删除此约束将返回一个自然不违反最大预算约束的解决方案。
我对中间变量有什么误解,以及如何对它们求和。
发布于 2021-05-03 20:29:11
如果没有一个完整的、最小的问题,就很难诊断问题。以下是重现该问题的尝试:
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()
函数来提高求解效率,特别是对于大型问题。
https://stackoverflow.com/questions/67342547
复制相似问题