2 回答

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超3個(gè)贊
這可以在沒(méi)有特殊函數(shù)的情況下完成:
maximize z z <= f1 z <= f2
(這是數(shù)學(xué)符號(hào),不是 Python/Gekko)。
所以你只需要一個(gè)額外的變量 z 和兩個(gè)不等式。這是一個(gè)標(biāo)準(zhǔn)公式,因此了解這一點(diǎn)很有好處。
這種公式的缺點(diǎn)是我們現(xiàn)在處理約束中的附加非線性函數(shù),而不是目標(biāo)中的非線性函數(shù)。這可能會(huì)對(duì)性能和可靠性產(chǎn)生影響。一個(gè)優(yōu)點(diǎn)是這可以防止不可微分問(wèn)題。

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個(gè)贊
這是一個(gè)簡(jiǎn)單的示例,其中變量之和必須等于 15。目標(biāo)是最大化變量的最小值。
max min(x1,x2,x3)
s.t. x1 + x2 + x3 = 15
最大最小或最小最大問(wèn)題的標(biāo)準(zhǔn)方法是用附加變量重新表述問(wèn)題Z
。
?max Z
?s.t. x1 + x2 + x3 = 15
? ? ? Z <= x1
? ? ? Z <= x2
? ? ? Z <= x3
這是maximinGekko 中重新表述的問(wèn)題。
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
我已在您的原始問(wèn)題中添加了一些缺少的常量(默認(rèn)值=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 問(wèn)題,可以添加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))
現(xiàn)在給出了最大化Func_FDF1和的最小值的解決方案Func_FDF2。
Results
Ps: [10.0]
Pr: [10.0]
alpha: [0.63999999961]
添加回答
舉報(bào)