为了账号安全,请及时绑定邮箱和手机立即绑定

使用包优化

使用包优化

一只斗牛犬 2024-01-16 15:03:07
我是第一次使用 gekko,我想知道是否有任何解决方案可以用 gekko max( min (function1, function2)) 解决 max min 优化问题。我发现只有最大化和最小化功能。否则是否有任何其他 python 求解器或解决方案使用 scipy 或其他用于 python 中的优化问题?
查看完整描述

2 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

这可以在没有特殊函数的情况下完成:

maximize z
z <= f1
z <= f2

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

所以你只需要一个额外的变量 z 和两个不等式。这是一个标准公式,因此了解这一点很有好处。

这种公式的缺点是我们现在处理约束中的附加非线性函数,而不是目标中的非线性函数。这可能会对性能和可靠性产生影响。一个优点是这可以防止不可微分问题。


查看完整回答
反对 回复 2024-01-16
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

这是一个简单的示例,其中变量之和必须等于 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 GEKKO

m = GEKKO(remote=False)

m.options.SOLVER = 1

x1,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.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,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=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]

要解决 maximin 问题,可以添加Z变量


from gekko import GEKKO

m = 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=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))


# 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。


Results

Ps: [10.0]

Pr: [10.0]

alpha: [0.63999999961]


查看完整回答
反对 回复 2024-01-16
  • 2 回答
  • 0 关注
  • 40 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信