有没有办法同时优化时间和路径?

Posted

技术标签:

【中文标题】有没有办法同时优化时间和路径?【英文标题】:Is there any way to optimize time and path simultaneously? 【发布时间】:2021-11-08 16:11:50 【问题描述】:

我对时间和路径优化有疑问。我无法同时为时间和路径定义两个目标。 Python 读取最后一个目标并根据该方式给出结果。 你能帮我解决这个优化问题吗?谢谢..

import matplotlib.pyplot as plt
from gekko import GEKKO

# Gekko model
m = GEKKO(remote=False)

# Time points
nt = 501                    # nt=101
tm = np.linspace(0, 1, nt)  # tm = np.linspace(0, 100, nt)
m.time = tm

# Variables
g = m.Const(value=9.80665)
V = m.Const(value=200)  # velocity

Xi = m.Var(value=0, lb=-2*np.pi, ub=2*np.pi)       # Heading angle  value=-np.pi dene
x = m.Var(value=0, lb=-100000, ub=100000)      # x position
y = m.Var(value=0, lb=-100000, ub=100000)      # y position

pathx = m.Const(value=70000)  # intended distance in x direction
pathy = m.Const(value=20000)  # intended distance in y direction

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

m.options.MAX_ITER = 1000000  # iteration number

# Optimize Final Time
tf = m.FV(value=1.0, lb=0.0001, ub=1000.0)
tf.STATUS = 1

# Controlled parameters
Mu = m.MV(value=0, lb=-1, ub=1)  # solver controls bank angle
Mu.STATUS = 1
Mu.DCOST = 1e-3

# Equations
m.Equation(x.dt() == tf * (V * (m.cos(Xi))))  
m.Equation(y.dt() == tf * (V * (m.sin(Xi))))  
m.Equation(Xi.dt() == tf * (g * m.tan(Mu)) / V )

# Objective Function
w = 1e4
m.Minimize(w * (x * final - pathx) ** 2)  # 1D part (x)
m.Minimize(w * (pathy - y * final) ** 2)  # 2D part (y)

m.Obj(tf)
'''

【问题讨论】:

这是一个对高空长航时飞机进行3D路径优化的应用程序:github.com/BYU-PRISM/hale-trajectory我也会对你的应用程序提出一些建议。 【参考方案1】:

在 Gekko 中将多个目标合并为一个带有求和的目标。如果有多个单独的目标应该单独考虑,那么帕累托前沿是评估权衡的一种可能方法(参见Optimization book 的Section 6.5)。但是,这在 Gekko 中没有实现。

一个正确的方法是 m.Equation(y * final <= pathy ) 应该是 m.Equation((y-pathy) * final <= 0) 以避免在 pathy<0 时出现潜在的不可行解决方案。

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

# Gekko model
m = GEKKO(remote=False)

# Time points
nt = 51                    # nt=101
tm = np.linspace(0, 1, nt)  # tm = np.linspace(0, 100, nt)
m.time = tm

# Variables
g = m.Const(value=9.80665)
V = m.Const(value=200)  # velocity

Xi = m.Var(value=0, lb=-2*np.pi, ub=2*np.pi)       # Heading angle  value=-np.pi dene
x = m.Var(value=0, lb=-100000, ub=100000)      # x position
y = m.Var(value=0, lb=-100000, ub=100000)      # y position

pathx = m.Const(value=70000)  # intended distance in x direction
pathy = m.Const(value=20000)  # intended distance in y direction

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

m.options.MAX_ITER = 1000000  # iteration number

# Optimize Final Time
tf = m.FV(value=1.0, lb=0.0001, ub=1000.0)
tf.STATUS = 1

# Controlled parameters
Mu = m.MV(value=0, lb=-1, ub=1)  # solver controls bank angle
Mu.STATUS = 1
Mu.DCOST = 1e-3

# Equations
m.Equation(x.dt() == tf * (V * (m.cos(Xi))))  
m.Equation(y.dt() == tf * (V * (m.sin(Xi))))  
m.Equation(Xi.dt() == tf * (g * m.tan(Mu)) / V )

m.Equation((x-pathx) * final <= 0)
m.Equation((y-pathy) * final <= 0)

# Objective Function
w = 1e4
m.Minimize(w * (x * final - pathx) ** 2)  # 1D part (x)
m.Minimize(w * (y * final - pathy) ** 2)  # 2D part (y)

#in here python reads the last objective how can i run this two objectives simultaneously.
#m.Obj(Xi * final) 
m.Minimize(tf)

#m.Maximize(0.2 * mass * final)  # objective function
m.options.IMODE = 6
#m.options.NODES = 2
#m.options.MV_TYPE = 1
#m.options.SOLVER = 3
# m.open_folder() # to search for infeasibilities
m.solve(disp=False)
print('Final Time: ' + str(tf.value[0]))
tm = np.linspace(0,tf.value[0],nt)
#tm = tm * tf.value[0]

fig, axs = plt.subplots(3)
fig.suptitle('Results')
axs[0].plot(tm, Mu.value, 'b-', lw=2, label=r'$Bank$')
axs[0].legend(loc='best')
axs[1].plot(tm, x.value, 'r--', lw=2, label=r'$x$')
axs[1].legend(loc='best')
axs[2].plot(tm, y.value, 'p-', lw=2, label=r'$y$')
axs[2].legend(loc='best')
plt.xlabel('Time')
#plt.ylabel('Value')
plt.show()


plt.figure()
plt.plot(x.value, y.value)
plt.show()

【讨论】:

以上是关于有没有办法同时优化时间和路径?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法让云端发送单个资源和任何路径/路由的默认根对象?

有没有办法在后面的代码中解析 UWP 中的矢量路径几何?

有没有办法将完整路径名转换为条形图中标签的类名

有没有办法删除 kohana 在电子邮件中设置的返回路径?

有没有办法隐藏或编码 url 路径?

有没有办法使用 sendmail 更改默认返回路径?