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



我正试图通过限制要使用的非零变量的数量来优化这个方程。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值保持为零时,我会将其作为负数返回。

此代码:

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,则该解决方案有可能给出负符号结果。如果你避开交换机的位置,那么你可能会得到一个更可靠的解决方案。sign3通常给出更好的解决方案。

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])

在这种情况下,两个脚本都给出了相同的解决方案。

最新更新