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

使用包进行优化

如何解决使用包进行优化

我第一次使用gekko,我想知道是否有任何解决方案可以解决gekko max(min(function1,function2))的max min优化问题。我发现只有最大化和最小化功能。否则,还有其他使用scipy或其他方法解决python优化问题的python解决方案或解决方案吗?

解决方法

这可以在没有特殊功能的情况下完成:

maximize z
z <= f1
z <= f2 

(这是数学符号,不是Python / Gekko)。

因此,您只需要一个附加变量z和两个不等式。这是标准配方,因此很高兴知道这一点。

这种表述的一个缺点是我们现在在约束中而不是在目标中处理附加的非线性函数。这可能会影响性能和可靠性。这样做的好处是可以防止出现不可微问题。

,

这是一个简单的示例,其中变量的总和必须等于15。目标是最大化变量的最小值。

max min(x1,x2,x3)
s.t. x1 + x2 + x3 = 15

maximin or minimax problems的标准方法是使用附加变量Z重新构造问题。

 max Z
 s.t. x1 + x2 + x3 = 15
      Z <= x1
      Z <= x2
      Z <= x3

这是Gekko中重新制定的maximin问题。

from gekko import GEKKO
m = GEKKO(remote=False)
m.options.SOLVER = 1
x1,x3,Z = m.Array(m.Var,4)
m.Maximize(Z)
m.Equation(x1+x2+x3==15)
m.Equations([Z<=x1,Z<=x2,Z<=x3])
m.solve()
print('x1: ',x1.value[0])
print('x2: ',x2.value[0])
print('x3: ',x3.value[0])
print('Z:  ',Z.value[0])

这给出了解决方案:

x1:  5.0
x2:  5.0
x3:  5.0
Z:   5.0

我已经为您的原始问题添加了一些缺失的常量(默认值= 1),以获得成功的解决方案。

from gekko import GEKKO
m = GEKKO(remote=True)

alpha = m.Var(0,lb=0,ub=1)
Ps    = m.Var(5,ub=10)
Pr    = m.Var(0,ub=10)
PP    = m.Var(5,ub=10)

PD=4; to=0.1; NP=20; grp=1; gpp=1; Nr = 1; gsr=1; gpr=1; gss=1; grs=1; Ns=1
m.Equation(grp*Pr>=(gpp*PP/((1+(gpp*PP/NP))**(1-to)-1))-NP)

def FDF1(alpha,Ps):
    return (gsr*(1-alpha)*Ps)/(gpr*Pp+Nr)

def FDF2(alpha,Ps,Pr):
    return (gss*Ps+grs*Pr+2*(np.sqrt(grs*gss*alpha*PP*Pr)))/(Ns)
Func_FDF1 = 1/2*m.log((gsr*(1-alpha)*Ps)/gpr*PP+Nr)
Func_FDF2 = 1/2*m.log(1+(gss*Ps+grs*Pr+2*(m.sqrt(grs*gss*alpha*PP*Pr)))/(Ns))
m.Maximize(Func_FDF2) #===> min(Func_FDF1,Func_FDF2)
m.solve()

print('')
print('Results')
print('Ps: ' + str(Ps.value))
print('Pr: ' + str(Pr.value))
print('alpha: ' + str(alpha.value))

这提供了解决方案:

Results
Ps: [10.0]
Pr: [10.0]
alpha: [1.0]

要解决极大值问题,可以添加Z变量

from gekko import GEKKO
m = GEKKO(remote=True)

alpha = m.Var(0,Pr):
    return (gss*Ps+grs*Pr+2*(np.sqrt(grs*gss*alpha*PP*Pr)))/(Ns)
Func_FDF1 = 1/2*m.log((gsr*(1-alpha)*Ps)/gpr*PP+Nr)
Func_FDF2 = 1/2*m.log(1+(gss*Ps+grs*Pr+2*(m.sqrt(grs*gss*alpha*PP*Pr)))/(Ns))

# max min(Func_FDF1,Func_FDF2)
Z = m.Var()
m.Maximize(Z)
m.Equation(Z<=Func_FDF1)
m.Equation(Z<=Func_FDF2)
m.solve()

print('')
print('Results')
print('Ps: ' + str(Ps.value))
print('Pr: ' + str(Pr.value))
print('alpha: ' + str(alpha.value))

现在,这提供了使Func_FDF1Func_FDF2的最小值最大化的解决方案。

Results
Ps: [10.0]
Pr: [10.0]
alpha: [0.63999999961]

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