0%

使用PPO设计线性系统控制器

论文《Policy Iteration Adaptive Dynamic Programming Algorithm for Discrete-Time Nonlinear Systems》

这几天读了ADP相关的几篇论文,早期08年-14年都是用Policy Iteration方法进行求解,14-18年,Policy Gradient方法多了起来。

仿真实例

1.线性系统

对于给定的线性系统:\[x_{k+1}=A x_{k}+B u_{k}\]

其中,\(x_{k}=\left[x_{1 k}, x_{2 k}\right]^{T}\)\(u_{k} \in \mathbb{R}^{1}\)

\(A=\left[\begin{array}{cc} 0 & 0.1 \\ 0.3 & -1 \end{array}\right]\)\(B=\left[\begin{array}{c} 0 \\ 0.5 \end{array}\right]\)

初始状态\(x_{0}=[1,-1]^{T}\)

设计PPO控制器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import gym
from stable_baselines3 import PPO
from stable_baselines3.ppo import MlpPolicy
from stable_baselines3.common.cmd_util import make_vec_env
from LinearEnv import LinearEnv
import numpy as np
from utils import compute_loss, plotloss, plotstate, plotaction
import matplotlib.pyplot as plt


# 设置环境
env = make_vec_env(LinearEnv, env_kwargs={'termination': 20, 'initstate': [1.0, -1.0]}, n_envs=1)

## 训练模型
#model = PPO(MlpPolicy, env, verbose=1)
#model.learn(total_timesteps=1000000)
# 保存模型
#model.save("Linear")

## 使用训练好的模型
# 导入模型
model = PPO.load("Linear")
# reset环境
obs = env.reset()
# 保存结果
state_lst = []
state_lst.append(obs.tolist()[0])
reward_lst = []
performance_index = []
action_lst = []
# 使用训练好的模型来控制环境
while(True):
action, _states = model.predict(obs)
obs, rewards, dones, info = env.step(action)
if dones[0]:
break
state_lst.append(obs.tolist()[0])
action_lst.append(action.tolist()[0][0])
reward_lst.append(rewards.tolist()[0])
performance_index.append(compute_loss(reward_lst))
#print("Performance Index", compute_loss(reward_lst), "Next state: ", obs, "rewards: ", rewards, dones, info)

# Plot性能指标
plotloss(performance_index)
# Plot当前状态
plotstate(state_lst)
# Plot动作
plotaction(action_lst)
plt.show()

控制效果:

性能指标在控制到3个timestep后基本收敛,但是控制器输入和状态有一定的波动,查看数据可以发现,不能完全收敛到0.0,而是一直在-0.001-0.001内波动。

训练过程中的经验

  1. 要让它能学到最优值,训练过程中时刻关注ep_rew_mean之类的参数,看它是不是在一直变小,如果不是,那么环境可能有问题。
  2. 训练效果和total_timesteps有很大的关系,在训练效果不好的情况下且ep_rew_mean不断变小的情况下可以考虑增加total_timesteps的大小。
  3. 对于控制问题来说,设置终止条件很重要,比如一个Episode训练多少步才将done设置为True,像在这个问题中,对于简单的,无时滞的系统来说,比如我想要在10个timesteps内达到控制要求,那么在环境中设置termination为10。
  4. 改变PPO的参数会对控制系统的效果有一定的影响,具体的影响需要进一步测试。
  5. 如何增加控制器输入变化的限制?控制器输入的限制可以直接通过训练的时候设置action_space的大小来限制,但是控制器输入变化\(\Delta u\)如何来进行限制?
  6. 对于线性系统来说,初始状态的选取,对于控制器的控制效果没有影响,例如我用初始状态为\(x_{0}=[1,-1]^{T}\)的环境进行训练后得到的模型,当使用训练好后的模型进行控制的时候,即使你改变初始状态,不影响控制效果。
If you like my blog, please donate for me.