OpenAI 多智能体强化学习环境(multiagent-particle-envs)详解
<p><span style="font-family: "times new roman", times; font-size: 14pt"><span style="color: rgba(255, 0, 0, 1)">multiagent-particle-envs</span>是<span style="color: rgba(255, 0, 0, 1); font-family: "times new roman", times">OpenAI</span>开源的多智能体学习环境。</span></p><hr>
<h1>一、安装 </h1>
<p><span style="font-family: "times new roman", times; font-size: 18px"><strong>Link:<span class="invisible">https://<span class="visible">github.com/openai/multi<span class="invisible">agent-particle-envs</span></span></span></strong></span></p>
<div>
<div>
<p><span style="font-family: "Microsoft YaHei"; font-size: 18px">简称小球环境,也是MADDPG用的环境,基本上可以看做是较为复杂的 gridworld 的环境。 在这个环境涵盖了ma里的<strong>竞争/协作/通讯</strong>场景,你可以根据你的需要设置agent的数量,选择他们要完成的任务,比如合作进行相互抓捕,碰撞等,你也可以继承某一个环境来改写自己的任务。状态信息主要包括智能体的坐标/方向/速度等,这些小球的的原始动作空间是<strong>连续型</strong>的,不过在类属性里有个可以<strong>强制进行离散</strong>的设置,可以把它打开以后小球的动作就可以被离散为几个方向的移动了。此外,在这个环境中,小球之间的碰撞都都是模拟刚体的实际碰撞,通过计算动量,受力等来计算速度和位移。(以上内容摘自:https://www.zhihu.com/question/332942236/answer/1295507780,作者:咸鱼天,来源:知乎)。</span></p>
</div>
<span style="font-family: "Microsoft YaHei"; font-size: 18px">OpenAI官方的环境,需要依赖gym 0.10.5。</span></div>
<div><span style="font-family: "Microsoft YaHei"; font-size: 18px">如果不想使用,可以使用我的修改版本,对gym版本没有限制,并且在安装后可以直接导入make_env创建环境。参考百度飞桨开源的强化学习框架Parl为环境增加了obs_shape_n和act_shape_n属性,可以直接输出观测和动作维数。</span><br><span style="font-family: "times new roman", times; font-size: 18px"><strong>Link:https://github.com/gingkg/multiagent-particle-envs</strong></span><br><br><span style="font-family: "Microsoft YaHei"; font-size: 18px">安装:</span></div>
<div><span style="font-family: "Microsoft YaHei"; font-size: 18px">1、下载文件</span></div>
<div><span style="font-family: "Microsoft YaHei"; font-size: 18px">2、cd <span class="invisible"><span class="visible">multi<span class="invisible">agent-particle-envs</span></span></span></span></div>
<div><span style="font-family: "Microsoft YaHei"; font-size: 18px">3、pip install -e .</span></div>
<div><span style="font-family: "Microsoft YaHei"; font-size: 18px">即可。</span></div>
<div><span style="font-family: 楷体; font-size: 18px"> </span></div>
<div><hr></div>
<h1> </h1>
<h1>二、simple_world_comm环境详解</h1>
<div><span style="font-family: "Microsoft YaHei"; font-size: 18px">multiagent-particle-envs基于gym开发,所以环境创建流程基本于gym一致。multiagent-particle-envs包含9个环境,分别为simple、simple_adversary、simple_crypto、simple_push、simple_reference、simple_speaker_listener、simple_spread、simple_tag、simple_world_comm。其中simple环境仅作验证环境是否安装成功的测试使用,其余环境的介绍可以自行查看文档。</span></div>
<div><span style="font-family: "Microsoft YaHei"; font-size: 18px"> </span></div>
<div><span style="font-family: "Microsoft YaHei"; font-size: 18px">下面就simple_world_comm环境进行详细介绍。</span></div>
<div><span style="font-family: 楷体; font-size: 18px"> </span></div>
<div><span style="font-family: 楷体; font-size: 18px"><img src="https://img2020.cnblogs.com/blog/1342806/202012/1342806-20201230103013403-1016698144.png"></span></div>
<div><span style="font-family: 楷体; font-size: 18px"> </span></div>
<div><span style="font-family: "Microsoft YaHei"; font-size: 18px">simple_world_comm环境下,包含6个智能体(agent),2个食物(food)、2个树林(forests)和1个地标(landmarks)。6个智能体中有4个捕食者(adversaries)和2个被捕食者(good_agents)。4个捕食者中有1个领导者(leader)。所有智能体、食物、树林和地标统称实体(entity)。所有食物、树林和地标又统称地标(landmarks)。</span><br>
<h2><span style="font-family: 楷体; font-size: 18px">1、各类实体属性:</span></h2>
</div>
<div><span style="font-family: "Microsoft YaHei"; font-size: 18px">捕食者:刚体,可移动,最大速度1(默认),加速度缩放系数3(默认,疑似),速度阻尼0.25,红色,其中领导者颜色较深一点,</span></div>
<div><span style="font-family: "Microsoft YaHei"; font-size: 18px">被捕食者:刚体,可移动,最大速度1.3(默认),加速度缩放系数4(默认,疑似),速度阻尼0.25,小绿色</span></div>
<div><span style="font-family: "Microsoft YaHei"; font-size: 18px">食物:刚体,不可移动,蓝色</span></div>
<div><span style="font-family: "Microsoft YaHei"; font-size: 18px">树林:非刚体,不可移动,大绿色</span></div>
<div><span style="font-family: "Microsoft YaHei"; font-size: 18px">地标:刚体,不可移动,黑色</span></div>
<h2><span style="font-family: 楷体; font-size: 18px">2、实体任务:</span></h2>
<div><span style="font-family: "Microsoft YaHei"; font-size: 18px">捕食者 :协同队友,阻拦被捕食者靠近食物。</span>
<p><span style="font-family: "Microsoft YaHei"; font-size: 18px">被捕食者 :在捕食者的拦截下,利用森林及障碍物来尽可能的靠近食物。</span></p>
<p><span style="font-family: "Microsoft YaHei"; font-size: 18px">食物 :被捕食者的目标,靠近可获得奖励,奖励大小与靠近的距离有关。</span></p>
<p><span style="font-family: "Microsoft YaHei"; font-size: 18px">树林 :可以对进入自身内部的智能体提供掩护,敌方无法获取单位的位置坐标,除非两个智能体位于同一个树林</span></p>
<p><span style="font-family: "Microsoft YaHei"; font-size: 18px">地标 :不可通过的阻碍物。</span></p>
<h2><span style="font-family: 楷体; font-size: 18px">3、需训练的智能体:</span></h2>
<p><span style="font-family: "Microsoft YaHei"; font-size: 18px">被捕食者 :2个,通过靠近食物来获取奖励,速度较快,数量较少。</span></p>
<p><span style="font-family: "Microsoft YaHei"; font-size: 18px">捕食者:4个,需要有一定协同能力,通过阻碍被捕食者获取奖励,速度较慢,但数量较多。</span></p>
<p><span style="font-family: "Microsoft YaHei"; font-size: 18px">原论文中6个智能体分别用MADDPG算法来训练。即训练成本会随着智能体的数量增加,由于交流功能的存在,训练成本和智能体数量并不为线性关系。</span></p>
</div>
<h2><span style="font-family: 楷体; font-size: 18px"> 4、观测状态</span></h2>
<p><span style="font-family: "Microsoft YaHei"; font-size: 18px; color: rgba(0, 0, 0, 1)">见文件:multiagent-particle-envs/multiagent/scenarios/simple_world_comm.py</span></p>
<p><span style="font-family: "Microsoft YaHei"; font-size: 18px; color: rgba(0, 0, 0, 1)">捕食者的观测状态为1*34的向量,具体为自身的速度(x和y两个方向,2)+自身的位置(x和y两个方向,2)+所有地标与自己的相对位置(地标位置-自身位置,10)+其他智能体与自己的相对位置(其他智能体位置-自身位置,10)+被捕食者的速度(4)+自身是否在树林里(2)+交流信息(4),数据格式float32,Box(34,)。非领导者的交流信息直接继承领导者的。</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px">array([ 0. ,0. , -0.81360341,0.31675768,0.25026168<span style="color: rgba(0, 0, 0, 1)">,
</span>-0.12137332,1.26442749, -0.7671077 ,0.90388104, -1.00294841<span style="color: rgba(0, 0, 0, 1)">,
</span>0.70155893, -0.62365125,1.09197528, -0.92503425,1.31906775<span style="color: rgba(0, 0, 0, 1)">,
</span>0.53801265,1.30256252, -0.5290839 ,1.3105693 , -0.16847554<span style="color: rgba(0, 0, 0, 1)">,
</span>1.34816312, -0.82404067,0.61383961, -1.30914401<span style="color: rgba(0, 0, 0, 1)">,0. ,
0. ,0. ,0. , </span>-1. , -1<span style="color: rgba(0, 0, 0, 1)">. ,
0. ,0. ,0. ,0. ])</span></span></pre>
</div>
<div><span style="font-family: "Microsoft YaHei"; font-size: 18px"> </span></div>
<div><span style="font-family: "Microsoft YaHei"; font-size: 18px; color: rgba(0, 0, 0, 1)">被捕食者的观测状态为1*28的向量,具体为自身的速度(x和y两个方向,2)+自身的位置(x和y两个方向,2)+所有地标与自己的相对位置(地标位置-自身位置,10)+其他智能体与自己的相对位置(其他智能体位置-自身位置,10)+其他被捕食者的速度(2)+自身是否在树林里(2),数据格式float32,Box(28,)。</span></div>
<div>
<div class="cnblogs_code">
<pre><span style="font-size: 14px">array([ 0. ,0. , -0.1997638 , -0.99238633, -0.36357793,
1.18777069,0.65058787,0.54203631,0.29004143,0.3061956 ,
0.08771932,0.68549276,0.47813566,0.38410976, -0.61383961,
1.30914401,0.70522814,1.84715666,0.68872291,0.78006011,
0.69672969,1.14066847,0. ,0. , -1. ,
-1. ,0. ,0. ])</span></pre>
</div>
<p><span style="font-family: 楷体; font-size: 18px"> </span></p>
<h2><span style="font-family: 楷体; font-size: 18px">5、动作空间</span></h2>
<p><span style="font-family: "Microsoft YaHei"; font-size: 18px">领导者:MultiDiscrete2,1*9维的向量。第一位无操作,2-5位给定智能体x,y正负方向上的加速度,6-9位为交流信息。</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px">np.array(,dtype=np.float32)</span></pre>
</div>
<p><span style="font-family: "Microsoft YaHei"; font-size: 18px">非领导捕食者:Discrete(5),1*9维的向量。第一位无操作,2-5位给定智能体x,y正负方向上的加速度。</span></p>
</div>
<div>
<div class="cnblogs_code">
<pre><span style="font-size: 14px">np.array(, dtype=np.float32)</span></pre>
</div>
<p><span style="font-family: 楷体; font-size: 18px"> </span></p>
<p><span style="font-family: "Microsoft YaHei"; font-size: 18px">举个例子(无碰撞情况),方便理解,对于领导者初始状态为:</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px">[ 0. 0. 0.286648310.451448 -1.17817321 -1.14371152
0.36545598 -1.0833245-1.062849310.20773417 -0.941551890.4072022
-0.10401275 -1.15910727 -0.19673305 -1.02704632 -0.78517681 -0.25047813
-0.36542734 -1.31392343 -0.07968565 -0.96594893 -0.95037937 -1.2023333
0. 0. 0. 0. -1. -1.
0. 0. 0. 0. ]</span></pre>
</div>
<p><span style="font-family: "Microsoft YaHei"; font-size: 18px">即,速度为(0,0);位置为(0.28664831, 0.451448)。</span></p>
<p><span style="font-family: "Microsoft YaHei"; font-size: 18px">采取的动作为:</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px">np.array(,dtype=np.float32)</span></pre>
</div>
<p><span style="font-family: "Microsoft YaHei"; font-size: 18px">环境默认的周期t=0.1。</span></p>
</div>
<div><span style="font-family: "Microsoft YaHei"; font-size: 18px">下一时刻智能体的速度和位置计算过程如下(以x方向为例,y方向计算过程相同):</span></div>
<div>
<div class="cnblogs_code">
<pre><span style="font-size: 14px"># x方向的加速度
a = 1 - 0
# 乘以比例系数(暂不清楚有何物理意义)
a = a * 3
# 考虑速度阻尼,上一时刻的速度 v= 0
v = v * (1 - 0.25)
# 计算下一时刻的速度,此处有一个系数mass,默认为1(暂不清楚有何物理意义)
v = v + (a/mass) * t
# 判断速度是否大于限定最大速度,如果大于,按最大速度在x,y方向上做分解
# 计算位置
p = p + v*t</span></pre>
</div>
<p><span style="font-family: "Microsoft YaHei"; font-size: 18px"> 下一时刻状态输出为:</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px">[ 3.00000000e-013.00000000e-013.16648308e-014.81448005e-01
-1.20817321e+00 -1.17371152e+003.35455977e-01 -1.11332450e+00
-1.09284931e+001.77734173e-01 -9.71551887e-013.77202198e-01
-1.34012753e-01 -1.18910727e+00 -1.26733049e-01 -1.05704632e+00
-8.15176813e-01 -2.80478133e-01 -3.95427343e-01 -1.34392343e+00
-1.09685649e-01 -9.95948925e-01 -9.70904003e-01 -1.23477175e+00
5.26459117e-082.74805581e-089.47537011e-02 -2.43844654e-02
-1.00000000e+00 -1.00000000e+001.00000000e+001.00000000e+00
1.00000000e+001.00000000e+00]</span></pre>
</div>
</div>
<h2><span style="font-family: 楷体; font-size: 18px"> </span></h2>
<h2><span style="font-family: 楷体; font-size: 18px">6、创建、运行、显示环境的完整代码</span></h2>
<div>
<div class="cnblogs_code">
<pre><span style="font-size: 14px">import time
import numpy as np
import multiagent.make_env as make_env
env = make_env.make_env('simple_world_comm')
obs = env.reset()
print(env.observation_space)
print(env.action_space)
steps = 0
print(steps)
print(obs)
for _ in range(25):
steps += 1
print(steps)
action_n = ,dtype=np.float32),
np.array(, dtype=np.float32),
np.array(, dtype=np.float32),
np.array(, dtype=np.float32),
np.array(, dtype=np.float32),
np.array(, dtype=np.float32)]
next_obs_n, reward_n, done_n, _ = env.step(action_n)
print(next_obs_n)
print(reward_n)
print(done_n)
env.render()
time.sleep(0.1)
if all(done_n):
break
env.close()</span></pre>
</div>
<p><span style="font-family: "Microsoft YaHei"; font-size: 18px"> 需要注意的是,按照环境默认设置,done_n永远为 false,即环境永远不会结束,所以需要自己设定最大循环次数。</span></p>
</div>
<div><span style="font-family: 楷体; font-size: 18px"> </span></div>
<div><span style="font-family: 楷体; font-size: 18px"> </span></div>
<div><span style="font-family: 楷体; font-size: 18px"> </span></div>
<div><span style="font-family: 楷体; font-size: 18px"> </span></div>
<div><span style="font-family: 楷体; font-size: 18px"> </span></div>
<div><span style="font-family: 楷体; font-size: 18px"> </span></div>
<div><span style="font-family: 楷体; font-size: 18px"> </span></div>
<div><span style="font-family: 楷体; font-size: 18px"> </span></div>
<div><span style="font-family: 楷体; font-size: 18px"> </span></div>
<div><span style="font-family: 楷体; font-size: 18px"> </span></div><br><br>
来源:https://www.cnblogs.com/gingkg/p/14209812.html
頁:
[1]