Skip to content

ForagerRL_step14

Killian edited this page May 4, 2026 · 1 revision

14. Training Multiple Agents

By Killian Trouillet


Step 14: Training Multiple Agents

Starting GAMA Headless

Windows

gama-headless.bat -socket 1001

Linux / MacOS

./gama-headless.sh -socket 1001

Port 1000 is reserved for the GUI. Use any other port for headless training.


Parameter-Shared PPO

In Part 2, we trained a single forager with PPO. Here we have two foragers, but they share the same observation/action structure and the same goal. So we use parameter sharing: one single neural network for both agents.

Why parameter sharing?

Criterion Parameter Sharing (ours) Independent PPO MADDPG
# Networks 1 (shared) 1 per agent Complex
Data efficiency Best — 2× data per update Standard Standard
Cooperation Emerges naturally Must emerge independently Explicit
Implementation Simple Simple Complex

Each agent feeds its own observation (15 values, including teammate position) into the same network and gets its own action back. Because both agents contribute trajectory data to the same network, learning is 2× faster.


Using GamaParallelEnv Directly

Unlike Part 2 where we used gym.make(), here we use GamaParallelEnv directly — the PettingZoo Parallel API:

from gama_pettingzoo.gama_parallel_env import GamaParallelEnv

env = GamaParallelEnv(
    gaml_experiment_path="path/to/forager_petz.gaml",
    gaml_experiment_name="petz_env",
    gama_ip_address="localhost",
    gama_port=1001,
)

obs, infos = env.reset()
# {"forager_0": array([...]), "forager_1": array([...])}

Batch Inference

We query the shared network for all agents at once using select_actions_batch():

# Collect observations from all active agents
active = [a for a in AGENT_IDS if a in obs]
obs_list = [np.array(obs[a], dtype=np.float32) for a in active]

# One forward pass through the shared network
actions_np, log_probs, values = agent.select_actions_batch(obs_list)

# Build the actions dict for PettingZoo
actions_dict = {a: actions_np[i] for i, a in enumerate(active)}

This is the same approach used in the Pistonball benchmark.


The Training Loop

agent = PPOAgent(state_dim=15, action_dim=2)
UPDATE_EVERY = 2048

total_steps = 0
agent_buffers = {a: RolloutBuffer() for a in AGENT_IDS}

for ep in range(1, NUM_EPISODES + 1):
    obs, _ = env.reset()
    step = 0
    done = False

    while not done and step < 300:
        active = [a for a in AGENT_IDS if a in obs]
        obs_list = [np.array(obs[a], dtype=np.float32) for a in active]
        actions_np, lps, vals = agent.select_actions_batch(obs_list)

        actions_dict = {}
        for i, a in enumerate(active):
            actions_dict[a] = actions_np[i]
            agent_buffers[a].states.append(torch.FloatTensor(obs_list[i]))
            agent_buffers[a].actions.append(torch.FloatTensor(actions_np[i]))
            agent_buffers[a].logprobs.append(torch.tensor(lps[i]))
            agent_buffers[a].values.append(torch.tensor(vals[i]))

        next_obs, rewards, terms, truncs, _ = env.step(actions_dict)

        for a in active:
            agent_buffers[a].rewards.append(rewards.get(a, 0.0))
            agent_buffers[a].dones.append(terms.get(a, False) or truncs.get(a, False))

        obs = next_obs
        step += 1
        total_steps += len(active)
        done = not env.agents or all(terms.get(a, False) for a in AGENT_IDS)

        # PPO update — all agents' data pooled into one gradient step
        if total_steps >= UPDATE_EVERY:
            agent.update(agent_buffers)
            agent_buffers = {a: RolloutBuffer() for a in AGENT_IDS}
            total_steps = 0

Key differences from Part 2

Aspect Part 2 (Gymnasium) Part 3 (PettingZoo)
Environment gym.make() GamaParallelEnv()
Observations Single array Dict {agent_id: array}
Actions Single array Dict {agent_id: array}
Rollout buffers One buffer One buffer per agent
PPO update agent.update(buffer) agent.update(agent_buffers) — pools all agents' data

What to Expect

  Ep   10/500 | steps 300 | f0  -4.2  f1  -3.8 | success  0%
  Ep   50/500 | steps 241 | f0  +8.1  f1  +6.4 | success  5%
  Ep  100/500 | steps 127 | f0 +42.3  f1 +38.7 | success 30%
  Ep  200/500 | steps  74 | f0 +81.4  f1 +79.2 | success 72%
  Ep  300/500 | steps  59 | f0 +88.6  f1 +87.1 | success 85%
  Ep  500/500 | steps  52 | f0 +91.2  f1 +90.4 | success 92%

Running the Training

cd models/petz
python train_forager_petz.py

The shared model is saved to saved_models/ppo_forager.pth.


Key Files

File Description
models/petz/forager_petz.gaml GAMA model with PetzAgent bridge
models/petz/train_forager_petz.py MARL training script (headless)
models/petz/test_forager_petz.py Testing script (GUI visualization)
  1. What's new (Changelog)
  2. Migration Guide (2025-06 → 2026-06)
  1. Installation and Launching
    1. Installation
    2. Launching GAMA
    3. Updating GAMA
    4. Installing Plugins
  2. Workspace, Projects and Models
    1. Navigating in the Workspace
    2. Changing Workspace
    3. Importing Models
  3. Editing Models
    1. GAML Editor (Generalities)
    2. GAML Editor Tools
    3. Validation of Models
  4. Running Experiments
    1. Launching Experiments
    2. Experiments User interface
    3. Controls of experiments
    4. Parameters view
    5. Inspectors and monitors
    6. Displays
    7. Batch Specific UI
    8. Errors View
  5. Running Headless
    1. Getting Started
    2. Headless Legacy
    3. Headless Batch
  6. Preferences
  7. Troubleshooting
  1. Introduction
    1. Start with GAML
    2. Organization of a Model
    3. Basic programming concepts in GAML
  2. Manipulate basic Species
  3. Global Species
    1. Regular Species
    2. Defining Actions and Behaviors
    3. Interaction between Agents
    4. Attaching Skills
    5. Inheritance
  4. Defining Advanced Species
    1. Grid Species
    2. Graph Species
    3. Mirror Species
    4. Multi-Level Architecture
  5. Defining GUI Experiment
    1. Defining Parameters
    2. Defining Displays Generalities
    3. Defining 3D Displays
    4. Defining Charts
    5. Defining Monitors and Inspectors
    6. Defining Export files
    7. Defining User Interaction
  6. Classes and Objects
    1. Class Definition and Instantiation
    2. Attributes and Actions
    3. Inheritance
    4. Virtual Classes
    5. Advanced Features
  7. Exploring Models
    1. Run Several Simulations
    2. Batch Experiments
    3. Exploration Methods
  8. Optimizing Models
    1. Runtime Concepts
    2. Analyzing code performance
    3. Optimizing Models
  9. Multi-Paradigm Modeling
    1. Control Architecture
    2. Defining Differential Equations
  1. Manipulate OSM Data
  2. Cleaning OSM Data
  3. Diffusion
  4. Using Database
  5. Using Dataframes
  6. Using FIPA ACL
  7. Using BDI with BEN
  8. Using Driving Skill
  9. Manipulate dates
  10. Manipulate lights
  11. Using comodel
  12. Save and restore Simulations
  13. Using network
  14. Writing Unit Tests
  15. Ensure model's reproducibility
  16. Going further with extensions
    1. Calling R
    2. Using Graphical Editor
    3. Using Git from GAMA
  1. Built-in Species
  2. Built-in Skills
  3. Built-in Architecture
  4. Statements
  5. Data Type
  6. File Type
  7. Stats Extension
  8. Sound Extension
  9. BDI Extension
  10. FIPA Skill
  11. Expressions
    1. Literals
    2. Units and Constants
    3. Pseudo Variables
    4. Variables And Attributes
    5. Operators (Definition)
    6. Operators [A-A]
    7. Operators [B-C]
    8. Operators [D-H]
    9. Operators [I-M]
    10. Operators [N-R]
    11. Operators [S-Z]
  12. Exhaustive list of GAMA Keywords
  1. Installing the development version
    1. Install GAMA source code with Eclipse plugin
  2. Developing Extensions
    1. Developing Plugins
    2. Developing Skills
    3. Developing Statements
    4. Developing Operators
    5. Developing Types
    6. Developing Species
    7. Developing Control Architectures
    8. Index of annotations
  3. Introduction to GAMA Java API
    1. Architecture of GAMA
    2. IScope
  4. Using GAMA flags
  5. Creating a release of GAMA
  6. Documentation generation

  1. Predator Prey
  2. Road Traffic
  3. Incremental Model
  4. Luneray's flu
  5. BDI Agents
  6. Forager RL
  7. SIR Analysis
  8. 3D Model

  1. Team
  2. Projects using GAMA
  3. Scientific References
  4. Training Sessions

Resources

  1. Videos
  2. Conferences
  3. Pedagogical materials

Clone this wiki locally