Un concours organisé par les établissements du GROUPE ESIEA
Esiea  Intech
 
Mon espace candidat
Nom d'Utilisateur
Mot de passe

Mot de Passe oublié ?
 
Pas encore
candidat ?

 
A gagner avec Wingineer

1er prix
100% des frais de 5 ans de
scolarité !


2ème prix
Une bourse couvrant 50% des frais !


3ème prix
Une bourse couvrant 25% des frais !

Stratégies générales

Dans la mesure ou seules les actions avancer, s'orienter et tirer sont possibles (plus le pilotage des missiles), cela veux dire que tout tient dans les décisions stratégiques déclenchant ces actions au bon moment. Ces décisions dépendront de l'environnement du tank.

L'environnement est constitué d'agents, ils peuvent être de plusieurs types (appellés breed dans le langage Netlogo), le type général étant turtles. Ainsi tous les agents sont des turtles à la base, mais ont aussi un type plus spécifique.

Quand on va analyser l'environnement cela se fera donc par des demandes d'informations sur les turtles présentes. Netlogo permet de manipuler des groupes d'agent dans des variables et de les sélectionner en fonction de différent critères, ce qui est très pratique.

Voici un exemple de code d'évitement : Si il y a un agent en face du tank, tourner.

 

let t turtles in-cone 5 90
if any? t [ right 5 ]
move

 

Notez l'utilisation de l'instruction any? qui permet de tester s'il y a au moins un élément dans le groupe.

Problème : si vous regardez bien, le tank tourne en rond! En effet l'instruction in-cone (ainsi que in-radius) inclut aussi votre tank... Ainsi la variable t ainsi construite contient aussi votre tank, elle n'est donc jamais vide. C'est pour cela qu'il existe des « filtres » qui permettent d'exclure certains agents d'une liste. Ici, celui qui est le plus adapté est « other » qui veux dire « les autres » et qui permet donc d'exclure son propre tank d'une liste.

Voilà un code d'évitement qui fonctionne un peu mieux :

 

let t other turtles in-cone 5 90
if any? t [ right 5 ]
move

 

Cela fonctionne plutôt bien les tanks se déplacent sans trop rester coincés. Mais d'un point de vue stratégique, ce n'est pas bon du tout car le tank évite tous les agents (=turtles) or les étoiles (=stars) en sont aussi. Il nous faut donc exclure les étoiles de la sélection d'agents que nous avons mis dans la variable r. Pour cela le « filtre » with est parfait.

 

let t other turtles in-cone 5 90
set t t with [breed != stars] ; on ne sélectionne que les agents de type différent de « stars »
if any? t [ right 5 ]
move

 

Cela aurait pu aussi s'écrire plus directement :

 

let t other turtles in-cone 5 90 with [breed != stars]
if any? t [ right 5 ]
move

 

Les fonctions que nous venons de voir seront utiles pour analyser l'environnement d'un tank (ou d'un missile). Maintenant que vous avez compris le principe d'utilisation de ces fonctions, voici une méthode plus directe de contournement d'objets... La fonction move? répond à la question, « mon tank peut-il avancer ? ». Cette fonction a été écrite en utilisant les fonctions précédentes et gère les interactions entre les agents, le code devient alors :

 

if not move? [
  right 5
]
move

 

Notez ici l'utilisation de l'instruction not qui inverse la réponse de la fonction move? On peut alors traduire ce code par « si je ne peux pas avancer, je tourne de 5° à droite ».

Remarque, maintenant le robot n'évite plus les étoiles mais il ne les cherche pas non plus, il n'est donc pas très efficace d'un point de vue stratégique... À vous de mixer les exemples de code fournies dans ce document pour obtenir une stratégie complète, qui mène à la fois :

  • rechercher des étoiles

  • attaquer intelligemment

  • se défendre efficacement

Pour affiner encore les possibilités stratégiques vous pouvez obtenir bon nombre d'informations sur vos ennemis... Voici un exemple : une fois un robot isolé dans une variable, par exemple le robot le plus proche (donc un danger potentiel).

 

let r min-one-of other robots [distance myself]

 

On peut vouloir connaître un certain nombre de choses sur lui...

 

if r != nobody [
if score? t > score or energy? t < energy or id? t = "toto" [ fire]
]

 

Ce code décide de tirer sur le robot r, s'il a un score plus élevé que le vôtre ou s'il a moins d'énergie que vous (donc plus proche de l'explosion) ou si son identité est « toto »...

Dans le même esprit la fonction origin? donne l'identité de qui l'a tiré. Cela peut être très utile, dans cet exemple notre robot riposte directement sur qui lui à tiré dessus.

 

let m one-of missiles in-radius 4
if m != nobody [
face origin? m
if fired = 0 [fire]
]

Conclusion

Vous avez là déjà quelques bases pour élaborer des stratégies intéressantes, à vous de jouer ;-) .

Vous trouverez encore bien d'autres aides et conseils sur le forum du site Wingineer. Vous pourrez trouver un dictionnaire des fonctions disponible en Netlogo en explorant le menu « help » de l'interface ou à cette adresse :http://ccl.northwestern.edu/netlogo/docs/


 

Attention bien sûr à bien respecter la règle du jeu :

Vous êtes autorisé à lire toute information provenant de la simulation, vous êtes autorisé à agir sur la simulation mais uniquement avec les instructions : move, fire, right, left, face, appliquées à votre robot. Bien sûr vous avez le droit d'utiliser toutes les instructions de Netlogo vous aidant à produire les décisions de votre robot. Vous ne devez par contre en aucun cas agir directement sur le jeux (en essayant de modifier directement votre score, par exemple), cela serait considéré comme de la triche, votre code serait alors supprimé et votre score mis à 0 jusqu'à soumission d'un nouveau code respectant les règles.