【Ray使用环境】 自己试运行
【Ray版本和类库】 目前已知在python 3.7,ray 2.7.2会出现此问题,不确定在其他版本是否有类似问题
【使用现场】
下面的代码由ray官网的例子修改而来,原代码见https://github.com/ray-project/ray/blob/master/rllib/examples/multi_agent_independent_learning.py
from ray.tune.registry import register_env
from ray.rllib.algorithms.ppo import PPOConfig
from ray.rllib.env.wrappers.pettingzoo_env import PettingZooEnv
from pettingzoo.sisl import waterworld_v4
from pprint import pprint
if __name__ == "__main__":
def env_creator(args):
return PettingZooEnv(waterworld_v4.env())
env = env_creator({})
register_env("waterworld", env_creator)
config = (
PPOConfig()
.environment("waterworld")
.resources(num_gpus=1)
.rollouts(num_rollout_workers=2)
.multi_agent(
policies={"policy_" + str(i) for i in range(len(env.get_agent_ids()))},
)
)
algo = config.build()
for i in range(100):
print("setting policy to " + str(i % 2))
def policy_mapping_fn(agent_id, *args, **kwargs):
return "policy_" + str(i % 2)
algo.workers.foreach_worker(lambda w: w.set_policy_mapping_fn(policy_mapping_fn))
print(i)
pprint(algo.train())
【问题复现】
以上代码预期实现的效果是,当i为偶数时,环境中所有的agent都使用policy_0,i为奇数时,环境中所有的agent都使用policy_1
但实际上,当i=1时,algo.train()的结果中,既包含了policy_1的相关信息,也包含了policy_0的相关信息
因此我也无法确定,当i=1时,调用algo.train()后究竟哪个policy被训练了,训练时使用的是哪个policy生成的数据。
我之前有尝试过另一种写法:
我自定义了一个新的Algo类,继承自ray.rllib.algorithms.ppo.PPO,并修改了它的training_step函数,在这个函数中实现了类似的set_policy_mapping_fn的操作
但是结果类似