PROGRAMMATION ORIENTÉE AGENT :
NETLOGO
Modélisation/simulation de phénomènes collectifs
11/02/09 [Link]
NetLogo
2
Un environnement de programmation pour la modélisation/
simulation de phénomènes collectifs
Adapté à la modélisation de systèmes complexes composés
de nombreux agents inter-agissant en parallèle
Simulations disponibles en sociologie, biologie, médecine,
physique, chimie, mathématiques, informatique, économie,
psychologie sociale, …
Possibilité de créer ses propres modèles et de les simuler
28/10/08
NetLogo : un monde d’agents
3
Constitué d’agents qui peuvent agir
Les activités des différents agents s’exécutent
simultanément
3 types d’agents : patch - turtle - link
+ un unique observateur du monde !
28/10/08
Le Monde = grille 2D
4
Grille constituée de patches (carrés)
Un patch est repéré par ses coordonnées
Origine du monde (0,0) au centre de la grille
Dimension de la grille
min-pxcor <= … <= max-pxcor
min-pycor <= … <= may-pxcor
Par défaut min=-16 et max=+16 ; 33*33=1089 patches
Le monde des patches est, par défaut, une grille circulaire
On peut changer le nombre de patches et la nature de la
grille avec le bouton « setting »
28/10/08
3 types d’agents
5
1) Patch (contenir)
Position fixe (int pxcor, int pycor)
Peut créer une turtle
4) Et un Observer unique (observer)
Peut contenir plusieurs turtles Unique
2) Turtle (bouger) Ne fait pas partie du monde
Agent réactif qui se déplace dans le Peut créer une turtle
monde
Positionner sur un patch (float xcor, float
ycor)
Peut changer de patch
3) Link (relier)
Connecte deux turtles
(turtle end1, turtle end2)
28/10/08
Agents réactifs = turtles
6
Création par :
l’observateur
un patch
Coordonnées dans le monde :
xcor, ycor de type float
une turtle est situé sur un patch de coordonnées de type
int
Un patch peut contenir plusieurs turtles
28/10/08
Commandes
7
Une commande définit les actions à exécuter par les
agents
pré-défini : primitive Netlogo
à définir par le programmeur : procédure
Une procédure est définie par : to unNom … end
to setup
ca ;; clear all
crt10 ;; create 10 turtles
end
28/10/08
Primitives Netlogo
8
Commandes prédéfinies dans NetLogo
Exemples :
ca (clear all)
crt (create turtles)
lt (left turn), rt (right turn), fd (forward)
set (affectation de variable)
ask, …
peuvent avoir des valeurs en entrée :
crt 100
rt 50 …
28/10/08
NetLogo avec le « Commande
9
Center »
Choisir « New » dans le fichier menu
Créer des turtles :
observer> crt 100
Les turtles créées sont regroupées au centre, pour les
voir il faut augmenter le rayon du cercle :
turtles> fd 10
Ou
turtles> fd (random 10)
Pour passer de la commande observer> à
turles> il faut cliquer sur observer et choisir à
partir du menu l’option turtles
11/02/09
Écrire une procédure NetLogo
10
Créer un bouton « setup » :
cliquer sur l’icône bouton dans la barre d’outil
Puis cliquer dans un endroit de la fenêtre
graphique où vous voulez placer votre bouton
Une fenêtre de dialogue s’ouvrira, écrire « setup »
dans le boxe « code », et cliquer sur le bouton
« ok »
Le bouton s’affichera sur l’interface graphique
11/02/09
Exemple 1: procédure « setup »
11
Avant de pouvoir actionner le bouton « setup »
Cliquer sur l’option « Procedures »
Saisir le code suivant :
to setup
ca
crt 100
ask patches [
if (pxcor > 0) [set pcolor green]
]
ask turtles [
fd 10
]
end
11/02/09
Exécution : actionner le bouton
12
28/10/08
Exemple 2 : Procédure « setup »
13
Cliquer sur l’option « Procédures »
Remplacer le code par :
to setup
ca
crt 100
ask turtles [
setxy (random 100) (random 100)
set shape "circle"
]
end
11/02/09
Analyser la procédure « setup »
14
ca: clear-all, effacer l’écran et initialise toutes les
variables à 0
crt 100: créer 100 tortues qui se localisent à la position
(0, 0)
ask turtles[ ]: oblige les tortues à exécuter de manière
indépendante, les instructions contenues entre les [ ]
set shape « circle »: les turtles seront sous forme d’un
cercle. On peut changer cette forme en consultant outil
dans le menu bar, option « turtles shapes »
11/02/09
Procédures « go » et « bouge »
15
Créer un bouton « go »
Dans procédure écrire le code :
to go
bouge
end
to bouge
ask turtles[
set heading random 360
fd 1
]
end
11/02/09
Exemple d’exécution
16
28/10/08
procédure vs. reporter
17
Un reporter est une commande qui calcule et
retourne un résultat
Utiliser to-report à la place de to pour
commencer
Dans le corps d’un reporter, utiliser report pour
indiquer la valeur à retourner
to-report absolute-value [number]
ifelse number >= 0
[ report number ]
[ report (- number) ]
end
28/10/08
Variables Netlogo
18
Variable global
unique exemplaire
Accessible par chaque agent
Variable turtle
Une valeur pour chaque turtle
Variable patch
Une valeur pour chaque patch
Variable link
Une valeur pour chaque link
Variables pré-définies
Variable turtle : color
Variable patche : pcolor
Variable link : end1
28/10/08
Variables turtle pré-définies
19
breed pen-mode
color pen-size
shape
Heading
size
hidden? who
Label xcor
label-color ycor
28/10/08
Variable turtle pré-définie : heading
20
Indique la direction pour chaque turtle
Compris entre 0 et 360
0 est le Nord, 90 est l’Est, …
On change cette valeur pour faire « tourner » une
turtle sur elle-même
set heading 45 ;; turtle is now facing northeast
set heading heading + 10 ;; same effect as "rt 10"
28/10/08
Variables patch pré-définies
21
pcolor
plabel
plabel-color
pxcor
pycor
28/10/08
Variables link pré-définies
22
breed
color
end1 end2
hidden?
label
label-color
shape
thickness
tie-mode
28/10/08
Définir ses propres variables
23
Variable globale :
Ajouter un switch ou un slider
Utiliser le mot-reservé globals au début du code :
globals [score ]
Variable turtle, patch ou link
Utiliser turtles-own , patches-own and links-own :
turtles-own [energy speed ]
patches-own [friction ]
links-own [strength ]
Utiliser la commande set pour l’affectation
Par défaut la valeur est zéro
28/10/08
Conditions d’accès!
24
Une variable globale peut être lue et modifiée à tout
moment par chaque agent
Une turtle peut lire et modifier une variable patch si
elle est positionnée sur ce patch. Par exemple, le code :
ask turtles [set pcolor red ]
permet à chaque turtle de « colorier » son patch en
rouge
Les variables patch sont donc partagées par les turtles,
on ne peut donc pas avoir une variable turtle et une
variable patch de même nom
28/10/08
Utiliser of pour limiter les accès
25
;; prints current color of turtle with who number 5
show [color] of turtle 5
;; prints the sum of the x and y coordinates of
;; turtle with who number 5
show [xcor + ycor] of turtle 5
28/10/08
Variable locale
26
Définir et utiliser uniquement dans le contexte d’une
procédure particulière (ou d’une partie de cette
procédure)
Création :
Utiliser (n’importe où dans la procédure) la commande let
Si début d’une procédure : existe dans toute la procédure
Si entre crochets : existe uniquement à l’intérieur des
crochets
to swap-colors [turtle1 turtle2]
let temp [color] of turtle1
ask turtle1 [ set color [color] of turtle2 ]
ask turtle2 [ set color temp ]
end
28/10/08
Commande ask
27
Pour donner des « ordres » aux turtles, patches, et
links
Tout code exécuté par les turtles doit être localisé
dans un « turtle context »
Comment établir un « turtle context » :
dans un button, en choisissant "Turtles" dans le menu
popup
dans le Command Center, en choisissant "Turtles" dans
le menu popup
en utilisant ask turtles
28/10/08
Commande ask
28
Idem pour les patches, les links, et l’observer
On ne peut pas utiliser ask pour l’observer
Tout code qui n’est pas dans un ask est par défaut
un code observer
to setup
clear-all
crt 100 ;; create 100 turtles with random headings
ask turtles
[ set color red ;; turn them red
fd 50 ] ;; spread them around
ask patches
[ if pxcor > 0 ;; patches on the right side
[ set pcolor green ] ] ;; of the view turn green
end
28/10/08
Les reporters turtle, patch, link,
29
patch-at
Le reporter turtle prend un entier en entrée, et retourne
la turtle avec ce numéro (who number)
Le reporter patch prend les valeurs pour pxcor et pycor,
et retourne le patch avec ces coordonnées
Le reporter link prend deux entrées, le « who numbers »
des deux turtles qu’il connecte
Le reporter patch-at prend les distances relatives (en x
et y) en entrée, et retourne le patch désigné
ask turtle 0 ;; ask the first turtle
[ ask patch-at 1 0 ;; ...to ask patch to the east
[ set pcolor red ] ] ;; ...to become red
28/10/08
ask vs. ask … ask
30
first one turtle moves and turns first all of the turtles move. After
red, then … …
ask turtles ask turtles [ fd 1 ]
[ fd 1 ask turtles [ set
set color red ] color red ]
… another turtle … they have all
moves and turns red, moved, they all turn
and so on red
28/10/08
ask vs. ask-concurrent
31
ask turtles [ fd 5 ]
ask-concurrent turtles [ fd 5 ]
avec ask, la première turtle avance de 5 pas, puis la
deuxième avance de 5 pas, etc
avec ask-concurrent, toutes les turtles avancent de un
pas, puis elles avancent toutes d’un deuxième pas, etc
ask-concurrent est équivalent à :
repeat 5 [ ask turtles [ fd 1 ] ]
28/10/08
Agentsets
32
Ensemble non ordonné d’agents qui peut contenir
turtles, patches ou links (sans mélange)
= ou != pour comparer deux agentsets
member? Pour savoir si un agent appartient à un
agentset
Agentsets totaux:
Le reporter turtles renvoie toutes les turtles
Le reporter patches renvoie tous les patches
Le reporter links tous les links
28/10/08
Comment définir ses propres
33
agentsets ?
other turtles ;; all other turtles
other turtles-here ;; all other turtles on this patch
turtles with [color = red] ;; all red turtles
turtles-here with [color = red] ;; all red turtles on my patch
patches with [pxcor > 0] ;; patches on right side of view
turtles in-radius 3 ;; all turtles less than 3 patches away
patches at-points [[1 0] [0 1] [-1 0] [0 -1]] ;; the four patches to the east,
north, west, and south
Neighbors4 ;; shorthand for those four patches
turtles with [(xcor > 0) and (ycor > 0)
and (pcolor = green)]
;; turtles in the first quadrant that are on a green patch
turtles-on neighbors4 ;; turtles standing on my neighboring four patches
[my-links] of turtle 0 ;; all the links connected to turtle 0
28/10/08
Utiliser un agentset
34
ask
Pourdonner des ordres à tous les agents dans un
agentset
any?
Pour savoir si un agentset est vide
all?
Pour savoir si chaque élément d’un agentset vérifie une
condition
count : retourne le cardinal d’un agentset
28/10/08
Utiliser un agentset
35
one-of : choisir un agent au hasard dans un
agentset
ask one-of turtles [ set color green ]
max-one-of ou min-one-of : trouver l’agent
le meilleur ou le pire selon un critère
ask max-one-of turtles [sum assets] [die ]
28/10/08