猿问

使用包优化

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



一只斗牛犬
浏览 90回答 2
2回答

慕森王

这可以在没有特殊函数的情况下完成:maximize&nbsp;z z&nbsp;<=&nbsp;f1 z&nbsp;<=&nbsp;f2(这是数学符号,不是 Python/Gekko)。所以你只需要一个额外的变量 z 和两个不等式。这是一个标准公式,因此了解这一点很有好处。这种公式的缺点是我们现在处理约束中的附加非线性函数,而不是目标中的非线性函数。这可能会对性能和可靠性产生影响。一个优点是这可以防止不可微分问题。

慕桂英546537

这是一个简单的示例,其中变量之和必须等于 15。目标是最大化变量的最小值。max min(x1,x2,x3)s.t. x1 + x2 + x3 = 15最大最小或最小最大问题的标准方法是用附加变量重新表述问题Z。 max Z s.t. x1 + x2 + x3 = 15      Z <= x1      Z <= x2      Z <= x3这是maximinGekko 中重新表述的问题。from gekko import GEKKOm = GEKKO(remote=False)m.options.SOLVER = 1x1,x2,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.0x2:  5.0x3:  5.0Z:   5.0我已在您的原始问题中添加了一些缺少的常量(默认值=1)以获得成功的解决方案。from gekko import GEKKOm = GEKKO(remote=True)alpha = m.Var(0,lb=0,ub=1)Ps    = m.Var(5,lb=0,ub=10)Pr    = m.Var(0,lb=0,ub=10)PP    = m.Var(5,lb=0,ub=10)PD=4; to=0.1; NP=20; grp=1; gpp=1; Nr = 1; gsr=1; gpr=1; gss=1; grs=1; Ns=1m.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))这给出了解决方案:ResultsPs: [10.0]Pr: [10.0]alpha: [1.0]要解决 maximin 问题,可以添加Z变量from gekko import GEKKOm = GEKKO(remote=True)alpha = m.Var(0,lb=0,ub=1)Ps    = m.Var(5,lb=0,ub=10)Pr    = m.Var(0,lb=0,ub=10)PP    = m.Var(5,lb=0,ub=10)PD=4; to=0.1; NP=20; grp=1; gpp=1; Nr = 1; gsr=1; gpr=1; gss=1; grs=1; Ns=1m.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))# 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_FDF1和的最小值的解决方案Func_FDF2。ResultsPs: [10.0]Pr: [10.0]alpha: [0.63999999961]
随时随地看视频慕课网APP

相关分类

Python
我要回答