Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Nom du modèle
- model trafic
- // Méthode globale définissant l'environnement.
- global {
- file shp_bati <- file("../includes/bati.shp");
- file shp_rue <- file("../includes/rues_vm.shp");
- geometry shape <- envelope(shp_rue);
- graph reseau;
- int min_deb_trav <- 6;
- int max_deb_trav <- 8;
- float step <- 1 #mn;
- // on introduit un paramètre pour déterminer la valeur qui sera ajoutée au segments à chaque passage
- float usage <- 0.1;
- init {
- create bati from: shp_bati;
- create rue from: shp_rue;
- // ajoute des valeurs de poids (dans d’init{}) au réseau des rues. Les poids serviront à garder en mémoire l’usage des segments de rues
- map<rue,float> carte_poids <- rue as_map (each:: (each.usage_coeff * each.shape.perimeter));
- reseau <- as_edge_graph(shp_rue) with_weights carte_poids;
- create resident number: 100 {
- debut_trav <- rnd (min_deb_trav, max_deb_trav);
- fin_trav <- debut_trav + rnd(7, 9);
- residence <- one_of (list<bati>(bati));
- travail <- one_of (list<bati>(bati));
- objectif <- "repos";
- location <- residence;
- }
- }
- // création d'un reflex pour mettre à jour le réseau avec les nouvelles valeurs
- reflex update_reseau{
- map<rue,float> carte_poids <- rue as_map (each:: (each.usage_coeff * each.shape.perimeter));
- reseau <- reseau with_weights carte_poids;
- }
- }
- // Agent "bati"
- species bati {
- aspect base {
- draw shape color: #darkgrey ;
- }
- }
- // Agent "rue"
- species rue {
- // Donner un coefficient d'utilisation des segments de rues
- float usage_coeff <- 1.0;
- // calcul de la nouvelle couleur
- int colorValue <- int(255*(usage_coeff - 1)) update: int(255*(usage_coeff - 1));
- rgb color <- rgb(min([255, colorValue]),max ([0, 255 - colorValue]),0) update: rgb(min([255, colorValue]),max ([0, 255 - colorValue]),0) ;
- aspect base {
- draw shape color: color;
- }
- }
- // Agents "résidents"
- species resident skills: [moving] {
- rgb color <- rgb(243, 214, 72);
- bati residence <- nil;
- bati travail <- nil;
- int debut_trav;
- int fin_trav;
- string objectif;
- point target <- nil;
- // À chaque itération, regarder l'heure et vérifier s'il est temps de partir au travail
- reflex au_boulot when: current_date.hour = debut_trav and objectif = "repos" {
- // si c'est le cas, donner l'objectif "travailler" à l'agent
- objectif <- "travailler";
- // et lui donner pour destination "travail" (la destination avant ça était "nil")
- target <- any_location_in(travail);
- }
- // À chaque itération, regarder l'heure et vérifier s'il est temps de rentrer
- reflex au_repos when: current_date.hour = fin_trav and objectif = "travailler" {
- // si c'est le cas, donner l'objectif "travailler" à l'agent
- objectif <- "repos";
- // et lui donner pour destination "travail" (la destination avant ça était "nil")
- target <- any_location_in(residence);
- }
- // À chaque itération, regarder si la variable destination est différente "nil"
- reflex move when: target != nil {
- // On trouve les segments de rues et on passe à travers la liste
- path chemin <- goto(target: target, on:reseau, return_path: true);
- list<geometry> segments <- chemin.segments;
- loop ligne over: segments {
- float dist <- ligne.perimeter;
- ask rue(chemin agent_from_geometry ligne) {
- // calcul du nouveau coefficient d'utilisation qui servira au calcul de la couleur
- usage_coeff <- usage_coeff + (usage * dist / shape.perimeter);
- }
- }
- if target = location {
- // une fois arrivé, sa destination devient nil
- target <- nil ;
- }
- }
- aspect base {
- draw circle(20) color: color;
- }
- }
- // Définition de la simulaiton et de ses affichages
- experiment trafic type: gui {
- output {
- display ville_marie type:opengl background: rgb(50, 50, 50) {
- species bati aspect: base ;
- species rue aspect: base ;
- species resident aspect: base ;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement