如何使用m.sign3或m.sign2来限制方程中使用的非零变量的数量

2024-04-26 00:54:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过限制我想要使用的非零变量的数量来优化这个方程。x、 z,w继续以0的形式返回

from gekko import GEKKO
m = GEKKO()
# creates the variables
x = m.sos1([0,2])
z = m.sos1([0,3])
w = m.sos1([0,4])
# use sign2 to define a new variable
y = m.sign2(x)
t = m.sign2(z)
v = m.sign2(w)
# Equation
m.Equation(y+t+v<=2)
m.Equation(x+z+w>=5)
#objective
m.Obj((x+z+w)*-1)
m.solve(disp=False) 

有时,当我希望sign2值保持为零时,我会将其返回为负数


Tags: thetofromimport数量usevariables形式
1条回答
网友
1楼 · 发布于 2024-04-26 00:54:35

此代码:

from gekko import GEKKO
m = GEKKO(remote=False)
# creates the variables
x = m.sos1([0,2])
z = m.sos1([0,3])
w = m.sos1([0,4])
# use sign2 to define a new variable
y = m.sign2(x)
t = m.sign2(z)
v = m.sign2(w)
# Equation
m.Equation(y+t+v<=2)
m.Equation(x+z+w>=5)
#objective
m.Obj((x+z+w)*-1)
m.solve(disp=False) 

print('Maximize x,z,w')
print('Sum greater than or equal to 5')
print('x,z,w')
print(x.value[0],z.value[0],w.value[0])
print('Sum less than or equal to 2')
print('y,t,v')
print(y.value[0],t.value[0],v.value[0])

给出正确的解决方案:

Maximize x,z,w
Sum greater than or equal to 5
x,z,w
2.0 3.0 0.0
Sum less than or equal to 2
y,t,v
1.0 1.0 0.0

但是,正如您所注意到的,如果计算公差产生的x、z或w略微为负,甚至为-1e-6,则解决方案可能会给出负符号结果。如果您避免开关位置,那么您可能会得到更可靠的解决方案。{}通常给出更好的解决方案

from gekko import GEKKO
m = GEKKO(remote=False)
# creates the variables
x = m.sos1([-1e-4,2])
z = m.sos1([-1e-4,3])
w = m.sos1([-1e-4,4])
# use sign2 to define a new variable
y,t,v = m.Array(m.Var,3,lb=0,ub=1)
m.Equation(y==(m.sign3(x)+1)/2)
m.Equation(t==(m.sign3(z)+1)/2)
m.Equation(v==(m.sign3(w)+1)/2)
# Equation
m.Equation(y+t+v<=2)
m.Equation(x+z+w>=5)
#objective
m.Obj((x+z+w)*-1)
m.solve(disp=False) 

print('Maximize x,z,w')
print('Sum greater than or equal to 5')
print('x,z,w')
print(x.value[0],z.value[0],w.value[0])
print('Sum less than or equal to 2')
print('y,t,v')
print(y.value[0],t.value[0],v.value[0])

在这种情况下,两个脚本提供相同的解决方案

相关问题 更多 >