оптимизация с использованием пакета

#python #optimization #scipy #gekko

#python #оптимизация #scipy #gekko

Вопрос:

Я впервые использую gekko и хочу знать, есть ли какое-либо решение для решения задачи оптимизации max min с помощью gekko max(min (function1, function2)). Я нашел только функцию максимизации и минимизации. В противном случае есть ли какой-либо другой решатель или решение python с использованием scipy или другого для решения проблемы оптимизации в python?

Ответ №1:

Это можно сделать без специальной функции:

 maximize z
z <= f1
z <= f2 
  

(это математическая нотация, а не Python / Gekko).

Итак, вам просто нужна дополнительная переменная z и два неравенства. Это стандартная формулировка, поэтому полезно знать об этом.

Недостатком этой формулировки является то, что теперь мы имеем дело с дополнительными нелинейными функциями в ограничениях, а не в цели. Это может повлиять на производительность и надежность. Преимущество заключается в том, что это может предотвратить проблему недифференцируемости.

Комментарии:

1. Большое спасибо за ваш ответ. вы имеете в виду : m.Equation(z <= Func_FDF2) m.Equation(z <= Func_FDF1) m.Maximize(z)

Ответ №2:

Вот простой пример, в котором сумма переменных должна быть равна 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
  

Вот переформулированная maximin проблема в Gekko.

 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]
  

Комментарии:

1. Большое спасибо, я задал новый вопрос о доступности базы журналов 2 с помощью gekko