• Aucun résultat trouvé

IFT3330 Initiation à l'intelligence artificielle TP1 Le bal masqué présenté à M. Philippe Langlais par Nicola Grenon GREN30077303 (grenonni) le lundi 30 octobre 2006

N/A
N/A
Protected

Academic year: 2022

Partager "IFT3330 Initiation à l'intelligence artificielle TP1 Le bal masqué présenté à M. Philippe Langlais par Nicola Grenon GREN30077303 (grenonni) le lundi 30 octobre 2006"

Copied!
1
0
0

Texte intégral

(1)

IFT3330

Initiation à l'intelligence artificielle

TP1 Le bal masqué

présenté à M. Philippe Langlais

par

Nicola Grenon

GREN30077303 (grenonni)

le lundi 30 octobre 2006

(2)

Introduction

Nous avions à produire sous la forme apprise, à savoir en séparant la formulation du problème de celle de l'algorithme de recherche, une implantation du problème du Bal Masqué ainsi que trois algorithmes de recherche visant à maximiser la diversification des costumes.

Le Java s'est présenté comme un outil aisément accessible pour implanter ce programme, en particulier grâce à l'avantage structurant que représentent les interfaces et la réutilisation de code que permet l'héritage. En effet, en particulier, l'encodage des trois algorithmes choisis a été franchement simplifié en n'ayant qu'à reprogrammer une méthode plutôt que toute la classe Solveur. Le seul compromis à ce niveau fut d'admettre dans la classe mère quelques variables et tests utilitaires.

Somme toute, qui plus est, ce code est déjà partiellement une réutilisation des TP déjà écrits et sera sans doute réutilisé à l'avenir s'il devenait pertinent de reprogrammer des structures similaires. Un langage de la famille List aurait sans doute permis une plus grande optimisation et un code plus court, mais le choix actuel m'aura permis de travailler dans un environnement simple, familier en plus de me permettre, comme je le disais précédemment, une réutilisation abondante du travail déjà accompli.

Techniques de recherche

Les trois techniques de recherches qui ont été implémentées sont la recherche en largeur (comme méthodologie de recherche complète locale), la recherche en profondeur limitée par une borne fixe (comme méthodologie à formulation partielle) et la recherche par «le meilleur d'abord» adjoint à une liste de longueur limitée pour représenter la frange.

La manière choisie pour implémenter le code, à savoir au moyen d'une classe abstraite dont je n'ai eu par la suite qu'à redéfinir la fonction d'ajout à la frange, m'a permis de représenter facilement ces trois méthodologies, mais aurait sans doute été un peu limitante et aurait due être adaptée pour des méthodologies plus complexes.

Par exemple, pour le recuit simulé, il aurait fallu aussi prévoir une structure adjacente pour évaluer la température. Une liste de tabou aurait toutefois été assez simple à incorporer tandis qu'un algorithme génétique aurait demandé une approche toute autre.

(3)

Complexité

Il devient vite apparent que la recherche en largeur telle qu'implémentée créer une frange d'une taille rapidement démesurée. Je tiens à souligner toutefois qu'avec un mécanisme de bits morts (qu'on ne peut changer dans une sous branche de l'arbre) j'ai réussi à obtenir de bien meilleurs résultats, car la frange n'était plus encombrée d'une multitude de noeuds à états identiques. Donc, la fouille en largeur est très gourmande pour ce qui est de l'espace mémoire et de plus, cela prend relativement beaucoup de temps pour descendre suffisamment dans l'arbre et atteindre des résultats intéressants.

L'algorithme en profondeur est quant à lui plus rapide à descendre dans l'arbre, mais cela ne nous assure en rien de trouver (dans ce contexte-ci!) une solution intéressante rapidement puisque la répartition des valeurs de diversité n'est pas proportionnelle à la distance. Somme toute, l'algorithme ne trouvera pas de solution plus rapidement que celui en largeur, mais là où on fait une économie, c'est au niveau de l'espace, mais pas tant que ça. Le fait de limiter rapidement la descente permet de forcer l'algorithme à envisager d'autres avenues et ainsi des grandes sections qui auraient autrement alourdi la frange ne sont pas incluses. Ceci dit, il faut quand même beaucoup d'espace pour parvenir à effectuer une recherche qui suivra suffisamment loin les branches pour permettre à des solutions payantes d'être développées.

La recherche se basant sur «le meilleur» est quant à elle beaucoup plus rapide.

Comme il y a une corrélation directe entre la valeur d'un état et celle d'un état voisin, il est très intéressant de d'abord naviguer «proche». Là où la fouille en profondeur ne pouvait pas tirer parti d'une approche «droit au but», celle-ci (encore une fois dans ce contexte particulier) le peut. On «zoom» rapidement sur ce qui est intéressant dans l'arbre... et le fait qu'on ait limité la frange à seulement les éléments les plus prometteurs nous permet de toujours garder l'espace employé sous contrôle. Le seul risque serait de faire quelques retours en arrière, mais ceux-ci sont rapidement mis de côté par le fait que la frange est triée comme une file de priorité.

(4)

Résultats

échantillon

\algorithme

Largeur Profondeur limitée Meilleur d'abord limité

petit 221 221 221

moyen 647 (!) 614 633

grand 45670 (!) 45436 (...) 47757 (...)

On note que pour de petits échantillons, les trois algorithmes ont trouvé la valeur optimale. Fait intéressant, grâce à l'économie des états redondants, l'algorithme en largeur a trouvé une très bonne solution pour l'échantillon de moyenne taille tout juste avant de planter par manque d'espace. Sinon, le meilleur d'abord semble déjà prendre un avantage sur l'Autre algorithme «incomplet» qu'est la fouille en profondeur.

Pour le gros échantillon, on peut clairement voir que là où l'algorithme en largeur piétine et où celui en largeur explose, le choix de suivre «le meilleur» donne un avantage manifeste avec une bien meilleure note finale... un bien meilleur party d'halloween.

Conclusion

Je conclurai en soulignant qu'il m'apparaît évident maintenant qu'avec la pratique, l'art de la formulation distincte du problème et de l'algorithme de recherche va m'apporter une capacité technique de formulation des problèmes vraiment bien plus puissante que ce que je pouvais faire avant.

C'est avec la pratique qu'on découvre des trucs et qu'on imagine des solutions de plus en plus élégantes telle l'utilisation de l'héritage Java pour simplifier de beaucoup le code. Il y a aussi le fait qu'avec le temps j'ai pu formuler le problème de façon plus efficace (en partant déjà d'une solution avec des costumes pour chacun par exemple ou en définissant la fonction successeur de telle sorte qu'elle évite intrinsèquement les états redondants dans le cas de la recherche en largeur sans avoir pour autant à ajouter des vérifications.)

Références

Documents relatifs

Le logiciel affiche un message d'information, ferme la session et après quelques secondes réinitialise l'écran.. 

Le logiciel affiche un message d'information, ferme la session et après quelques secondes réinitialise l'écran.

Il n'est pas clair ici si en allant dans cette section si on quittera le site vers une page publicisée externe ou si on restera dans une sous-section du site

Il faut éviter tout ce qui peut rendre désagréable son utilisation pour un utilisateur qui n'est pas rémunéré, ne pas présumer d'aucune habileté en ce qui a trait au commerce

- Pour les boutons des catégories et des items, comme ils sont nombreux, nous avons à tout le moins utilisé un arrangement aligné, mais surtout avec de gros boutons facile à

- L'usager peut entrer autant de messages qu'il veut pour les responsables et ce, en tout temps (même au milieu d'une facture!). Ce qui est aussi vrai pour l'arrêt de

Il faut toutefois noter que pour la souris et le touchscreen, il faudrait prévoir soit un clavier numérique, soit ajouter à l'interface un petit clavier tel que celui-ci en haut ou

Il faut toutefois noter que pour la souris et le touchscreen, il faudrait prévoir soit un clavier numérique, soit ajouter à l'interface un petit clavier tel que celui-ci en