math - GEKKO 能否解决 Minimax 最优控制问题?

标签 math optimization minimax gekko

我知道 GEKKO 可以解决极小极大优化问题以及最优控制问题。然而,GEKKO 上是否有一种机制来解决 minimax/maximin 最优控制问题,例如:

Eq1

更具体地说,

Eq2

最佳答案

将 minimax 与最优控制结合起来没有问题。还有关于使用 Jennings example problem 最小化最终时间的信息作为基准最优控制问题。这是一个 Minimax example problem from the APMonitor documentation :

from gekko import GEKKO
m = GEKKO(remote=False)
x1,x2,x3,Z = m.Array(m.Var,4)
m.Minimize(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])

这是 Jennings OCP 解决方案,其中最终时间最小化:

Jennings OCP

import numpy as np
from gekko import GEKKO
import matplotlib.pyplot as plt

m = GEKKO()
nt = 501; tm = np.linspace(0,1,nt); m.time = tm

# Variables
x1 = m.Var(value=np.pi/2.0)
x2 = m.Var(value=4.0)
x3 = m.Var(value=0.0)

p = np.zeros(nt)
p[-1] = 1.0
final = m.Param(value=p)

# FV
tf = m.FV(value=1.0,lb=0.1,ub=100.0)
tf.STATUS = 1

# MV
u = m.MV(value=0,lb=-2,ub=2)
u.STATUS = 1

m.Equation(x1.dt()==u*tf)
m.Equation(x2.dt()==m.cos(x1)*tf)
m.Equation(x3.dt()==m.sin(x1)*tf)

m.Equation(x2*final<=0)
m.Equation(x3*final<=0)

m.Minimize(tf)

m.options.IMODE = 6
m.solve()

print('Final Time: ' + str(tf.value[0]))

tm = tm * tf.value[0]

plt.figure(1)
plt.plot(tm,x1.value,'k-',lw=2,label=r'$x_1$')
plt.plot(tm,x2.value,'b-',lw=2,label=r'$x_2$')
plt.plot(tm,x3.value,'g--',lw=2,label=r'$x_3$')
plt.plot(tm,u.value,'r--',lw=2,label=r'$u$')
plt.legend(loc='best')
plt.xlabel('Time')
plt.ylabel('Value')
plt.show()

结合这两类问题:

Minimax with Jennings OCP

import numpy as np
from gekko import GEKKO
import matplotlib.pyplot as plt

m = GEKKO()

nt = 501
tm = np.linspace(0,1,nt)
m.time = tm

x1 = m.Var(value=np.pi/2.0)
x2 = m.Var(value=4.0)
x3 = m.Var(value=0.0)

p = np.zeros(nt)
p[-1] = 1.0
final = m.Param(value=p)
tf = m.FV(value=1.0,lb=0.1,ub=100.0)
tf.STATUS = 1
m.Minimize(tf)

Z = m.Var()
m.Minimize(Z)
m.Equations([Z>=x1,Z>=x2,Z>=x3])
m.Maximize(x1)
m.Maximize(x2)
m.Maximize(x3)

u = m.MV(value=0,lb=-2,ub=2)
u.STATUS = 1

m.Equation(x1.dt()==u*tf)
m.Equation(x2.dt()==m.cos(x1)*tf)
m.Equation(x3.dt()==m.sin(x1)*tf)

m.Equation(x2*final<=0)
m.Equation(x3*final<=0)

m.options.IMODE = 6
m.solve()

print('Final Time: ' + str(tf.value[0]))

tm = tm * tf.value[0]

plt.figure(1)
plt.plot(tm,x1.value,'k-',lw=2,label=r'$x_1$')
plt.plot(tm,x2.value,'b-',lw=2,label=r'$x_2$')
plt.plot(tm,x3.value,'g--',lw=2,label=r'$x_3$')
plt.plot(tm,u.value,'r--',lw=2,label=r'$u$')
plt.legend(loc='best')
plt.xlabel('Time')
plt.ylabel('Value')
plt.show()

关于math - GEKKO 能否解决 Minimax 最优控制问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74788425/

相关文章:

python - 数据框中多列操作的矢量化解决方案

java - 极小极大井字游戏 : Computer sometimes losing when Player goes first; works otherwise

algorithm - Minimax 算法未按预期工作

algorithm - minimax算法有什么不明白的地方

c - 通过使用 AVX 内在函数重写来提高 math.h 函数的性能

php - 在 PHP 中精确舍入和舍入分数的函数,有更好的方法吗?

haskell - 为什么我的可变链表比不可变变体慢?

java - 生成 '1'位比例可变的随机二进制数

java - 对于大输入,小数扩展程序运行速度非常慢

algorithm - 这个几何函数的名称是什么?