from torch import nn from ray.rllib.algorithms.sac import SACConfig from ray.rllib.core.rl_module.default_model_config import DefaultModelConfig from ray.rllib.examples.envs.classes.multi_agent import MultiAgentPendulum from ray.rllib.examples.utils import ( add_rllib_example_script_args, run_rllib_example_script_experiment, ) from ray.rllib.utils.metrics import ( ENV_RUNNER_RESULTS, EPISODE_RETURN_MEAN, NUM_ENV_STEPS_SAMPLED_LIFETIME, ) from ray.tune.registry import register_env parser = add_rllib_example_script_args( default_timesteps=500000, ) parser.set_defaults( num_agents=2, ) # Use `parser` to add your own custom command line options to this script # and (if needed) use their values to set up `config` below. args = parser.parse_args() register_env("multi_agent_pendulum", lambda cfg: MultiAgentPendulum(config=cfg)) config = ( SACConfig() .environment("multi_agent_pendulum", env_config={"num_agents": args.num_agents}) .training( initial_alpha=1.001, # Use a smaller learning rate for the policy. actor_lr=2e-4 * (args.num_learners or 1) ** 0.5, critic_lr=8e-4 * (args.num_learners or 1) ** 0.5, alpha_lr=9e-4 * (args.num_learners or 1) ** 0.5, lr=None, target_entropy="auto", n_step=(2, 5), tau=0.005, train_batch_size_per_learner=256, target_network_update_freq=1, replay_buffer_config={ "type": "MultiAgentPrioritizedEpisodeReplayBuffer", "capacity": 100000, "alpha": 1.0, "beta": 0.0, }, num_steps_sampled_before_learning_starts=256, ) .rl_module( model_config=DefaultModelConfig( fcnet_hiddens=[256, 256], fcnet_activation="relu", fcnet_kernel_initializer=nn.init.xavier_uniform_, head_fcnet_hiddens=[], head_fcnet_activation=None, head_fcnet_kernel_initializer=nn.init.orthogonal_, head_fcnet_kernel_initializer_kwargs={"gain": 0.01}, fusionnet_hiddens=[256, 256, 256], fusionnet_activation="relu", ), ) .reporting( metrics_num_episodes_for_smoothing=5, ) ) if args.num_agents > 0: config.multi_agent( policy_mapping_fn=lambda aid, *arg, **kw: f"p{aid}", policies={f"p{i}" for i in range(args.num_agents)}, ) stop = { NUM_ENV_STEPS_SAMPLED_LIFETIME: args.stop_timesteps, # `episode_return_mean` is the sum of all agents/policies' returns. f"{ENV_RUNNER_RESULTS}/{EPISODE_RETURN_MEAN}": -450.0 * args.num_agents, } if __name__ == "__main__": assert ( args.num_agents > 0 ), "The `--num-agents` arg must be > 0 for this script to work." run_rllib_example_script_experiment(config, args, stop=stop)