--- tags: projet, SAT, dĂ©mineur --- [IA02] Projet Crocomine : les tigres 🐅, les requins 🩈 et les crocodiles 🐊 ================================================================= | Information | Valeur | | :------------ | :------------- | | **Auteurs** | Sylvain Lagrue ([sylvain.lagrue@utc.fr](mailto:sylvain.lagrue@utc.fr))| | | Khaled Belahcene (khaled.belahcene@utc.fr) | | **Licence** | Creative Common [CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0) | | **Version document** | 1.2.3 | <span style="font-size: 10rem">🐅 🩈 🐊</span> ## 0. Historique du document - 16/06/2011 (1.2.4) : changement du status quand il n'y a plus de carte - 11/06/2021 (1.2.3) : ajout d'une section Mise Ă  disposition de ressources - 07/06/2021 (1.2.2) : ajout s'une section FAQ - 31/05/2001 (1.2.1) : changement de nom `proxCount` -> `prox_count` dans le format de `Info` - 31/05/2001 (1.2.0) : ajout des rĂšgles 11 et 12 + prĂ©cision pour la rĂšgle 9 - 31/05/2001 (1.1.0) : premiĂšre version de l'API - 25/05/2021 (1.0.0) : version initiale du document ## 1. PrĂ©sentation du projet ### RĂšgles du jeu On considĂšre un monde 2D sous forme de grille de taille $m×n$ ($m$ lignes et $n$ colonnes). Les bords ne sont pas connectĂ©s. 1. Une case est soit de type terrestre, soit de type aquatique. 2. On rencontre parfois des animaux dangereux : des tigres, des requins, et des crocodiles. 3. Les tigres vivent sur la terre ferme, les requins vivent dans l'eau, et les crocodiles sont capables de vivre sur ces 2 habitats. 4. Sur une mĂȘme case, il ne peut y avoir qu'un seul animal. 5. Au dĂ©part est donnĂ© $m$, $n$, le nombre de tigres, le nombre de requins et le nombre de crocodiles, le nombre de terre et le nombre de mer et d'Ă©ventuelles statistiques sur la difficultĂ© de la carte (ex. l'indice 3BV). 6. Pour limiter le hasard, une case de dĂ©part, sans danger, est Ă©galement donnĂ©e. 7. Trois actions sont possibles : dĂ©couvrir une tuile (`discover`), deviner un tigre, deviner un requin et deviner un crocodile (`guess`) et enfin dĂ©couvrir en une fois l'ensemble des cases non dĂ©couvertes autour d'une case dont tous les animaux ont dĂ©jĂ  Ă©tĂ© trouvĂ©s (`chord`). 8. Pour chaque case dĂ©couverte, on aura un triplet reprĂ©sentant le nombre de tigres, de requins et de crocodiles ainsi que le type de la case. Si une case n'est entourĂ©e d'aucun animal, toutes ses cases adjacentes seront automatiquement dĂ©couvertes (et ainsi de suite rĂ©cursivement). 9. Toute erreur (par exemple un mauvais `guess`) entraĂźne la mort de l'explorateur et la fin de la carte. 10. La carte est gagnĂ©e lorque toutes les cases libres ont Ă©tĂ© dĂ©couvertes et les animaux devinĂ©s correctment. 11. Lors d'une dĂ©couverte de tuile, si tout s'est bien passĂ©, vous ĂȘtes informĂ©s du type de terrain des cases adjacentes. 12. Lors d'une devinette, si celle-ci est juste, vous ĂȘtes informĂ©s du type de terrain de la case devinĂ©e. ## Exemple de monde ![](https://i.imgur.com/sm6zzQb.png) ## 2. En pratique ### Travail demandĂ© On demande de rĂ©aliser un joueur artificiel capable de communiquer avec un serveur de jeu, de lui communiquer ses coups et de prendre en compte les informations fournies en retour, de maniĂšre Ă  deviner l'emplacement de tous les animaux et de dĂ©couvrir toutes les autres cases. Il est trĂšs fortement suggĂ©rĂ© d'utiliser un solveur SAT pilotĂ© Ă  l'aide d'un programme Ă©crit en Python. La partie rĂ©seau sera fournie. ### Contraintes - Les Ă©tudiants sont organisĂ©s par binĂŽmes, sous le rĂ©gime de la *communautĂ©* (de la gloire comme de l'infamie). Il est fortement recommandĂ© que les membres d'un mĂȘme binĂŽme partagent le mĂȘme groupe de TP, afin de profiter au mieux de ces sĂ©ances. - Vous devez partager avec vos enseignants (rĂŽle *reporter*) de TP le projet gitlab UTC **privĂ©** avec des commits rĂ©guliers. - Toute triche dĂ©tectĂ©e (rĂ©cupĂ©ration de code sur Internet, plagiat, etc.), sera sanctionnĂ©e au mieux d'un 0 au projet (et donc de la perte de l'UV). - NĂ©anmoins, il est possible de trouver des techniques sur Internet, de discuter entre vous, etc. ### Évaluation DiffĂ©rents classements seront proposĂ©s. Par exemple : - Plus longue sĂ©rie de victoire (*streak*) - Nombre total/moyen de cases/tigres/requins/crocodiles bien dĂ©couverts - Temps moyen de rĂ©solution - Classements par taille/difficultĂ© - etc. Ces diffĂ©rents classements rentrent en compte dans l'Ă©valuation, avec une incidence beaucoup plus forte sur ceux se focalisant sur des incides de qualitĂ©. ## 3. API *Work in progress* ### Les types de base ```python Status: str # "OK"|"KO"|"Err"|"GG" ``` - `"OK"` : l'action s'est bien passĂ©e - `"KO"` : l'action s'est mal passĂ©e, vous avez perdu - `"Err"` : l'action que vous demandez ne peut ĂȘtre rĂ©alisĂ©e - `"GG"` : l'action s'est bien passĂ©e et vous avez fini la grille ```python Msg: str ``` ```python Info: { "pos": [int, int], # (i, j) i < M, j < N "field": str # "sea"|"land" "prox_count": (int, int, int) # (tiger_count, shark_count, croco_count), optional } ``` ```python Infos = List[info] ``` ```python GridInfos: { "m": int, "n": int, "start": [int, int], "tiger_count": int, "shark_count": int, "croco_count": int, "sea_count": int, "land_count": int, "3BV": int, "infos": Infos # Optional } ``` ### Les actions #### Demande une nouvelle grille/grille suivante ```python def new_grid() -> Status, Msg, GridInfos ``` Certaines informations sur certaines cases peuvent ĂȘtre donnĂ©es. S'il n'y a plus de grille, le status est `Err`. #### DĂ©couverte ```python def discover(i: int, j:int) -> Status, Msg, Infos ``` Si la case est un `(0,0,0)` (c.-Ă -d. pas de tigre, pas de requin et pas de crocodile),toutes les cases vides sont rĂ©cursivement dĂ©couverte et leur type donnĂ©. Dans tous les cas, le type de terrain de la case dĂ©couverte est donnĂ©. #### Deviner ```python def guess(i: int, j:int, animal: str) -> Status, Msg, Infos ``` `animal` est Ă  choisir parmi `"T"`, `"S"`, `"C"` pour respectivement tigre, requin et crocodile. Si le guess est faux, la grille est perdue. Sinon, le type de terrain de la case `(i,j)` est toujours donnĂ©. #### Accord (facultatif) ```python def chord(i: int,j: int) -> Status, Msg, Infos ``` Fait un discover sur l'ensemble des cases contingentes qui n'ont pas Ă©tĂ© dĂ©couvertes autour de `(i,j)`. Ne compte que pour une seule action. ### Exemple *Work in progress* ## FAQ ### Quelle architecture pour le programme ? * Vous devez rĂ©aliser un logiciel qui reprĂ©sente un joueur artificiel dialoguant avec un environnement artificiel via le rĂ©seau. Les composants liĂ©s Ă  la communication (entrĂ©e et sortie) vous seront fournis. * Concentrez-vous sur la rĂ©alisation du joueur artificiel. ReprĂ©sentez les rĂšgles du jeu et votre base de connaissances comme il vous convient. La traduction en entrĂ©e et en sortie depuis ou vers l’environnement artificiel peuvent ĂȘtre traitĂ©s ensuite. * N’hĂ©sitez pas Ă  faire un usage abondant de la structure de dictionnaire, qui est Ă  la fois souple et efficace en python. * Pour convertir un problĂšme SAT au format DIMACS, l’usage de dictionnaires pour convertir les variables propositionnelles en entier et rĂ©ciproquement s’avĂšre particuliĂšrement pertinent (cf TP 2 et 3) * Votre joueur pourra faire appel Ă  un solveur SAT – on vous a fourni lors du TP 2 un exĂ©cutable de Gophersat, et lors du TP 3 une interface (sommaire) en Python vous permettant de dialoguer avec ce programme externe. Bien entendu, la modĂ©lisation du problĂšme, l’encodage au format DIMACS, et le dĂ©codage de la rĂ©ponse du solveur sont Ă  votre charge. * Les cartes typiques seront de taille infĂ©rieure Ă  1000 cases, mais certaines cartes seront grandes, par exemple 50x50. Assurez-vous que votre programme tienne la charge face Ă  de tels mondes, quitte Ă  prĂ©voir une approche plus simple (voire simpliste) dans ce cas. ### Conseils pour la modĂ©lisation logique * En ce qui concerne la modĂ©lisation, vous pourriez vouloir employer des contraintes du type « au plus $k$ variables parmi $x_1, 
, x_n$ » ou « au moins $k$ variables parmi $x_1, 
, x_n$ ». Nous avons traitĂ© en CM, TD et TP les cas $k = 0$, $k = 1$ et $k = 2$. Pour prendre en compte de plus grandes valeurs de $k$, il est possible de faire appel Ă  la fonction `combinations` du module `itertools`
 * Il se peut que vous vous retrouviez dans une situation oĂč vous ne parvenez Ă  faire aucune dĂ©duction. Nous vous recommandons de vous munir d’un trĂšfle Ă  quatre feuilles ou d’un fer Ă  cheval avant de choisir votre prochaine action. ### Quelques prĂ©cisions concernant nos attentes * Nous Ă©valuerons, Ă  travers votre programme, votre niveau d’appropriation et de maĂźtrises des techniques et concepts vus en cours, TD et TP. Il n’est donc ni nĂ©cessaire, ni suffisant de rĂ©aliser un joueur excellent pour obtenir une bonne note. * Ce n’est pas grave si vous ne faites pas toutes les cartes ! Personne ne pourra faire toutes les cartes, on veut des carte bien faites, pas des cartes bĂąclĂ©es. * En particulier, nous attendons que vous fournissiez un joueur capable de jouer sur une carte 15x15 en un temps raisonnable sans commettre d’erreur grossiĂšre. Les raffinements, qui peuvent par exemple concerner la capacitĂ© Ă  jouer rapidement, Ă  prendre en compte l’information globale (en particulier, la proportion d’animaux par rapport Ă  la taille du terrain), ou Ă  adopter une stratĂ©gie sophistiquĂ©e lorsque la dĂ©duction est mise en dĂ©faut, constituent des bonus apprĂ©ciĂ©s ## Mise Ă  disposition de ressources (serveur, client et cartes) * Crocomine est organisĂ© suivant une architecture client-serveur. La partie qui vous incombe, le *joueur*, se situe cĂŽtĂ© client. Le jour de la soutenance, votre joueur se connectera via internet au serveur que nous aurons mis en place. En attendant, nous vous fournissons une version minimale du serveur, qui a vocation Ă  ĂȘtre exĂ©cutĂ©e localement sur votre machine, afin de tester votre joueur. * Le programme crĂ©ant le serveur est disponible sur la page Moodle consacrĂ©e au projet, ainsi qu’un fichier contenant des cartes au format .croco et un script python permettant Ă  un client de dialoguer avec le serveur (envoyer des requĂȘtes *discover*, *guess* ou *chord*, et dĂ©coder les rĂ©ponses du serveur). * Il est recommandĂ© que vous crĂ©iez un rĂ©pertoire ``projet``, contenant des sous-rĂ©pertoires ``projet/client/``, ``projet/serveur/bin/`` et ``projet/serveur/cartes/``. * Le programme du serveur doit ĂȘtre lancĂ© **avant** le client, depuis un processus/une fenĂȘtre dĂ©diĂ©e qui sera fermĂ©(e) pour y mettre fin, via la ligne de commande. Sous Windows, la commande ``.\serveur\bin\crocomine-lite-beta3.exe`` doit ĂȘtre suivie de 2 arguments : le 1e indique le port de communication, par exemple ``:8000``, le 2e l’emplacement des cartes – par exemple ``.\serveur\cartes\``, ce qui donne: ``\projet> .\serveur\bin\crocomine-lite-beta3.exe ":8000" .\serveur\cartes\`` A la premiĂšre Ă©xĂ©cution, vous devriez recevoir une demande d'autorisation pour le pare-feu. * Vous pouvez ensuite exĂ©cuter le client (``\projet> python ./client/exemple.py``), ou bien rĂ©cupĂ©rer le code de l'exemple, avec les importations de packages et l'intĂ©grer Ă  votre joueur. Assurez-vous d'avoir le package ``requests`` installĂ© (via pip3 ou conda, ou autre). * Les ressources mises Ă  disposition sont fonctionnellement complĂštes, mais pourront ĂȘtre modifiĂ©es Ă  la marge pour corriger des bugs. Vous pouvez crĂ©er vos propres cartes, et mĂȘme les partager entre vous !