Skip to content

Simulation multi-agents 2D en Rust/Bevy avec apprentissage par renforcement (DQN) et langage audio émergent.

LuuNa-JD/evolife_rust

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🌱 Évolution de langage & apprentissage par renforcement en environnement 2D

Projet de simulation multi‑agents en Rust / Bevy où des créatures apprennent à survivre (se nourrir, éviter le danger, se reproduire) via DQN (Deep Q‑Network, Burn/burn‑tch + LibTorch), tout en développant un proto‑langage audio émergent. Les agents communiquent par brefs messages sonores dont les « gènes de langage » évoluent (fréquence, rythme, complexité tonale, préférence à communiquer). Petite réference à un épisode de la série Black Mirror !

demo


✨ Fonctionnalités

  • Moteur de jeu : Bevy 2D (camera pan/zoom, collisions « rebond », sprites, assets faciles à remplacer).
  • RL : DQN (Burn + LibTorch) avec buffer de rejouement, réseau cible, epsilon‑greedy, shaping des récompenses.
  • Écologie : nourriture, ennemis mobiles, mortalité, reproduction avec héritage/mutation de gènes.
  • Langage émergent : génération de séquences binaires → synthèse audio on‑the‑fly (WAV en mémoire avec hound), propagation/spread d’alertes, mimétisme et convergence de dialectes.
  • Audio : lecteur Bevy Audio; limitation intelligente (quota/zone) pour éviter la cacophonie.

🧠 Apprentissage par renforcement

État (17 features) : position normalisée (x,y), faim, énergie, âge, derniers bits entendus, info nourriture (distance + sin/cos angle), info danger (distance + sin/cos angle), flag « a entendu », mémoire court‑terme (vu/entendu danger récemment), distance au danger précédente.

Actions (8) : haut, bas, gauche, droite, manger, se reproduire, parler social, parler contexte (food/danger/… selon l’état).

Récompenses (exemples) :

  • +2.0 manger
  • +0.15 s’éloigner d’un danger proche
  • −0.2 se rapprocher d’un danger proche
  • −10 contact avec un ennemi ⇒ mort/épisode terminé
  • −0.5 heurter la bordure
  • prime de nouveauté des états (encourager l’exploration)
  • bonus de similarité linguistique lors d’interactions réussies

Réseau DQN : Linear(17→256→256→128→64→8) avec ReLU. Cible mise à jour toutes les target_update_freq étapes.


🔊 Langage, gènes & audio

Chaque agent possède des LanguageGenes :

  • frequency_modifier : facteur appliqué à BASE_FREQ (par défaut 440 Hz)
  • rhythm_pattern : variations de durée par bit
  • tone_complexity : quantité d’harmoniques
  • communication_preference : propension à parler

Mutation/Héritage : à la reproduction, moyennes parentales + mutations douces. Mimétisme : un auditeur proche et « synchronisé » (similarité > 0.8) adapte légèrement ses gènes vers le locuteur.

Synthèse : séquence binaire → onde sinusoïdale + harmoniques, enveloppe courte, écrite en WAV en mémoire puis jouée par Bevy Audio. Limitation : 1 son/zone/frame (AUDIO_ZONE_SIZE) pour garder le mix lisible.


🗂️ Architecture du code

  • main.rs

    • Setup : caméra, fond, spawns de nourriture/ennemis/agents.

    • Systèmes :

      • camera_zoom_system, camera_keyboard_move_system
      • move_entities_system, bounce_entities_system
      • agent_rl_system : boucle d’interaction, step RL, actions, rewards, reproduction & communication
      • agent_listen_system : traitement des messages, similarité, mimétisme
      • agent_rl_learn_system : sampling du replay buffer, calcul de la loss, pas d’optimisation
      • play_sounds_system, cleanup_audio_players : synthèse + GC audio
    • DQN / ReplayBuffer (Burn/burn‑tch)

    • Génération audio via houndAudioSource


🧩 Prérequis

  • Rust (1.77+ conseillé) : https://rustup.rs

  • Bevy (via cargo)

  • Burn + burn‑tch (backend LibTorch)

  • LibTorch (CPU ou CUDA)

    • Téléchargez LibTorch (p. ex. Pre-cxx11 ABI) et définissez :

      • Linux/macOS :

        export LIBTORCH=/path/vers/libtorch
        export LD_LIBRARY_PATH=$LIBTORCH/lib:$LD_LIBRARY_PATH
      • Windows (PowerShell) :

        setx LIBTORCH C:\\path\\to\\libtorch
        setx PATH "%LIBTORCH%\\lib;%PATH%"
    • CUDA : ajustez LibTorchDevice::Cuda(0) → passer en Cpu si vous n’avez pas de GPU.


🚀 Lancer le projet

# Cloner
git clone <ce-repo>
cd <ce-repo>

# Build + run
cargo run --release

Touches :

  • Flèches ← → ↑ ↓ : déplacer la caméra
  • Molette souris : zoom

⚙️ Paramètres importants (constants)

Dans main.rs :

GRID_SIZE=200  CELL_SIZE=10.0
AGENT_INIT=10  FOOD_INIT=50  DANGER_INIT=10
LR=0.001  REPRODUCTION_COST=50.0  REPRODUCTION_COOLDOWN=50.0
HUNGER_DECREASE=0.5  ENERGY_DECREASE=0.2
COMMUNICATION_RADIUS=80.0  MAX_AGENTS=100
SOUND_DURATION=0.1  BASE_FREQ=440.0  SAMPLE_RATE=44100.0
AUDIO_ZONE_SIZE=200.0  MAX_SOUNDS_PER_FRAME=1

Backend Burn : éditer LibTorchDevice::Cuda(0)LibTorchDevice::Cpu si nécessaire.


📦 Arborescence type

assets/
  agent.png, background.png
  ennemy1.png … ennemy5.png
  food1.png … food4.png
src/
  main.rs
Cargo.toml

Les sprites proviennent du pack Kenney (répertoire kenney_new-platformer-pack-1.0/).


🧰 Dépannage

  • Erreur LibTorch introuvable : vérifiez LIBTORCH et LD_LIBRARY_PATH/PATH.
  • Pas de GPU : remplacez LibTorchDevice::Cuda(0) par LibTorchDevice::Cpu.
  • Audio sature ou CPU élevé : augmentez AUDIO_ZONE_SIZE, réduisez MAX_SOUNDS_PER_FRAME, ou le volume.
  • Silence audio : vérifiez que le système play_sounds_system se déclenche (agents qui parlent : actions 6/7) et que Bevy Audio est chargé.
  • Crashes aléatoires : tailles de batch, dimensions de tenseurs ; conserver state_dim=17, action_dim=8 partout.

🙏 Crédits

  • Bevy (MIT/Apache‑2.0)
  • Burn / burn‑tch (MIT/Apache‑2.0)
  • LibTorch (PyTorch C++ distribution)
  • Kenney – assets graphiques
  • hound – écriture WAV

🤝 Contributions

Issues et PR bienvenues ! Merci de garder le code idiomatique Rust et d’expliquer les changements de dynamique RL.

About

Simulation multi-agents 2D en Rust/Bevy avec apprentissage par renforcement (DQN) et langage audio émergent.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages