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

如何在python中将sos1与GEKKO Array一起使用?

如何解决如何在python中将sos1与GEKKO Array一起使用?

我正在尝试使用 GEKKO 解决优化问题,我必须在其中设置特定约束 关于解决方案的价值。我正在使用 sos1 来做到这一点。但是,我很难尝试将 sos1 与 GEKKO.Array() 一起使用。

如果我使用以下代码,我会得到一个依赖于约束的结果:

from gekko import GEKKO
import numpy as np

# Initialize Model
m = GEKKO(remote=True)
eq = m.Param(value=40)
x1 = m.sos1([1.2,1.5,2,3,3.5])
x2 = m.sos1([i for i in np.arange(1,5,1)])
x3 = m.sos1([i for i in np.arange(1,1)])
x4 = m.sos1([i for i in np.arange(1,0.5)])

x1.value = 1
x2.value = 5
x3.value = 5
x4.value = 1

x1.lower = 1
x2.lower = 1
x3.lower = 1
x4.lower = 1

x1.upper = 5
x2.upper = 5
x3.upper = 5
x4.upper = 5

m.Equation(x1*x2*x3*x4>=25)
m.Equation(x1**2+x2**2+x3**2+x4**2==eq)

#Objective
m.Obj(x1*x4*(x1+x2+x3)+x3)

#Set global options
m.options.IMODE = 3 #steady state optimization

m.solve()

#Results
print('')
print('Results')
print('x1: ' + str(x1.value))
print('x2: ' + str(x2.value))
print('x3: ' + str(x3.value))
print('x4: ' + str(x4.value))

我正在尝试将 sos1 与 Array 一起使用,如下所示:

from gekko import GEKKO
import numpy as np

# Initialize Model
m = GEKKO(remote=True)
eq = m.Param(value=40)
x = m.Array(m.Var,4)
i = 0
value = [1,1]
l = [1,1,1]
u = [5,5]
specific_values = [[1.2,3.5],[1,4],2.5,3.5,4,4.5]]

for xi in x:
    xi.value = value[i]
    xi.lower = l[i]
    xi.upper = u[i]
    xi = m.sos1(specific_values[i])
    i+=1

m.Equation(np.prod(x)>=25)
m.Equation(x[0]**2+x[1]**2+x[2]**2+x[3]**2==eq)

#Objective
m.Obj(x[0]*x[3]*(x[0]+x[1]+x[2])+x[2])

#Set global options
m.options.IMODE = 3 #steady state optimization

m.solve()

#Results
print('')
print(x[0].value,x[1].value,x[2].value,x[3].value)

结果与我尝试在没有 sos1 的情况下优化函数一样。此外,似乎 sos1 正在覆盖下限和上限的值。我究竟做错了什么?有没有办法将 sos1 与 gekko 阵列一起使用?

编辑:我检查了 Array 不支持 sos1,所以我没有创建一个 Array,而是尝试在 for 循环中单独创建一个 sos1 列表并且它起作用了。它需要对方程定义进行一些小的修改,但很简单。

from gekko import GEKKO
import numpy as np
# Initialize Model
m = GEKKO(remote=True)
eq = m.Param(value=40)
specific_values = [[1.2,4.5]]

x = [m.sos1(specific_values[i]) for i in range(4)] # m.Array(m.Var,5]

for xi in x:
    xi.value = value[i]
    print(specific_values[i])
    xi.lower = l[i]
    xi.upper = u[i]
    
    print(xi.lower,xi.upper,xi.value)
    i+=1

m.Equation(np.prod(np.asarray(x))>=25)
m.Equation(np.sum(np.asarray(x)**2)==eq)

#Objective
m.Obj(x[0]*x[3]*(x[0]+x[1]+x[2])+x[2])

#Set global options
m.options.IMODE = 3 #steady state optimization

m.solve()

# Results
print('')
print(x[0].value,x[3].value)

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