pytorch调试记录

23 阅读3分钟

rl:

2024/3/27

state的问题:

image.png

image.png 处理办法: 首先state是个元组 image.png

image.png

state 与next_state 的一些问题

Traceback (most recent call last):
File "C:\Users\xiaol.conda\envs\gym\Lib\site-packages\gym\envs\ShipEnv\DQN-on-ship.py", line 156, in b_s, b_a, b_r, b_ns, b_d = replay_buffer.sample(batch_size) File "C:\Users\xiaol.conda\envs\gym\Lib\site-packages\gym\envs\ShipEnv\DQN-on-ship.py", line 37, in sample return np.array(state), action, reward, np.array(next_state), done ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (64,) + inhomogeneous part.

  • 分析
    image.png

神经网络的多输入和输出

  • 假如输入都是一维的,那么坐标轴就只有一个。

3/28练结果:一共训练了500回合

image.png

image.png

image.png

训练的问题:

1,奖励设置:把碰撞的奖励设置为100。
2.每个回合usv的位置应该是随机重置,而不是在一个重复的点上。
3,状态空间太大,不容易收敛。
4.取消掉障碍物,把障碍物的位置,设定为岛的位置。
5,要增大探索值

## 奖励函数的设计逻辑为:
出发到回到目标点,没有遇到碰撞,加10分
碰撞到了,撞击敌方无人艇+100分
巡逻的过程中,不断的接近目标点+1分,远离-1分
TODO:
1.跟随敌方无人艇,直到驱逐出边界
2.多个usv形成围捕的局面。

强化学习绘图:

image.png

3/28号实验 1

image.png
此时实验显示usv并没有收敛,return发散震荡,训练的时间越来越长 这时候小船总是在原地旋转,守株待兔,在某个蓝色船只的必经之路上等待,要么原地旋转,要么pass而不采取动作。

  • 解决方案,增加探索率。
  • 实验结果:

image.png

image.png

长时间的在原地旋转,应该给一个时间上的惩罚机制,比如多少秒或者回合还在原地,就给予惩罚,或者,给一点好奇心的奖励。
小船容易转圈:
1.探索率不足,直接增大探索率的值。
2.

3/28号实验2

Iteration 4-7的收敛时间变长是因为小船一直在原地打转。
奖励函数的设置没有设置渐进奖励。比如说,小船离蓝色越远就增加或者说减少

image.png

image.png

3/28实验3

先将epsiode设置为1,然后随着回合数的变化来逐渐降低。
`eps = 0.5 * 1 / (1 + episode)`


一个程序设计上的问题,当发生碰撞后,船的位置不是随机生成在地图的任意点位。

image.png

3/29

- 训练时间太长

Snipaste_2024-03-31_20-23-13.png

3/30

将状态空间改为512*512,奖赏函数为
self._handle_collisions()  
if self.state == STATE_IN_DESTINATION:  
reward = 0.  
elif self.state == STATE_COLLISION:  
reward = 100.  
elif self.state == STATE_IN_SAILING:  
self.dist = math.sqrt(((np.array(self.dest_center) - np.array(self.my_ship.rect.center)) ** 2).sum())  
if self.old_dist > self.dist:  
reward = 0.  
else:  
reward = 0.  
self.old_dist = self.dist  
# 再增加一种距离状态  
elif self.state == STATE_IN_SAILING:  
self.dist0 = math.sqrt(((np.array(self.other_ship.rect.center) - np.array(self.my_ship.rect.center)) ** 2).sum())  
if self.old_dist0 > self.dist0:  
reward = +5.  
else:  
reward = -10.  
self.old_dist0 = self.dist0
敌方潜艇为一对多。
  • 忘记更改地图512*512 Snipaste_2024-03-31_16-32-13.png

    4/1

image.png

image.png

image.png

image.png

image.png - 结果,刚开始进行的很快,然后由于放进去经验回放池里面的数据的连续性被打乱了,所以就会进行的越来越慢

# 4/2
训练的有慢,基本上收敛了


image.png

image.png

image.png

image.png

image.png