使用 gekko 变量求和的意外结果
Unexpected results from sum using gekko variable
我正在优化一个简单的问题,在该问题中,我正在为总和需要低于特定预算的约束求和中间变量。
当我使用 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)
正在解决问题 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()
函数来提高求解效率,尤其是对于大型问题。
我正在优化一个简单的问题,在该问题中,我正在为总和需要低于特定预算的约束求和中间变量。
当我使用 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)
正在解决问题 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()
函数来提高求解效率,尤其是对于大型问题。