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 !
- 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.
É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.
Chaque agent possède des LanguageGenes :
frequency_modifier: facteur appliqué àBASE_FREQ(par défaut 440 Hz)rhythm_pattern: variations de durée par bittone_complexity: quantité d’harmoniquescommunication_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.
-
main.rs-
Setup : caméra, fond, spawns de nourriture/ennemis/agents.
-
Systèmes :
camera_zoom_system,camera_keyboard_move_systemmove_entities_system,bounce_entities_systemagent_rl_system: boucle d’interaction, step RL, actions, rewards, reproduction & communicationagent_listen_system: traitement des messages, similarité, mimétismeagent_rl_learn_system: sampling du replay buffer, calcul de la loss, pas d’optimisationplay_sounds_system,cleanup_audio_players: synthèse + GC audio
-
DQN / ReplayBuffer (Burn/burn‑tch)
-
Génération audio via
hound→AudioSource
-
-
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 enCpusi vous n’avez pas de GPU.
-
# Cloner
git clone <ce-repo>
cd <ce-repo>
# Build + run
cargo run --releaseTouches :
- Flèches ← → ↑ ↓ : déplacer la caméra
- Molette souris : zoom
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.
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/).
- Erreur LibTorch introuvable : vérifiez
LIBTORCHetLD_LIBRARY_PATH/PATH. - Pas de GPU : remplacez
LibTorchDevice::Cuda(0)parLibTorchDevice::Cpu. - Audio sature ou CPU élevé : augmentez
AUDIO_ZONE_SIZE, réduisezMAX_SOUNDS_PER_FRAME, ou le volume. - Silence audio : vérifiez que le système
play_sounds_systemse 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=8partout.
- Bevy (MIT/Apache‑2.0)
- Burn / burn‑tch (MIT/Apache‑2.0)
- LibTorch (PyTorch C++ distribution)
- Kenney – assets graphiques
- hound – écriture WAV
Issues et PR bienvenues ! Merci de garder le code idiomatique Rust et d’expliquer les changements de dynamique RL.
