IFT3330/6330 Intelligence artificielle Devoir 2 - planification (à rendre avant midi le 21 novembre) 1. Description du problème Ce devoir consiste à réaliser un algorithme de planification POP - Partial Order Planifier - en Prolog. Cet algorithme est décrit dans le livre de référence Russell et Norvig. Le but de ce devoir est de vous permettre d'avoir un contact concret avec la réalisation d'un tel algorithme. 2. Application Nous considérons l'application dans le monde des blocs. Le problème est comme décrit dans le livre. Plus précisément: Il y a un certain nombre de blocs de même taille sur une table, et un bras mécanique. Ce bras mécanique peut prendre un bloc si ce bloc est libre (i.e. aucun autre bloc n'est sur lui) et le déplacer à un autre endroit, soit sur la table, soit sur un autre bloc libre. On suppose que la table est suffisamment grande, donc un bloc peut toujours être mis sur la table. Le bras mécanique ne peut pas saisir plus d'un bloc à la fois. Le programme de planification doit planifier une suite d'opérations par le bras mécanique pour transformer une configuration de blocs en une autre. 3. Votre programme L'algorithme de POP est décrit dans le livre (pp. 356). Cependant, cet algorithme ne donne pas tous les détails (e.g. comment tester SOLUTION(plan), et comment faire SELECT-SUBGOAL(plan)). C'est à vous de compléter ces détails selon vos jugements. Toue réalisation raisonnable de ces détails sont acceptés. L'objectif principal est la réalisation globale de la planification. Il est aussi à noter qu'il est possible de modifier certains détails de l'algorithme pour mieux l'adapter au langage Prolog. En ce qui concerne la représentation d'une situation, on impose la façon suivante: Une situation est représentée comme une liste de prédicats. Chaque prédicat décrit un aspect de la situation. Par exemple, la situation suivant: est représentée par: [on(a,b), clear(a), clear(c), on(b, table), on(c,table)]. a b c Un plan est composé d'une liste d'opérations. Comme dans le livre, nous définissons les deux opérations suivantes: move(B,X,Y): pour déplacer le bloc B de X à Y move_to_table(B,X): pour déplacer le bloc B de X à la table. Si la configuration finale est la suivante: b c a Le plan doit idéalement contenir: [move_to_table(a,b), move(c,table,a), move(b,table,c)]. Finalement, l'algorithme POP résulte seulement en un plan partiellement ordonné qui n'est peut pas être exécuté par le bras mécanique. Il est aussi nécessaire de créer un plan totalement ordonné à partir de ce plan partiellement ordonné. C'est aussi à vous d'imaginer une façon pour le réaliser. Concrètement, votre programme doit contenir un prédicat planifier(Debut, Final, Plan) où Debut et Final représentent respectivement la situation de départ et la situation finale, et Plan doit contenir le plan (totalement ordonnée) que votre programme doit trouver. Pour ce devoir, le nombre de blocs dans ce monde n'est pas fixe. Chaque bloc est représenté par une constante différente de table. 4. Comparaison avec la recherche La recherche en profondeur d'abord peut aussi être utilisée pour trouver un plan. Pour pouvoir comparer, on vous demande aussi de programmer un autre prédicat recherche(Debut, Final, Plan). Dans votre rapport, vous devez comparer cette planification par la recherche avec celle avec POP. 5. Remise La date limite de la remise (par le programme remise) est le 21 nov. avant midi. Le rapport contenant une description de votre réalisation et une discussion et comparaison, d'environ 3-5 pages, doit être rendu le même jour. Chaque jour de retard pour la remise entraînera 1 point de pénalité. 6. Évaluation Ce devoir compte pour 12 points et doit être réalisé par en groupe de 2 personnes (ou seul). Les points sont attribués de la façon suivante: - Réalisation de l'algorithme POP: 5 points - Créer un plan ordonné à partir d'un plan partiellement ordonné: 2 points - Réalisation de planification par la recherche: 2 points - Rapport: 3 points