multiagent-particle-envs是OpenAI开源的多智能体学习环境。
被捕食者:在捕食者的拦截下,利用森林及障碍物来尽可能的靠近食物。
食物:被捕食者的目标,靠近可获得奖励,奖励大小与靠近的距离有关。
树林:可以对进入自身内部的智能体提供掩护,敌方无法获取单位的位置坐标,除非两个智能体位于同一个树林
地标:不可通过的阻碍物。
被捕食者:2个,通过靠近食物来获取奖励,速度较快,数量较少。
捕食者:4个,需要有一定协同能力,通过阻碍被捕食者获取奖励,速度较慢,但数量较多。
原论文中6个智能体分别用MADDPG算法来训练。即训练成本会随着智能体的数量增加,由于交流功能的存在,训练成本和智能体数量并不为线性关系。
见文件:multiagent-particle-envs/multiagent/scenarios/simple_world_comm.py
捕食者的观测状态为1*34的向量,具体为自身的速度(x和y两个方向,2)+自身的位置(x和y两个方向,2)+所有地标与自己的相对位置(地标位置-自身位置,10)+其他智能体与自己的相对位置(其他智能体位置-自身位置,10)+被捕食者的速度(4)+自身是否在树林里(2)+交流信息(4),数据格式float32,Box(34,)。非领导者的交流信息直接继承领导者的。
array([0.,0.,-0.81360341,0.31675768,0.25026168,-0.12137332,1.26442749,-0.7671077,0.90388104,-1.00294841,0.70155893,-0.62365125,1.09197528,-0.92503425,1.31906775,0.53801265,1.30256252,-0.5290839,1.3105693,-0.16847554,1.34816312,-0.82404067,0.61383961,-1.30914401,0.,0.,0.,0.,-1.,-1.,0.,0.,0.,0.])被捕食者的观测状态为1*28的向量,具体为自身的速度(x和y两个方向,2)+自身的位置(x和y两个方向,2)+所有地标与自己的相对位置(地标位置-自身位置,10)+其他智能体与自己的相对位置(其他智能体位置-自身位置,10)+其他被捕食者的速度(2)+自身是否在树林里(2),数据格式float32,Box(28,)。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.])
领导者:MultiDiscrete2,1*9维的向量。第一位无操作,2-5位给定智能体x,y正负方向上的加速度,6-9位为交流信息。
np.array([0,1,0,1,0,1,1,1,1],dtype=np.float32)非领导捕食者:Discrete(5),1*9维的向量。第一位无操作,2-5位给定智能体x,y正负方向上的加速度。
np.array([0,1,0,1,0],dtype=np.float32)
举个例子(无碰撞情况),方便理解,对于领导者初始状态为:
[0.0.0.286648310.451448-1.17817321-1.143711520.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.20233330.0.0.0.-1.-1.0.0.0.0.]即,速度为(0,0);位置为(0.28664831,0.451448)。
采取的动作为:
np.array([0,1,0,1,0,1,1,1,1],dtype=np.float32)环境默认的周期t=0.1。
#x方向的加速度a=1-0#乘以比例系数(暂不清楚有何物理意义)a=a*3#考虑速度阻尼,上一时刻的速度v=0v=v*(1-0.25)#计算下一时刻的速度,此处有一个系数mass,默认为1(暂不清楚有何物理意义)v=v+(a/mass)*t#判断速度是否大于限定最大速度,如果大于,按最大速度在x,y方向上做分解#计算位置p=p+v*t