微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用 gekko 变量求和的意外结果

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

当我使用 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)

解决问题会返回一个错误,指出没有可行的解决方案,即使存在微不足道的解决方案。此外,去除此约束会返回一个自然不会违反最大预算约束的解决方案。

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

解决方法

如果没有一个完整的、最小的问题,就很难诊断问题。这是重新创建问题的尝试:

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,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,lb=0)
sums = m.Intermediate(m.sum([xi*yi for xi,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() 函数来提高求解效率,尤其是对于大型问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。