|
Création d'intelligence artificiel
|
|
Table des matières
Création d'intelligence artificielIntroductionL'intelligence artificiel est une discipline assez vaste, ici nous nous concentrerons sur une approche utilisable dans le domaine des jeux en ligne. De plus sachez que je(initiateur de l'article) ne suis pas du tout une référence j'ai tous juste suivis quelques cours sur le sujet. Cette article est donc parfaitement perfectible, et vous pouvez bien entendu l'améliorer. Qu'entends t'on par IA?IA forte et IA faibleEn fait, il y a plusieurs type d'IA, certains chercheurs vont jusqu'à tenter de reproduire le mécanisme de la pensée et donc la conscience de soi, c'est ce qu'on appelle des IAs fortes! Mais nous nous faisons des jeux en ligne et donc on va s'intéresser plutôt aux IA faibles, à savoir des algorithmes qui simulent l'intelligence. Attention faible ne veut pas dire que c'est facile à faire, de nombreux problèmes d'IAs faibles n'ont pas trouver de solutions optimales ou assez rapides. Voici quelques exemples de problème qu'on peut classer dans les IAs faibles:
Les heuristiquesComme nous l'avons vu au dessus certains problèmes sont (trop) complexes. Cependant, ils peuvent être simplifié à l'aide d'heuristique c'est à dire à l'aide d'algorithmes faisant appels à des connaissances pour résoudre le problème plus vite mais de façon non optimale. C'est par exemple ce que fait l'algorithme A star très connu dans le domaine du jeu vidéo et qui permet de calculer un des plus court chemin. En l'occurrence l'heuristique qu'utilise A* c'est d'“avancer vers la destination”. C'est d'ailleurs une heuristique assez intuitive. Puis si on se trouve dans un cul de sac on rebrousse chemin et on condamne la zone. C'est d'ailleurs ce qui avait été oublié dans Age Of Empire 1 du coup les bonshommes restaient coincés dans un cul de sac formé par l'eau. Comment faire?Et oui c'est bien beau tout çà mais çà ne nous dit pas comment créer pratiquement une IA pour un jeuweb. Le problème c'est que c'est une vaste question, puisqu'elle revient à celle de la création d'un programme. Spécifier le besoinD'abord chercher à savoir ce que vous voulez faire, notamment avez vous besoin d'une solution parfaite et les ressources que vous seriez prêt à sacrifier pour avoir cette solution. N'oubliez pas qu'une IA simulant un adversaire doit rester possible à battre… Par exemple, nous voulons créer une IA capable de jouer au tictactoe. Et ce dans un temps assez cours, maximum 3 secondes de réflexion. Nous souhaitons que cette dernière soit battable mais suffisamment stratégique pour gagner si on joue mal. Décomposer le problèmePuis, il va vous falloir décomposer le problème afin d'en déduire la méthode et/ou les heuristiques(connaissances) à utiliser. Pour ce point vous pouvez chercher d'éventuel solution existantes à des problèmes identiques ou proches, vous pouvez aussi vous inspirer sur votre façon à vous de raisonner pour résoudre le problème. De nombreux algorithmes spécifiques au tictactoe ou valable pour l'ensemble des jeux de stratégie à tour existent. Mais la bonne question a se poser c'est comment je joue au tictactoe? Et bien pour ma part: - je connais le but à atteindre à savoir faire une ligne de 3 cases avec ma marques avant l'autre et avant qu'il n'y ai plus de cases vides - j'observe les cases vide ou je peux jouer - et je cherche à déterminer ce que l'autre pourrait jouer ensuite si je fais tel action. J'explore donc les solutions future pour un ensemble de case et j'en détermine quel est le meilleurs coup à jouer en essayant de maximiser mes chances d'atteindre le but en minimisant les chance de l'autre. - si il y a plusieurs partie j'essaie d'endormir l'autre joueur A noter qu'avant je connaissais (du moins je crois) tous les cas de figure, et avait donc une réponse automatique à chaque configuration du plateau. Notamment je me souviens des situations pièges soit parce que je les ai déjoué après une réflexion soit parce que j'ai perdu. Et bien la première solution est l'exact description de la méthode min max(en dehors d'endormir l'autre). Cette méthode peut aussi servir à jouer d'autre jeu sans trop de hasard comme les échecs ou un jeu comme age of empire. La seconde est due au fait que le tictactoe n'est pas un jeu très complexe du coup on peut aisément connaitre les solutions, on voit cependant l'intérêt de l'apprentissage que l'on peut voir un peu comme une mise en cache de situation déjà rencontré et qui ont nécessité un fort calcul par exemple. Traduire le tout dans un langagePuis il faut évidement traduire çà avec un langage de programmation, certains peuvent être plus adapté. Dans le cas du tictactoe je présenterais une implémentation en prolog. Ce dernier à l'avantage de fonctionner grâce à un moteur d'inférence d'ordre 1, ce qui permet de faciliter le développement de nombreuses solutions d'intelligence artificiels. Voici donc un exemples d'implémentation de la première méthode, il manque juste un petit facteur aléatoire pour choisir entre plusieurs solutions équivalentes:
Voici ce que donne un exemple d'utilisation, j'ai d'ailleurs perdu par inadvertance! A noter que cette IA peut être parfaite si on lui pose une profondeur égale a 9. Il conviendrait donc d'insérer un facteur d'erreur ou de la faire jouer avec une profondeur faible. | ?- [tictactoe]. compiling /home/ljf/test/tictactoe.pl for byte code... /home/ljf/test/tictactoe.pl compiled, 171 lines read - 21874 bytes written, 43 ms (8 ms) yes | ?- play([[e,e,e],[e,o,e],[e,e,e]],x,X,Y,P,5). P = 3 X = 1 Y = 1 (1472 ms) yes | ?- play([[x,o,e],[e,o,e],[e,e,e]],x,X,Y,P,5). P = 5 X = 2 Y = 3 (84 ms) yes | ?- play([[x,o,o],[e,o,e],[e,x,e]],x,X,Y,P,5). P = 10 X = 1 Y = 3 (4 ms) yes | ?- play([[x,o,o],[e,o,e],[x,x,o]],x,X,Y,P,5). P = 10 X = 1 Y = 2 yes | ?- end([[x,o,o],[x,o,e],[x,x,o]],Winner). Winner = x yes NB: il y a peut être un bug au niveau des profondeurs PrologProlog signifie Programmation Logique, il s'agit d'un langages qui peut être interprété ou compilé. Il existe de nombreux interpréteurs/compilateurs mais les plus connues sont swi-prolog, scitus-prolog(proprietaire) et gnu-prolog. Dans ces exemples j'utilise GNU Prolog. Ce qui est important de retenir c'est que prolog est base sur l'expressivité de la logique, on va bientôt découvrir de quoi je parle. Et Prolog peux déduire les choses grâce a son moteur d'inférence d'ordre 1. Le moteur d'inférenceUn moteur d'inférence est un système capable de déduire une réponse a une question grâce a une base de règle et de fait. Ça va peut être paraitre plus clair avec l'exemple typique de prolog:
Une fois la base de faits et de regles creer on peut l'interroger via l'interpréteur ou le code compilé. | ?- [grandfather]. %On charge le fichier grandfather.pl compiling /home/ljf/test/grandfather.pl for byte code... /home/ljf/test/grandfather.pl compiled, x lines read - x bytes written, x ms (x ms) yes | ?- father(S,stephan). %On demande de trouver les fils de stephan Son = john ?; Son = brian ?; no | ?- grandfather(brian,GF). %On demande de trouver le grand pere de brian GF = sam ? yes | ?- grandfather(brice,GF). %On demande de trouver le grand pere de brice no %Comme on ne l'a pas renseigné dans la base de faits ca nous renvoie no Programmation par contrainteUn autres avantages en Prolog est la programmation par contraintes. De quoi s'agit il?Pour faire simple certains problèmes sont juste des problèmes de contraintes. Avec Prolog, il suffit juste d'indiquer ces dernières et de lui demander de trouver une solution. Et ca marche pour beaucoup de problème a contrainte, cependant certains problèmes peuvent prendre trop de temps. Il est possible toutefois de pallier dans certains cas a ce problème en indiquant a prolog une heuristique, lors de la recherche de solution. Le sudoku est un très bon exemples de problèmes a contraintes. Dans le cas du sudoku il n'y a pas de notion d'ordonnancement des actions, il suffit juste de trouver les chiffres. Ainsi les contraintes sont: - une case ne peut contenir qu'un chiffre variant de 1 a 9 - les cases d'une ligne doivent contenir des chiffres tous différents - idem pour les colonnes - idem pour les 9 carrés du sudoku
| ?- [sudoku].
compiling /home/ljf/test/sudoku.pl for byte code...
/home/ljf/test/sudoku.pl compiled, 90 lines read - 18458 bytes written, 35 ms
(4 ms) yes
| ?- solve_sudoku(
[ 8,_,4,_,_,_,2,_,9,
_,_,9,_,_,_,1,_,_,
1,_,_,3,_,2,_,_,7,
_,5,_,1,_,4,_,8,_,
_,_,_,_,3,_,_,_,_,
_,1,_,7,_,9,_,2,_,
5,_,_,4,_,3,_,_,8,
_,_,3,_,_,_,4,_,_,
4,_,6,_,_,_,3,_,1
], Solution).
Solution = [ 8,7,4,6,5,1,2,3,9,
2,3,9,8,4,7,1,6,5,
1,6,5,3,9,2,8,4,7,
6,5,7,1,2,4,9,8,3,
9,4,2,5,3,8,7,1,6,
3,1,8,7,6,9,5,2,4,
5,2,1,4,7,3,6,9,8,
7,8,3,9,1,6,4,5,2,
4,9,6,2,8,5,3,7,1]
(4 ms) yes % Et voila le résultat 4ms pour trouver le sudoku en 90 lignes de code!
Interfacer prolog et un autre langageVous me dire qu'ils sont bien beau tous mes exemples en prolog, mais votre jeu est en PHP ou autre chose… Et bien ci dessous sont présentées quelques méthodes pour résoudre ce problème. Interpréteur prolog dans le langage en questionLa première méthode consiste en l'utilisation d'un interpréteur prolog construit avec le langage en questions. En PHPVous pouvez trouver sur ce lien http://www.stefan-baur.de/projects/simpleprologplusplus/ le seul interpréteur du genre (je pense). L'avantage:
Les inconvénients:
NB: je n'ai pas testé en ce qui concerne les performances, mais ca doit pas être le top du top. En RubyOn est très loin de la syntaxe mais les idées sont la notamment le moteur d'inférence Depot du projet Presentation rapide L'avantage:
Les inconvenients:
NB: je n'ai pas testé en ce qui concerne les performances, mais ca doit pas être le top du top. En CLa c'est très simple, il suffit d'utiliser les sources de gprolog ou équivalent, c'est la meilleure solution. Voici donc la page du manuel qui parle de ca. Il n'y a que des avantages pour le peu que c'est bien en C que vous faites votre projet! En Javahttp://sourceforge.net/projects/jprolog/ Le projet est pas mal avancé, mais n'implémente pas toutes les spécifications de prolog. Interfacer prolog via socketLa seconde méthode consiste a communiquer avec prolog via les socket. La plus part des langages le peuvent a condition que l'hébergeur accorde cette possibilité. Les avantages:
Les inconvénients:
Interfacer via system,exec ou exec_shellLa 3eme méthode consiste a utiliser les commandes d'exécution shell. C'est possible dans de nombreux langages a condition que l'hébergeur accorde cette possibilité. Ci dessous un exemple en php. Comme dans cet exemple:
Les avantages:
Les inconvénients:
— Zamentur 2010/03/04 00:50 |
|
tutoprog/creation_ia.txt · Dernière modification: 2011/04/03 14:06 (édition externe)
|
Discussion
Cet article est une ébauche de travail.
Idées possibles à développer:
Exemple avec le jeu power? Exemple avec un système de jeu de combat avec des cartes?