1

强化学习随笔[05]-多智能体协作任务的场景构思和尝试

 2 years ago
source link: https://yerfor.github.io/2019/11/20/drl-05/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

本文主要介绍了:

  • 针对多智能体执行区域搜索任务,基于maddpg算法设计了相应的场景(Scenario)文件的设计,这包括
    • reward设计
  • 展示了程序的训练结果,做了一些思考和展望

1. 问题建模

如何训练智能体完成对某一区域的搜索任务?

一个很直观的想法是将连续的区域离散成均匀分布的点阵(类似围棋棋盘),当智能体经过了该点阵的所有点后,即认为完成了搜索任务。在现实生活中,这种建模方法已经有所应用,比如小区保安的巡逻需要在各个目标点进行打卡。因此认为,只要合理设置点阵中点的相对位置,这个转化是合理的。

我们假设智能体能够探测的区域是一个半径为R的圆,当该圆包含点阵中的位置点时,代表该点已经被探测过。多智能体的目标是通过协作在限定时间内尽可能探测较多的位置点。

于是,问题被转化为,给定一个固定的点阵,训练一组智能体(圆),使其经过尽可能多地经过该点阵中的点。

2. 程序设计

经过测试MADDPG算法在几个sample上的效果还是不错的,我们的工作暂时主要集中在环境场景(Scenario)的设计上。这部分的工作主要分成:

  • reward设计

2.1 环境设计

首先要设计环境,如上文所述,我们希望将待探索区域离散成一个均匀的点阵,考虑到一个智能体的探测半径为R,各个位置点的距离设置成2R应该比较适宜。

将一个正方形区域分成6x6的点阵,这里的”目标点“参考了maddpg项目里landmark的概念,不同之处在于maddpg项目中的landmark是从均匀分布中随机生成的,而我们设定的6x6的点阵是固定设置的。

当某个目标点被智能体经过后,即被认为是“已探测的”(detected),如下图浅色的目标点所示:

zero-demo~1

2.2 reward设计

在上一篇博文里我们介绍了maddpg项目里所有sample的reward设计,掌握了部分reward shaping的思想。reward对强化学习训练的影响,不啻于深度学习中的Loss function,它的设计也是强化学习一个让人觉得难以把握的地方。以下是我针对该问题设计的reward,欢迎探讨。

2.2.1 距离惩罚项

在maddpg项目的simple_spread示例中,达到了分配各智能体占领数量相同的目标点的效果:

simple_spread

其reward如下:

也即对每个Landmark,都有考察离他最近的agent的距离,然后求和取负数,作为惩罚。只有当所有Landmark都有离它很近的agent,reward才会相对比较大。

我们的场景与其不同点在于:第一,我们不希望agent在到达目标点后停留在那里,而是继续探索其他目标点。第二,我们的目标点的数量远远多于agent。

首先解决第一个问题,我们可以创建一个数组储存各个目标点是否被探索过,如果是探索过的目标点,其距离惩罚项不会计入reward的计算中,可以用如下公式表示:

接下来考虑第二个问题,即目标点的数量问题,基于上述公式,我们发现随着Landmarks不断被探索,计入reward的Landmark的数量是不断下降的,这会导致距离惩罚项的值域在一个Episode中不断改变(快速下降)。为了解决这个问题,对该项除以未被探测的Landmark数量,如下:

我们会在最后考虑reward的各项的系数问题,所以这里先不关心上式的量级了。

最后给出距离惩罚项的源代码:

rew = 0
dists_between_agent_and_landmarks = [np.sqrt(np.sum(np.square(agent.state.p_pos - l.state.p_pos))) for l in world.landmarks]
for idx_of_landmark, dist in enumerate(dists_between_agent_and_landmarks):
if dist < agent.size:# 如果目标点位于圆内,代表该点被探测了
self.detected_landmarks_list[idx_of_landmark] = True
for idx, l in enumerate(world.landmarks):
if not self.detected_landmarks_list[idx]:
dists = [np.sqrt(np.sum(np.square(a.state.p_pos - l.state.p_pos))) for a in world.agents]
rew -= np.min(dists) / (
self.num_landmarks - self.detected_landmarks_list[self.detected_landmarks_list].size)

2.2.2 碰撞惩罚项

如果两个智能体的监测区域(圆)重合了,无疑是十分低效率的,而且存在安全问题,所以仿照simple_spread的思想,设定了碰撞惩罚项:

if agent.collide:
for a in world.agents:
if self.is_collision(a, agent):
# if np.sqrt(np.sum(np.square(a.state.p_pos - agent.state.p_pos))) < 0.5 * a.size:
rew -= 1

思想很简单,就是如果两个圆有重合,那么同时惩罚两个人。

之前还想过更复杂的惩罚项,即根据重叠距离返回不同大小的惩罚,但发现这样修改后智能体重叠的现象反而变多了,所以还是直接用上面这种一刀切的方法。

2.2.3 任务完成进度奖励项

如果只有上面的两项,训练出来的模型根据测试会在几个点停留下来,没有探索其他位置点的欲望,于是又设计了根据任务完成进度的奖励项。

之前试过用探测过的目标点的数量作为奖励大小的依据,但是发现这样模型会在拿到一定数量的目标点后就满足了。所以后面考虑了将当前时刻新探测的目标点数量作为奖励的依据,因此引入了上一时刻已探测目标点这个参数。不妨先简单地设定任务完成进度奖励项为:

而且,在不同时刻探测相同数量的目标点的价值是不一样的,在一个新的Episode开始时,智能体随便移动一下都能探测一个目标点,但随着游戏的进行,未被探测的目标点越来越少,这时探测一个新的目标的价值就很高了。基于这一点,引入了“时间”这个维度,期望在上述公式前乘上一项由时间确定的修正参数,该参数需要在t=0时很小,随后逐渐变大。
考虑在深度学习中常用的sigmoid函数:

该函数的曲线为:

sigmoid

根据我们的训练条件(iteration=30)对其做平移和伸缩,如下:

sigmoid_plus

将该项乘上之前的公式,即有:

task-fulfilling-reward

self.num_detected = self.detected_landmarks_list[self.detected_landmarks_list].size
delta_num_detected = self.num_detected - self.previous_num_detected
rew += 3 * sigmoid_plus(self.time) * delta_num_detected

3. 训练结果

将2.2节中设计的reward的三项在实验中进行量级测试后,进行加权求和作为reward。

以下是上述模型的训练结果。

  • 视频demo

    • demo
  • episode-reward变化图

    • reward
  • 统计数据-任务完成情况

episode reward steps_per_epi mean(100%) std(100%)

60w 10.1397 30 0.6708 0.0916

60w 10.1397 60 0.8487 0.0631

60w 10.1397 90 0.8903 0.0633

60w 10.1397 120 0.9119 0.0632

100w 20.0138 30 0.7091 0.0677

100w 20.0138 60 0.9040 0.0525

100w 20.0138 90 0.9381 0.0461

100w 20.0138 120 0.9492 0.0391

4. 总结和思考

强化学习一直都不善于求取问题的最优解,路径规划问题其实使用传统的数学工具可以很容易地求取最优解,采用强化学习的优势我认为包括以下几点:

  • 强化学习的决策随机性更强,更难被预料?
  • 强化学习的框架搭建好后,拓展功能比较方便,如追寻打击移动目标等问题;

但是强化学习解决该问题也存在以下弊端:

  • 黑盒子,想要训练出好的模型需要一定运气

  • 移植性不佳,训练好的模型,随着智能体数量、地图的改变,往往效果会大大下降

下一步研究方向:

  • 在场景里增加敌人
  • 改进reward

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK