一、待解决问题
1.1 问题描述
由于学习MAPPO算法需要一个多智能体仿真环境,恰好算法示例中采用的是MPE环境,于是以MPE作为经典多智能体环境进行算法的实践训练。
1.2 解决方法
(1)找到github源码
(2)了解MPE环境架构
(3)子环境概述
(4)环境如何应用?
(5)MPE基础知识
(6)典型子环境学习
二、方法详述
2.1 必要说明
暂无
2.2 应用步骤
2.2.1 找到github源码
源码链接:https://github.com/openai/multiagent-particle-envs
多粒子环境 (MPE) 是一组面向通信的环境,粒子代理可以在其中(有时)移动、通信、相互查看、相互推动以及与固定地标交互。
2.2.2 了解MPE环境架构
先从github上了解MPE大致情况:
其一,一个简单的多智能体粒子世界,具有连续观察和离散动作空间,以及一些基本的模拟物理学。用于论文 Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments。
其二,PettingZoo中提供了这些环境的维护版本,其中包括大量修复、综合文档、对通过 pip 安装的支持以及对当前版本的 Python 的支持。
从官方github上了解到MPE的架构大致如下:
-
make_env.py
: 包含将多智能体环境导入为类似OpenAI Gym对象的代码。 -
./multiagent/environment.py
: 包含环境模拟的代码(交互物理、_step()函数等)。 -
./multiagent/core.py
: 包含各种对象(实体、地标、智能体等)的类,这些类在代码中被广泛使用。 -
./multiagent/rendering.py
:用于在屏幕上显示智能体行为。 -
./multiagent/policy.py
:包含基于键盘输入的交互式策略代码。 -
./multiagent/scenario.py
: 包含基础场景对象,该对象被所有场景扩展。 -
./multiagent/scenarios/
: 存储各种场景/环境的文件夹。场景代码包含以下函数:make_world()
: 创建构成世界的实体(地标、智能体等),并分配它们的能力(是否可以通信、移动或两者兼备)。在每次训练会话开始时调用一次。reset_world()
: 通过为世界中的所有实体分配属性(位置、颜色等)来重置世界。在每个剧集之前调用(包括在第一次剧集之前,在make_world()之后)。reward()
: 为给定智能体定义奖励函数。observation()
: 定义给定智能体的观测空间。- (optional)
benchmark_data()
: 为在环境中训练的策略提供诊断数据(例如,评估指标)。
2.2.3 子环境描述
从环境作者说明而言,总共包含9各子环境,后续可根据自身需求选择对应的子环境进行学习。
Env name in code | Communication? | Competitive? | Notes |
---|---|---|---|
simple.py | N | N | 单个智能体看到 landmark 位置,根据它与 landmark 的距离进行奖励。不是多智能体环境 – 用于调试策略。 |
simple_adversary.py (Physical deception) | N | Y | 1 个对手(红色),N 个“好”智能体(绿色),N 个地标(通常 N=2)。所有智能体都会观察地标和其他智能体的位置。一个地标是“目标地标”(绿色)。“好”智能体据其中一个智能体与目标地标的距离进行奖励,但如果对手接近目标地标,则获得负奖励。对手根据它与目标的距离获得奖励,但它不知道哪个地标是目标地标。因此,“好”智能体必须学会“分头行动”并覆盖所有地标以欺骗对手。 |
simple_crypto.py (Covert communication) | Y | Y | 两个“好”智能体(alice 和 bob),一个对手(eve)。Alice 必须通过公共通道向 bob 发送私人消息。Alice 和 bob 根据 bob 重建消息的程度获得奖励,但如果 eve 能够重建消息,则获得负奖励。Alice 和 bob 有一个私钥(在每集开始时随机生成),他们必须学会使用该私钥来加密消息。 |
simple_push.py (Keep-away) | N | Y | 1个智能体,1个对手,1个地标。智能体根据与地标的距离获得奖励。对手如果靠近地标,并且智能体远离地标,就会获得奖励。因此,对手会学会把智能体推开,使其远离地标。 |
simple_reference.py | Y | N | 2个智能体,3个不同颜色的地标。每个智能体想要到达自己的目标地标,而这个目标地标只有另一个智能体知道。奖励是集体的。所以智能体必须学会向对方传达目标,并导航到自己的地标。 |
simple_speaker_listener.py (Cooperative communication) | Y | N | 与simple_reference类似,只是一个是“说话者”(灰色),它不移动(观察到另一个智能体的目标),另一个是“听者”(不能说话,但必须导航到正确的地标)。 |
simple_spread.py (Cooperative navigation) | N | N | N个智能体,N个地标。智能体根据每个地标与任何智能体的距离获得奖励。如果智能体与其他智能体发生碰撞,会被扣分。因此,智能体必须学会覆盖所有地标,同时避免碰撞。 |
simple_tag.py (Predator-prey) | N | Y | 捕食者-猎物环境。好的智能体(绿色)速度更快,想要避免被对手(红色)击中。对手速度较慢,想要击中好的智能体。障碍物(大的黑色圆圈)会挡住去路。 |
simple_world_comm.py | Y | Y | 在论文随附视频中看到的环境。与simple_tag类似,但有以下不同:(1)有食物(小蓝球),好的智能体靠近食物会获得奖励;(2)现在有“森林”,里面的智能体从外面看不到;(3)有一个“领导者对手”,可以随时看到智能体,并与其他对手通信,以帮助协调追捕。 |
从环境类型划分可划分为两类,一是“对抗型”,二是“合作型”,这也是MARL中环境划分的主要两大类,还有“外部对抗+内部合作”,例如两个团队对抗,团队内部进行分工合作。
Env Type | Env Name |
---|---|
Competitive | Simple Adversary, Simple Crypto, Simple Push, Simple Tag, and Simple World Comm |
Cooperative | Simple Reference, Simple Speaker Listener, and Simple Spread |
结合自己研究领域理解;
多星任务分配场景:多颗卫星,一个地面站(可监测多个卫星的状态),多项任务。
约束:{任务-资源需求量—卫星资源量},{任务空间执行约束—高动态卫星轨位姿态}
目标:max{任务完成率or任务可分配率}
分析上述子环境说明后,simple_speaker_listener场景较为相似,总结如下:
simple_speaker_listener场景:一个“listener”智能体,一个“speaker”智能体,3个地标
约束:“speaker”智能体无法移动,“listener”智能体无法说话
目标:min{“listener”智能体与地标距离}
“speaker”智能体相对于地面站,“listener”智能体相当于卫星,地标相当于任务,美中不足的就是没有多星多任务的体现,这个可以与simple_spread场景融合:
simple_spread场景:N个智能体,N个地标。
约束:{智能体行进路径——智能体体积}
目标:min{多智能体与地标距离}
2.2.4 环境如何应用?
从环境作者简单说明而言,主要从三个函数创建环境并应用想测试的MARL算法:
You can create new scenarios by implementing the first 4 functions above (make_world(), reset_world(), reward(), and observation()).
您可以通过实现上述前 4 个函数(make_world()、reset_world()、reward() 和 observation())来创建新场景。
具体而言,后续编程过程中如何应用再详细补充。(待补充)
2.2.5 MPE基础知识
(1)关键概念
① 地标: 地标是环境的静态圆形特征,无法控制。在某些环境(如 Simple)中,它们是影响智能体奖励的目标,具体取决于智能体与智能体之间的距离。在其他环境中,它们可能是阻碍智能体运动的障碍物。每个环境的文档中有更详细的描述。
② 可见性:当一个智能体对另一个智能体可见时,该另一个智能体的观察包含第一个智能体的相对位置(在 Simple World Comm 和 Simple Tag 中,包含第一个智能体的速度)。如果智能体暂时隐藏(仅在 Simple World Comm 中可能),则智能体的位置和速度将设置为零。
③ 通信:某些环境中的某些智能体可以将消息作为其作的一部分进行广播(有关更多详细信息,请参阅动作空间),该消息将传输到允许查看该消息的每个智能体。在 Simple Crypto 中,此消息用于表示 Bob 和 Eve 已重建消息。
④ 颜色:由于所有智能体都呈现为圆圈,因此智能体只能通过其颜色对人类进行识别,因此在大多数环境中都会描述智能体的颜色。智能体不会观察到颜色。
⑤ 距离:地标和智能体通常在地图上从 -1 到 1 均匀随机放置。这意味着它们通常相距约 1-2 个单位。在推理奖励的规模(通常取决于距离)和包含相对和绝对位置的观察空间时,请记住这一点很重要。
(2)终止条件
在执行 max_cycles environment 参数指定的周期数后终止。所有环境的默认值为 25 个周期,与原始 OpenAI 源代码中一样。
(3)观察空间
智能体的观察空间是一个向量,通常包含以下参数;
由智能体的位置和速度、其他智能体的相对位置和速度、智能体的相对位置、智能体和智能体的类型以及从其他智能体接收到的通信组成。
需要注意的是:如果智能体无法看到或观察第二个智能体的通信,则第二个智能体不包含在第一个智能体的观察空间中,从而导致不同的智能体在某些环境中具有不同的观察空间大小。
(4)动作空间
- 离散动作空间:
该动作空间是一个离散的动作空间,代表了一个智能体可以执行的动作和通信组合。可以移动的智能体可以在 4 个基本方向之间做出选择,或者什么都不做。可以通信的智能体可以在 2 到 10 个与环境有关的通信选项中选择一个,向所有能听到信息的智能体广播信息。
- 连续行动空间(由 continuous_actions=True 设置):
行动空间是一个连续的行动空间,代表了一个智能体可以执行的移动和通信。可以移动的智能体可以在四个基本方向中的每一个方向上输入介于 0.0 和 1.0 之间的速度,其中对立的速度(如左和右)会相加。可以进行通信的智能体可以通过它们可以访问的环境中的每个通信通道输出一个连续值。
需要注意的是:直接调用OpenAI 的MPE源码,默认是连续行动空间。而从PettingZoo中调用MPE,默认是离散动作空间。
(5)渲染(可视化)
渲染会在一个窗口中显示场景,如果智能体超出窗口边界,窗口会自动变大。通信会在场景底部渲染。render() 方法还会返回渲染区域的像素图。
2.2.6 典型子环境学习
由于MAPPO算法示例中,采用了simple_reference、simple_spread场景,因此先行学习二者环境。
具体学习参考:PettingZoo Documentation-MPE
(1)simple_reference
此环境有 2 个智能体和 3 个不同颜色的地标。每个智能体都希望更接近他们的目标地标,只有其他智能体知道。两个智能体同时都是讲者
和听者
。
在本地,智能体会根据他们与目标地标的距离获得奖励。在全局范围内,所有智能体都会根据所有智能体到各自地标的平均距离获得奖励。这些奖励的相对权重由 local_ratio
参数控制。
- POMDP建模
Import | from pettingzoo.mpe import simple_reference_v3 |
---|---|
Actions | Discrete/Continuous |
Parallel API | Yes |
Manual Control | No |
Agents | agents= [agent_0, agent_1] |
Agents | 3 |
Action Shape | -5 |
Action Values | Discrete(5)/Box(0.0, 1.0, (5)) |
Observation Shape | (8),(10) |
Observation Values | (-inf,inf) |
State Shape | (28,) |
State Values | (-inf,inf) |
智能体观察空间:[self_vel, all_landmark_rel_positions, landmark_ids, goal_id, communication]
智能体离散作空间:[say_0、say_1、say_2、say_3、say_4、say_5、say_6、say_7、say_8、say_9] X [no_action、move_left、move_right、move_down、move_up]
其中 X 是笛卡尔积(给出总动作空间 50)。
智能体连续作空间:[no_action、move_left、move_right、move_down、move_up、say_0、say_1、say_2、say_3、say_4、say_5、say_6、say_7、say_8、say_9]
- 环境可设置参数
simple_reference_v3.env(local_ratio=0.5, max_cycles=25, continuous_actions=False)
local_ratio
:应用于本地奖励和全局奖励的权重。全局奖励权重始终为 1 - 本地奖励权重。
max_cycles
:游戏结束前的帧数(每个智能体一步)。
continuous_actions
(连续行动):智能体的行动空间是离散的(默认)还是连续的
- 应用框架
由于是多智能体仿真环境,因此在运行仿真是有两套模式:
① AEC(Alternating Environment and Communication):AEC模式是指智能体在环境中交替地进行观察、行动和接收反馈。在这种模式下,智能体一个接一个地与环境交互,每个智能体在自己的回合内根据观察到的状态选择动作,然后环境根据所有智能体的动作更新状态,并返回相应的奖励和观察。
② Parallel:Parallel模式是指所有智能体同时与环境进行交互。在这种模式下,所有智能体在同一时间步进行观察、选择动作,然后环境根据所有智能体的动作同时更新状态,并返回相应的奖励和观察。
两种模式的特点总结如下:
AEC:
智能体按顺序交替行动。
每个智能体在自己的回合内进行观察、决策和行动。
环境在所有智能体都完成行动后更新状态。
Parallel:
所有智能体同时行动。
智能体在同一时间步进行观察、决策和行动。
环境在所有智能体都完成行动后更新状态。
AEC的应用框架:
from pettingzoo.mpe import simple_reference_v3
env = simple_reference_v3.env(render_mode="human")
env.reset(seed=42)
for agent in env.agent_iter():
observation, reward, termination, truncation, info = env.last()
if termination or truncation:
action = None
else:
# this is where you would insert your policy
action = env.action_space(agent).sample()
env.step(action)
env.close()
Parallel的应用框架:
from pettingzoo.mpe import simple_reference_v3
env = simple_reference_v3.parallel_env(render_mode="human")
observations, infos = env.reset()
while env.agents:
# this is where you would insert your policy
actions = {agent: env.action_space(agent).sample() for agent in env.agents}
observations, rewards, terminations, truncations, infos = env.step(actions)
env.close()
需要注意的是:环境仿真的运行必须要加入Policy,action = env.action_space(agent).sample()
这一句意思为“据当前智能体的动作空间随机生成一个合法的动作。这是最简单的策略”,后续可替换为自己要验证的策略,或MARL算法。
(2)simple_spread
该环境有 N 个智能体,N 个地标(默认 N=3)。在高层次上,智能体必须学会在避免碰撞的同时覆盖所有地标。
更具体地说,所有智能体都会根据离每个地标最近的智能体的距离(最小距离之和)获得全局奖励。就局部而言,如果智能体与其他智能体发生碰撞,则会受到惩罚(每次碰撞-1)。这些奖励的相对权重可以通过 local_ratio
参数来控制。
- POMDP建模
Import | from pettingzoo.mpe import simple_spread_v3 |
---|---|
Actions | Discrete/Continuous |
Parallel API | Yes |
Manual Control | No |
Agents | agents= [agent_0, agent_1, agent_2] |
Agents | 3 |
Action Shape | -5 |
Action Values | Discrete(5)/Box(0.0, 1.0, (5)) |
Observation Shape | -18 |
Observation Values | (-inf,inf) |
State Shape | (54,) |
State Values | (-inf,inf) |
智能体观察空间:[self_vel, self_pos, landmark_rel_positions, other_agent_rel_positions, communication]
智能体作空间:[no_action, move_left, move_right, move_down, move_up]
- 环境可设置参数
simple_spread_v3.env(N=3, local_ratio=0.5, max_cycles=25, continuous_actions=False)
N
: 智能体和地标的数量。
local_ratio
:应用于本地奖励和全局奖励的权重。全局奖励权重始终为 {1 - 本地奖励权重}。
max_cycles
:游戏结束前的帧数(每个智能体一步)。
continuous_actions
(连续行动):智能体的行动空间是离散的(默认)还是连续的
- 应用框架
由于是多智能体仿真环境,因此在运行仿真是有两套模式:
AEC的应用框架:
from pettingzoo.mpe import simple_spread_v3
env = simple_spread_v3.env(render_mode="human")
env.reset(seed=42)
for agent in env.agent_iter():
observation, reward, termination, truncation, info = env.last()
if termination or truncation:
action = None
else:
# this is where you would insert your policy
action = env.action_space(agent).sample()
env.step(action)
env.close()
Parallel的应用框架:
from pettingzoo.mpe import simple_spread_v3
env = simple_spread_v3.parallel_env(render_mode="human")
observations, infos = env.reset()
while env.agents:
# this is where you would insert your policy
actions = {agent: env.action_space(agent).sample() for agent in env.agents}
observations, rewards, terminations, truncations, infos = env.step(actions)
env.close()
需要注意的是:环境仿真的运行必须要加入Policy,action = env.action_space(agent).sample()
这一句意思为“据当前智能体的动作空间随机生成一个合法的动作。这是最简单的策略”,后续可替换为自己要验证的策略,或MARL算法。
2.3 实现效果
2.3.1 simple_reference环境仿真效果
重新创建虚拟环境并安装pettingzoo[mpe]环境及依赖项
conda create -n mpe_ptzoo python==3.11.11
conda activate mpe_ptzoo
pip install 'pettingzoo[mpe]'
conda install spyder
将simple_reference
环境中的示例代码保存为simple_reference.py
文件,并编译,出现如下报错
python simple_reference.py
libGL error: MESA-LOADER: failed to open iris: /usr/lib/dri/iris_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/x86_64-linux-gnu/dri:$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
libGL error: failed to load driver: iris
libGL error: MESA-LOADER: failed to open iris: /usr/lib/dri/iris_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/x86_64-linux-gnu/dri:$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
libGL error: failed to load driver: iris
libGL error: MESA-LOADER: failed to open swrast: /usr/lib/dri/swrast_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/x86_64-linux-gnu/dri:$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
libGL error: failed to load driver: swrast
X Error of failed request: BadValue (integer parameter out of range for operation)
Major opcode of failed request: 152 (GLX)
Minor opcode of failed request: 3 (X_GLXCreateContext)
Value in failed request: 0x0
Serial number of failed request: 181
Current serial number in output stream: 182
大模型分析后,判断与 OpenGL 驱动程序相关 ,
那么什么是 OpenGL ?
OpenGL是用于
渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)
。
OpenGL 是一个跨平台
的图形渲染 API,可以在多种操作系统上运行,包括 Windows、Linux 和 macOS。OpenGL 可以运行在各种图形硬件上,并且支持多种编程语言,如C++、Python等。
DirectX 是由 Microsoft 开发的,主要用于Windows 平台
。因此,它是 Windows 游戏开发的首选 API。由于其与 Windows 平台的深度集成,DirectX 在与 Windows 系统的协同工作和性能优化方面可能会更好。
因此,开始安装相关驱动及依赖:
#安装驱动
sudo apt-get install mesa-utils
#设置环境变量
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6
#更新环境变量
source .bashrc
#检查OpenGL驱动安装情况
glxinfo | grep "OpenGL renderer"
前面一切顺利,在运行glxinfo | grep "OpenGL renderer
这一句时,反馈如下,用的是 Intel集成显卡
,后续得改为用GPU进行渲染。
OpenGL renderer string: Mesa Intel® Graphics (RPL-P)
再次运行代码,依旧报错,于是开始分析定位错位来源:
第一句报错,failed to open iris: /usr/lib/dri/iris_dri.so
无法找到相关文件,但我在/usr/lib/x86_64-linux-gnu/dri
下找到了相关文件iris_dri.so
,说明只是路径搜索错误。
同样分析后续报错,failed to open swrast: /usr/lib/dri/swrast_dri.so
,在相同路径也找到了对应文件。
找寻网上解答,可以通过建立软链接(ubuntu命令: ln -s xxx yyy
)解决:
参考链接:【已解决】Python报错:libGL error: MESA-LOADER: failed to open iris
cd /usr/lib
#创建文件夹
sudo mkdir ./dri
#创建iris_dri.so文件软链接
sudo ln -s /usr/lib/x86_64-linux-gnu/dri/iris_dri.so /usr/lib/dri/
#创建swrast_dri.so文件软链接
sudo ln -s /usr/lib/x86_64-linux-gnu/dri/swrast_dri.so /usr/lib/dri/
cd dri
ls
完成后,对应/usr/lib/dri/
路径下就会出现两个文件的软链接了,再次运行代码,依旧报错:
libGL error: MESA-LOADER: failed to open iris: /home/XXXX/anaconda3/envs/mpe_ptzoo/bin/…/lib/libstdc++.so.6: version `GLIBCXX_3.4.30’ not found (required by /lib/x86_64-linux-gnu/libLLVM-15.so.1) (search paths /usr/lib/x86_64-linux-gnu/dri:$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
问题阐述为:在对应路径/home/XXXX/anaconda3/envs/mpe_ptzoo/bin/../lib/libstdc++.so.6
下,没有找到GLIBCXX_3.4.30
。
先行查询一下:
strings /home/XXXX/anaconda3/envs/mpe_ptzoo/lib/libstdc++.so.6 | grep GLIBCXX
好巧不巧,正好没有 GLIBCXX_3.4.30
版本。
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_3.4.26
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_3.4.29
解决方法,更新libstdcxx-ng
包:
#查看libstdcxx-ng版本
conda list | grep libstdcxx-ng
libstdcxx-ng 11.2.0 h1234567_1
#直接通过默认源是无法升级安装libstdcxx-ng的,需要先添加conda-forge源
conda config --add channels conda-forge
#可以执行以下命令来查看下载源
conda config --show channels
conda install libstdcxx-ng=12.1.0
#升级完成之后再查询 GLIBCXX 版本
strings /home/XXXX/anaconda3/envs/mpe_ptzoo/lib/libstdc++.so.6 | grep GLIBCXX
查询后,已安装GLIBCXX_3.4.30
,再运行代码。
由于默认的max_cycles=25
,训练次数较少,可以设置为较高,再运行代码查看渲染效果,即修改一句:
env = simple_reference_v3.env(max_cycles=25000,render_mode="human")
(1)AEC 代码运行效果
(2)Parallel代码运行效果
为什么智能体没有走向地标?
这里由于智能体动作采用的是随即选择的,因此不一定朝着对应颜色的地标进行移动。
为什么地标也在移动?
因为智能体的随机移动,导致可能走向地图边界以外的地方,从而地图边界不断扩大,因此地标的“相对位置”一直在发生改变,实际地图上地标位置是没有改变的。
2.3.2 simple_spread环境仿真效果
(1)AEC 代码运行效果
(2)Parallel 代码运行效果
三、疑问
(1)AEC 与 Parallel 应用模式在效果上为何没有差别?
这个可能是因为agent与环境交互的速度较快,因此看不出交替
与并行
与环境交互的区别,可以手动加一个延时,控制每次env.step()
的时长。
(2)什么是 conda-forge?
conda-forge 是一个由社区驱动的 Conda 包管理系统,提供了一个广泛的、跨平台的软件包集合。它的目标是为用户提供高质量、可持续的开源软件包生态系统,特别是那些可能未被包含在官方 Anaconda 通道中的科学计算和数据分析工具。
(3)为什么要使用 conda-forge?
- 包的来源:conda-forge 是一个独立的通道,与 Anaconda的默认通道(defaults)不同。某些包可能不在默认通道中,或者在 conda-forge 中更新得更频繁。
- 更广泛的包支持:conda-forge 提供了大量科学计算、数据分析和机器学习相关的包,涵盖了从机器学习到生物信息学的各种领域。
- 社区维护:conda-forge 由全球开发者社区维护,任何人都可以贡献新的包或改进现有包。
- 跨平台支持:conda-forge 支持多个操作系统(Windows、macOS 和 Linux),确保用户在不同平台上获得一致的体验。
(4)conda-forge 的隐藏危害。
由于conda-forge源是社区维护的,并不是anaconda官方维护的,好处就是有一些新的包的版本能够在这个源更新,但是由于是未经官方测试的,所以添加该源之后,安装某个程序对导致很多不必要更新的包进行了“捆绑式”更新,因此,安装完后还是记得第一时间删除该源。
#删除源
conda config --remove channels conda-forge
#查看源是否删除
conda config --show channels
gedit ~/.condarc
#测试源是否删除(安装一个仅有conda-forge有的包)
conda install libstdcxx-ng=12.1.0
删除后的源应该只包含以下两项:
channels:
- https://repo.anaconda.com/pkgs/main
- https://repo.anaconda.com/pkgs/r
并且conda install
时,仅仅只有default
源:
Channels:
-defaults
Platform: linux-64
Collecting package metadata (repodata.json): done
…
四、总结
- 该篇介绍了MPE多智能体仿真环境的概况,并以两个典型的
合作型
子环境进行了代码复现; - 从MPE环境了解可得,MARL算法对应用场景的建模大多数都是基于
POMDP
的,因此后续自建环境时需考虑到以下关键因素:
(1) 环境对象(agents、 landmarks)
(2) 通信(全局广播、局部共享)
(3) 全局状态空间
(4) Agent观察空间
(5) 联合动作空间(离散、连续)
(6) 终止条件
(7) 奖励规则
- 从环境自建的角度还是离不开重要的4步,
确定算法框架
,部分可观测马尔可夫建模
,确定计算模型
(most important),设计交互函数
。