De nombreux modèles créés avec des versions précédentes de NetLogo tournent encore avec NetLogo 4.0. Toutefois, certains modèles doivent subir quelques modifications pour pouvoir fonctionner avec cette nouvelle version. Si d'anciens modèles ne marchent plus avec NetLogo 4.0, ce chapitre du manuel de l'utilisateur peut être une aide précieuse pour faire les mises à jour nécessaires.
Ce à quoi vous devez faire attention dépend de l'âge des modèles à adapter. Plus la version de NetLogo avec laquelle le modèle a été développé et mis au point est ancienne, plus les choses auxquelles vous devrez faire attention sont nombreuses.
Ce chapitre ne dresse pas une liste exhaustive de toutes les modifications qui ont été faites pour aboutir à NetLogo 4.0. Il ne présente que les changements qui sont d'une certaine importance pour les utilisateurs. Consultez la section Quoi de neuf? pour une liste complète des modifications apportées aux versions sucessives de NetLogo.
Avant NetLogo 4.0, le numéro d'identification (who number) d'une tortue morte (enregistré dans le variable tortue who de chaque tortue) pouvait être réaffecté à une tortue nouveau-né par la suite. Avec NetLogo 4.0, les numéros d'identification ne sont jamais réutilisés avant que la numérotation n'ait été réinitialisée à 0 par la commande clear-all ou par la commande clear-turtles. Cette modification du comportement de la numérotation peut empêcher le bon fonctionnement de quelques anciens modèles.
NetLogo 4.0 offre deux commandes observateur différentes pour créer de nouvelles tortues, create-turtles (en abrégé crt) et create-ordered-turtles ( cro en abrégé).
crt donne aux nouvelles tortues des couleurs et des orientations (caps) aléatoires (nombres entiers). cro distribue les couleurs séquentiellement et donne aux tortues des caps répartis séquentiellement et équitablement distribués sur les 360 degrés du cercle, la première tortue pointant vers le haut (donc vers le Nord) avec un cap de 0 degré.
Avant NetLogo 4.0, la commande crt se comportait de la même manière que le fait maintenant la commande cro. Si le bon fonctionnement de votre ancien modèle dépend d'une distribution ordonnées des tortues à leur création, vous devez modifier le code de votre modèle et remplacer la (les) commande(s) crt par une (des) commande(s) cro.
Il n'est pas rare que les anciens modèles qui utilisent crt contiennent aussi des commandes supplémentaires pour distribuer aléatoirement les caps des nouvelles tortues, par exemple rt random 360 ou set heading random 360. Ces commandes ne sont plus nécessaires quand elles sont utilisées avec des commandes crt.
Avant NetLogo 4.0, l'opérateur + (addition) pouvait être utilisé aussi bien pour concaténer des chaînes de caractères que pour joindre des listes. Avec le NetLogo actuel, l'opérateur + ne fonctionne plus qu'avec des nombres. Pour concaténer des chaînes, il faut utiliser la primitive word, et pour joindre des listes, il faut se servir de la primitive sentence. Ces modifications ont été faites pour accélérer la vitesse d'exécution du code qui utilise l'opérateur +.
Ancien code :
print "Il y a " + count turtles + " tortue."
Nouveau code :
print (word "Il y a " count turtles " tortues.")
De même, si vous devez joindre des listes, utilisez sentence
Cette modification ne se fait pas automatiquement lors de la conversion des anciens modèles. Les utilisateurs doivent changer leurs codes à la main.
Nous sommes bien conscients que cette modification est gênante pour les utilisateurs habitués à l'ancienne syntaxe. Nous avons procédé à ce changement pour des raisons d'efficacité et de consistance du code. En effet, nous pouvons implémenter un opérateur d'addition qui n'additionne que les nombres de manière bien plus efficace qu'un opérateur qui doit manipuler plusieurs types de données très différents. Et comme l'addition est une opération très courante, c'est la vitesse générale de NetLogo qui en bénéficie.
L'observateur ne peut plus utiliser les primitives patch-at, turtles-at et breeds-at. Il faut les remplacer par les primitives patch, turtles-on patch et BREEDS-on patch. Notez que patch arrondit maintenant ses entrées (avant il n'acceptait que des nombres entiers en entrée).
NetLogo 3.1 avait la possibilité d'utiliser des liens pour connecter les tortues dans le but de construire des réseaux, des graphes et des figures géométriques. Ces liens étaient eux-mêmes des tortues.
Dans NetLogo 4.0, plutôt que d'être des tortues, les liens forment maintenant un quatrième type d'agents indépendant, à côté de l'observateur, des tortues et des patches. Les primitives qui utilisent des liens ne sont dorénavant plus considérées comme expérimentales, elles font maintenant pleinement parties du langage.
Les modèles qui utilisent les anciennes primitives de liens expérimentales basées sur les tortues devront êtres mis à jour pour utiliser à la place les agents de types lien. Les différences ne sont pas énormes, mais une mise à jour « à la main » est nécessaire.
Les liens sont discutés en détails dans la section Liens du Guide de la programmation et dans les entrées du Dictionnaire NetLogo relatives aux primitives dédiées aux liens. Consultez la section "Networks" de la Bibliothèque des modèles ("Models Library") pour des exemples de modèles qui utilisent les liens. Il y a aussi quelques exemples dans la section "Code Examples".
D'abord, vous devez éliminer toutes les races appelées links si vous n'utilisez qu'un seul type de liens car dans ce cas, vous n'avez pas du tout besoin d'utiliser des races. Si vous utilisez plusieurs types de liens, intéressez-vous aux commandes undirected-link-breeds et directed-link-breeds. Les commandes et les reporters qui contiennent le mot links dans leur nom (tels que __create-links-with, etc.) seront automatiquement convertis dans leurs nouvelles versions dépourvues des caractères de soulignement (create-links-with). Toutefois, les primitives qui utilisent un nom de race différents (tel que edges) ne sont pas converties. Vous devez enlever ces caractères de soulignement à la main, et à moins que vous ne déclariez une race de liens avec ce nom, vous devez aussi remplacer la désignation de la race par links.
Les commandes remove-link(s)-with/from/to n'existent plus. À la place, vous devez dire au lien de « mourir » avec la primitive die.
Par exemple :
ask turtle 0 [ __remove-links-with link-neighbors ]
devient
ask turtle 0 [ ask my-links [ die ] ]
Plusieurs commandes d'agencement (layout) des tortues ont des entrées légèrement différentes : les deux premières entrées sont en général un ensemble d'agents de type tortue et un ensemble d'agents de type lien qui seront utilisés pour constituer l'agencement. Pour les détails, consultez dans le dictionnaire les entrées des primitives layout-spring, __layout-magspring, layout-radial et layout-tutte
Vous devrez peut-être aussi réarranger la déclaration des variables turtles-own puisque les liens ne sont maintenant plus de véritables tortues. Toutes les variables qui concernent les liens doivent être déplacées dans un bloc links-own.
Puisque les liens ne sont plus des tortues, ils ne possèdent plus de variables tortues préprogrammées (bien que certaines variables lien soient les mêmes, telles que color et label). Si vous avez utilisés la position d'anciens liens (de type tortue), vous devez maintenant calculer le point placé au milieu du lien. Ce qui est relativement simple dans un monde non « enroulé ».
to-report link-xcor report mean [xcor] of both-ends endBien qu'un peu plus compliquée dans un monde « enroulé », la conversion reste quand même assez compréhensible :
to-report link-ycor report mean [ycor] of both-ends end
to-report link-xcor let other-guy end2 let x 0 ask end1 [ hatch 1 [ face other-guy fd [distance other-guy] of myself / 2 set x xcor die ] ] report x end
il en va de même avec ycor.
Si vous avez utilisé soit la taille, soit le cap de liens-tortues, vous pouvez utiliser à la place les primitives link-length et link-heading
Nous avons remplacé les trois constructions de langage -of (avec trait-d'union), value-from et values-from par la seule construction of (sans trait-d'union).
ancienne | nouvelle |
---|---|
color-of turtle 0 | [color] of turtle 0 |
value-from turtle 0 [size * size] | [size * size] of turtle 0 |
mean values-from turtles [size] | mean [size] of turtles |
Quand of est utilisé avec un seul agent, il retourne une seule valeur. Quand il est utilisé avec un ensemble d'agents, il retourne une liste de valeurs (rangées dans un ordre aléatoire puisque les agents d'un ensemble d'agents sont toujours rangés dans un ordre aléatoire).
Notez que quand vous ouvrez un ancien modèle avec la nouvelle version de NetLogo, les anciennes primitives -of, value-from et values-from sont automatiquement convertie pour utiliser of, mais certaines utilisations imbriquées de ces constructions sont trop compliquées pour le convertisseur automatique et doivent être adaptées à la main.
La commande ask active maintenant ses agents de manière sérielle plutôt qu'en concurrence. En d'autres mots, les agents appelés sont activés un à la fois, les uns après les autres. Ce n'est qu'une fois qu'un agent a terminé toutes les tâches définies dans la commande ask que l'agent suivant peut de « mettre au travail ».
Notez que même l'ancienne commande ask n'a jamais vraiment été concurrente; nous simulions l'exécution concurrente des tâches en entrelaçant le travail des agents au moyen d'un mécanisme « chacun son tour » tel que décrit dans les NetLogo FAQ.
Nous avons procédé à cette modification de comportement car, selon notre expérience, les utilisateurs écrivaient souvent du code qui conduisaient leurs modèles à se comporter de manière inattendue en raison du comportement concurrentiel simulé, mais n'écrivaient que rarement des modèles qui profitaient pleinement de ce type de comportement. Les modèles qui présentent un comportement inattendu, voire bizarre, devraient normalement pouvoir être « ramenés à la raison » en ajoutant des commandes without-interruption aux bons endroits, mais il était difficile pour les utilisateurs de savoir si cette commande était vraiment indispensable et si oui, où la mettre.
Avec NetLogo 4.0, without-interruption n'est plus nécessaire à moins que votre modèle n'utilise la primitive ask-concurrent (ou qu'un bouton "forever" de tortue ou de patch ne contienne du code qui dépende de la concurrence simulée). Dans la plupart des modèles, toutes les utilisations de without-interruption peuvent être supprimées.
La concurrence simulée autrefois utilisée par ask est toujours réalisable de trois manières :
Notez toutefois que la commande ask elle-même est toujours sérielle, quel que soit le contexte dans lequel elle est utilisée.
Dans notre Bibliothèques des modèles, les modèles qui font usage de cette concurrence sont rares. Le modèle "Termites" en est un exemple remarquable car il utilise la concurrence d'un bouton tortue "forever".
NetLogo possède maintenant un compteur de cycles pour représenter l'écoulement du temps de la simulation.
Vous faites avancer le compteur de cyple par pas d'une unité de temps avec la commande tick. Si vous devez lire sa valeur, utilisez le reporter ticks. La commande clear-all remet le compteur de cycles à zéro, tout comme le fait aussi la commande reset-ticks.
Dans la plupart des modèles, la valeur du compteur cycle (le temps écoulé depuis sa mise en route ou sa dernière réinitialisation) est un nombre entier, mais si vous devez utiliser des incréments de temps plus petits, vous pouvez vous servir de la commande tick-advance pour faire avancer ce compteur de cycles de n'importe quelle valeur, y compris d'une valeur fractionnaire. Le modèle "Vector Fields" et les modèles du groupe "GasLab" de la Bibliothèque des modèles sont des exemples de modèles qui utilisent tick-advance.
La valeur du compteur de cycles est affichée dans la partie droite de la barre de titre de la Vue 2D (ou de la Vue 3D). (Vous pouvez utiliser la boîte de dialogue "Model Settings" appelée par le bouton "Settings… " de la barre d'outils du panneau "Interface" pour cacher ou afficher ce compteur ou pour remplacer son intitulé par défaut ("ticks:") par quelque chose d'autre.)
Par le passé, NetLogo essayait toujours de mettre la Vue à jour environ 20 fois par seconde. Nous appelons maintenant ce genre de mises à jour « continuous » (continu). Le plus gros problème qu'elle pose est que vous voulez en général que les mises à jour de la Vue se fassent entre les cycles de la simulation et non au milieu d'un cycle. C'est pourquoi nous avons ajouté un bouton-menu dans la barre d'outils de l'interface qui permet de choisir entre une mise à jour continue ("continuous") de style ancien et une mise à jour à la fin de chaque cycle ("on ticks"). Et vous pouvez supprimer toutes les mises à jour au moyen de la case à cocher "view updates". Vous pouvez aussi empêcher les mises à jour avec la commande no-display et les remettre en fonction avec la commande display.
NetLogo permet toujours les mises à jour continues. C'est d'ailleurs le réglage par défaut au démarrage du programme. Mais la plupart des modèles de la Bibliothèques des modèles utilisent maintenant les mises à jour commandées par les cycles. Avec les mises à jour basées sur les cycles, celles-ci n'ont lieu qu'au moment où le compteur de cycles avance. (La commande display peut être utilisée pour forcer des mises à jour supplémentaire; voir ci-dessous).
Les avantages des mises à jour basées sur les cycles telles que nous venons de les voir sont les suivants :
Comme mentionné ci-dessus, la plupart des modèles de notre Bibliothèque des modèles utilisent maintenant les mises à jour basées sur les cycles.
Même pour les modèles dont les mises à jour sont normalement basées sur les cycles, il peut être utile de basculer en mode mises à jour continues de manière temporaire lors de la mise au point du modèle. Observer en détail ce qui se passe au cours d'un cycle plutôt que de ne voir que le résultat final du cycle peut être d'une aide non négligeable pour trouver la (ou les) cause(s) d'un dysfonctionnement du modèle.
Si vous modifiez votre modèle pour qu'il utilise les mises à jour basées sur les cycles, vous devez aussi ajouter la commande tick à votre code, sinon le Vue ne sera jamais mise à jour. (Notez toutefois que la Vue est encore toujours mise à jour quand un bouton se relève ou quand une commande passée dans le Centre de commande a fini son travail. Donc il n'y a pas de raison que la Vue reste figée indéfiniment).
Voici les étapes à suivre pour convertir votre modèle de manière à ce qu'il utilise les cycles et les mises à jour basées sur les cycles offerts par NetLogo 4.0 :
Certains modèles nécessiteront des modifications supplémentaires, à savoir :
Les versions précédentes de NetLogo possédaient un curseur vitesse qui pouvait être utilisé pour ralentir la simulation des modèles de manière à ce que l'utilisateur puisse bien voir ce qui se passe.
Dans NetLogo 4.0, ce curseur peut aussi être utilisé pour accélérer la simulation des modèles. Il le fait en diminuant la fréquence de rafraîchissement de la Vue. La mise à jour de la Vue prend du temps, donc moins il y a de mises à jour, plus le modèle tourne rapidement.
La position par défaut du curseur se trouve au milieu de l'échelle, à la position notée "normal speed".
Plus vous éloignez le curseur de sa position centrale, plus vous ralentissez ou accélérer la simulation.
À de très hautes vitesses, les mises à jours de la Vue deviennent peu fréquentes et il peut se passer plusieurs secondes entre deux mises à jours. On pourrait alors croire que la simulation tourne plus lentement puisque les mises à jour se font plus rares. Mais si vous observez le compteur de cycles ou d'autres indicateurs tels que les traceurs, vous verrez bien qu'en réalité la simulation se déroule beaucoup plus vite. Si ces mises à jour peu fréquentes vous déconcertent, ne déplacez pas le curseur si loin vers la droite.
Si la mise jour basée sur les cycles est activée, le ralentissement de la simulation ne provoquera pas une augmentation des mises à jour. NetLogo fait plutôt une pause après chaque cycle.
Si la mise à jour continue est activée, le ralentissement de la simulation signifie que les mises à jour se font de manière plus rapprochée. Si vous déplacez le curseur vitesse plus loin que la moitié de son chemin vers la gauche, la simulation se fait si lentement que vous pouvez voir les tortues se déplacer les unes après les autres ou décomposer leurs déplacements complexes en plusieurs segments de droite! Ce comportement a été introduit avec NetLogo 4.0. Dans les versions précédentes, aussi loin vers la gauche que vous déplaciiez le curseur, vous ne pouviez jamais voir les agents obéissant à une commande ask se déplacer les uns après les autres; tous les agents soumis cette commande paraissaient toujours se déplacer tous ensemble.
NetLogo ne fait maintenant plus, en interne, de différence entre les nombres entiers et les nombres en virgule flottante. Ainsi, par exemple :
Avant :
observer> print 3 3 observer> print 3.0 3.0 observer> print 1 + 2 3 observer> print 1.5 + 1.5 3.0 observer> print 3 = 3.0 true
La dernière ligne montre que même si la distinction entre le nombre entier 3 et le nombre en virgule flottante 3.0 est maintenue, les deux nombres sont quand même considérés comme égaux.
Nouveau :
observer> print 3 3 observer> print 3.0 3 observer> print 1 + 2 3 observer> print 1.5 + 1.5 3 observer> print 3 = 3.0 true
Nous pensons que bien peu de modèles seront pénalisés par cette modification.
Un avantage de ce changement est que, maintenant, NetLogo supporte un bien plus grand ensemble de nombres entiers. L'ancien ensemble allait de -2'147'483'648 à 2'014'704'830'647 (environ +/- 2 milliards) alors que le nouvel ensemble va de -9'007'199'254'740'992 à +9'007'199'254'740'992 (environ +/- 10 millions de milliards).
NetLogo 3.1 (et quelques versions plus anciennes) contenaient des primitives appelées turtles-from and patches-from qui étaient occasionnellement utilisées pour construire des ensembles d'agents. Dans NetLogo 4.0, ces primitives ont été remplacées par de nouvelles primitives appelées turtle-set et patch-set qui sont bien plus souples et plus puissantes. (link-set existe aussi.) Consultez les entrées de ces primitives dans le Dictionnaire NetLogo. Les modèles qui utilisent les anciennes primitives turtles-from et patches-from doivent être modifiées à la main pour utiliser les nouvelles primitives.
En NetLogo 3.1, les couleurs RGB et HSB pouvaient être transformées plus ou moins fidèlement en couleurs NetLogo au moyen des primitives rgb et hsb. Ces dernières ont été renommées approximate-rgb et approximate-hsb et acceptent maintenant des entrées allant de 0-255 et plus seulement de 0-1.
Maintenant, NetLogo peut travailler avec la totalité du spectre des couleurs RGB, c'est pourquoi il n'est plus nécessaire d'utiliser ces procédures. Vous pouvez transmettre à n'importe quelle variable de couleur une liste formée des trois nombres désignant une couleur au format RGB, avec des valeurs allant de 0-255 pour chaque couleur de base et obtenir ainsi la couleur exacte. Voir la section Les couleurs du Guide de la programmation pour plus de détails.
Dans les versions précédentes, la primitive __tie (attache) n'était encore qu'une fonctionnalité expérimentale. Avec NetLogo 4.0, les liens ont reçu une variable tie-mode qui peut prendre (et donc recevoir) les valeurs "none", "free" ou "fixed". Dans sa version 4.0, tie est devenue une primitive exclusivement réservée aux liens. Ce qui veut dire que pour attacher la tortue 1 à la tortue 0, vous devez écrire :
ask turtle 0 [ create-link-to turtle 1 [ tie ] ]
Consultez la section L'attache du Guide de la programmation pour de plus amples informations.
L'interface de l'activité client de HubNet n'est plus stockée dans un fichier de modèle séparé. Pour importer un client d'un ancien modèle, aller dans le menu "File", sous-menu "Import", commande "Import HubNet Client Interface…". Puis, quand c'est demandé, importez depuis le panneau "Interface". Vous n'aurez plus besoin du modèle de client externe et vous n'aurez plus à le pointer quand vous installerez l'interface client. Donc,
hubnet-set-client-interface "COMPUTER" [ "my-client.nlogo" ]
devient :
hubnet-set-client-interface "COMPUTER" []
L'implémentation interne des listes a été changée, ce qui modifie les performances des certaines opérations effectuées sur ces listes. Voir la section Les performances des listes du Guide de la Programmation pour des informations détaillées concernant l'implémentation actuelle des listes.
Notez déjà que la primitive fput est plus rapide que la primitive lput, c'est pourquoi vous pouvez augmenter les performances de votre modèle simplement en remplaçant lput par fput puis en inversant éventuellement la liste obtenue. Si le problème des performances persiste, pensez à utiliser les primitives de l'extension Array & Table.
Si votre modèle se comporte de manière étrange ou incorrecte, c'est peut-être à cause du fait que, depuis NetLogo 3.1, les agents d'un ensemble d'agents sont toujours rangés dans un ordre aléatoire, ordre qui change chaque fois qu'une opération est effectuée sur l'ensemble. Dans les versions antérieures de NetLogo, les agents des ensembles étaient toujours rangés dans le même ordre. Si votre code dépend d'agents rangés dans un ordre déterminé, il ne peut plus fonctionner correctement. La manière de résoudre ce problème afin que votre modèle puisse fonctionner avec des ensembles d'agents rangés aléatoirement dépend des détails de ce que fait votre code. Dans certaines situations, il peut s'avérer bénéfique d'utiliser les primitives sort ou sort-by pour convertir un ensemble d'agents (rangés aléatoirement) en une liste d'agents (rangés en ordre déterminé). Consultez la partie "Les listes d'agents" de la section Les listes du Guide de la Programmation.
Si vous voyez des bouts de formes de tortues apparaître sur le bord opposé du monde, c'est parce que NetLogo 3.0 permettait de désactiver un tel « enroulement » dans la Vue sans influencer le comportement du modèle. Depuis NetLogo 3.1, si vous ne voulez pas que la Vue soit « enroulante », vous devez faire en sorte que le monde lui-même ne s'enroule pas en utilisant les fonctionnalités nouvelles apportées par la topologie. Toutefois, procéder à ces modifications peut vous amener à apporter encore d'autres changements à votre modèle. Consultez la section La topologie du Guide de la programmation pour une présentation détaillée des méthodes à utiliser pour convertir le modèle afin qu'il puisse bénéficier de cette nouvelle fonctionnalité qu'est la topologie.
De nombreux modèle créés avec NetLogo 3.0 (ou antérieur) utilisent le code setxy random world-width random world-height pour disperser aléatoirement les tortues, parfois random étant remplacé par random-float. Mais ceci ne fonctionne que si l'enroulement autour du monde est activé.
(Mais pourquoi cela? Parce que, quand l'enroulement est activé, vous pouvez donner aux coordonnées des tortues des valeurs qui vont au-delà des limites du monde et NetLogo « enroule » alors la tortue et la fait « revenir » par le bord opposé du monde. Mais dans les mondes qui ne sont pas « enroulants », donner à une tortue des coordonnées x ou y qui la placerait en dehors des limites de ce monde conduit à une erreur d'exécution. La possibilité d'avoir un monde « enroulant » a été donnée à NetLogo 3.1. Consultez la section La topologie du Guide de la programmation pour des informations supplémentaires.
Pour corriger votre modèle de manière à ce qu'il se comporte correctement quelle que soit la topologie du monde, utilisez plutôt l'une de ces deux commandes :
setxy random-xcor random-ycor setxy random-pxcor random-pycor
Ces deux commandes sont un peu différentes. La première place la tortue sur un point du monde choisi au hasard. La seconde place la tortue au centre d'un patch choisi au hasard. Une manière encore plus concise de placer la tortue au centre d'un patch choisi aléatoirement est :
move-to one-of patches