11 — L’environnement dans gAgent
gAgent fournit deux classes pour modéliser l’environnement situé :
Environnement et VisualAgent.
La classe Environnement
Environnement est la classe de base à surcharger. Elle gère
automatiquement la collecte des états d’agents, la mémoire partagée,
et la communication avec agentview.
#include <gagent/env/Environnement.hpp>
using namespace gagent;
class MonEnvironnement : public Environnement {
public:
void init_env() override { /* initialisation */ }
void link_attribut() override { /* déclarer les attributs surveillés */ }
void event_loop() override { /* boucle principale */ }
};
Les trois méthodes à surcharger
``init_env()`` — appelée une fois au démarrage. Configurez ici les dimensions de la carte et toute initialisation de votre environnement.
void init_env() override {
map_width = 800; // largeur de la carte en pixels
map_height = 400; // hauteur de la carte
}
``link_attribut()`` — déclare la correspondance entre les noms
d’attributs de vos agents et les champs internes de l’environnement.
C’est ici que vous dites « dans mes agents, la position X s’appelle
x, la couleur s’appelle color ».
void link_attribut() override {
link_id ("id"); // identifiant unique de l'agent
link_name ("name"); // nom affiché
link_pos_x ("x"); // position horizontale
link_pos_y ("y"); // position verticale
link_shape ("shape"); // forme : circle, square, triangle, diamond, star
link_color ("color"); // couleur CSS : "red", "#4fc3f7", etc.
link_size_x("size_x"); // largeur en pixels
link_size_y("size_y"); // hauteur en pixels
link_val ("val"); // valeur textuelle affichée
}
``event_loop()`` — la boucle principale de l’environnement. Elle
tourne en continu tant que la simulation fonctionne. C’est ici que vous
mettez à jour l’état de l’environnement, appelez make_agent() pour
rafraîchir la vue, etc.
void event_loop() override {
while (true) {
make_agent(); // rafraîchir la liste des agents visuels
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
La méthode make_agent()
make_agent() reconstruit la liste interne list_visual_agents à
partir des derniers attributs reçus de tous les agents. C’est cette
liste qu”agentview lit pour afficher la carte.
Appelez-la régulièrement dans event_loop() pour que la visualisation
reste à jour.
La classe VisualAgent
Un VisualAgent est la représentation visuelle d’un agent dans
l’environnement. Il contient les attributs d’affichage :
Attribut |
Type |
Description |
|---|---|---|
|
string |
Identifiant unique (doit être unique dans l’environnement) |
|
string |
Nom affiché dans agentview |
|
float |
Position dans la carte (en pixels) |
|
string |
Forme : |
|
string |
Couleur CSS : |
|
float |
Taille uniforme (en pixels) |
|
float |
Dimensions indépendantes (largeur × hauteur) |
|
string |
Valeur textuelle affichée sur ou sous l’agent |
Lancer l’environnement
L’environnement se lance avec AgentCore::initEnvironnementSystem()
avant d’initialiser les agents :
int main() {
AgentCore::initAgentSystem();
MonEnvironnement env;
AgentCore::initEnvironnementSystem(env); // lance l'environnement
MonAgent a;
a.init();
AgentCore::syncAgentSystem();
return 0;
}
initEnvironnementSystem() démarre l’environnement dans un processus
séparé (comme les agents). La méthode start() est appelée
automatiquement — elle exécute init_env(), link_attribut(), puis
event_loop() de façon bloquante.
Résumé du flux
Agent Environnement agentview
│ │ │
│ setAttribut(...) │ │
│ attributUpdated() ───►│ │
│ │ make_agent() │
│ │ (reconstruit la vue) │
│ │◄──── GET_AGENTS ─────────│
│ │───── JSON ──────────────►│
│ │ affiche la carte
Comment les agents publient leur état
Un agent situé déclare ses attributs visuels dans
setup(), puis les met à jour au fil du temps en appelantattributUpdated().À chaque appel à
attributUpdated(), l’agent envoie ses attributs courants à l’environnement via la file de messages interne. L’environnement met alors à jour sa vue.