使用包优化
optimization using package
我是第一次使用gekko,我想知道是否有任何解决方案可以解决gekko max( min (function1, function2)) 的最大最小优化问题。我发现只有最大化和最小化功能。否则是否有任何其他 python 求解器或解决方案使用 scipy 或其他用于 python 中的优化问题?
这可以在没有特殊功能的情况下完成:
maximize z
z <= f1
z <= f2
(这是数学符号,不是Python/Gekko)。
所以你只需要一个额外的变量 z 和两个不等式。这是一个标准公式,所以很高兴知道这一点。
这个公式的一个缺点是我们现在在约束中处理额外的 non-linear 函数,而不是在 objective 中。这会对性能和可靠性产生影响。一个优点是这可以防止 non-differentiability 问题。
这是一个简单的例子,其中变量的总和必须等于15。objective是最大化变量的最小值。
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,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]
要解决最大最小问题,可以添加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]
我是第一次使用gekko,我想知道是否有任何解决方案可以解决gekko max( min (function1, function2)) 的最大最小优化问题。我发现只有最大化和最小化功能。否则是否有任何其他 python 求解器或解决方案使用 scipy 或其他用于 python 中的优化问题?
这可以在没有特殊功能的情况下完成:
maximize z
z <= f1
z <= f2
(这是数学符号,不是Python/Gekko)。
所以你只需要一个额外的变量 z 和两个不等式。这是一个标准公式,所以很高兴知道这一点。
这个公式的一个缺点是我们现在在约束中处理额外的 non-linear 函数,而不是在 objective 中。这会对性能和可靠性产生影响。一个优点是这可以防止 non-differentiability 问题。
这是一个简单的例子,其中变量的总和必须等于15。objective是最大化变量的最小值。
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,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]
要解决最大最小问题,可以添加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]