{"id":21499227,"url":"https://github.com/guillaumehermoso/ia02-hitman","last_synced_at":"2025-03-17T12:45:52.347Z","repository":{"id":196506458,"uuid":"637707179","full_name":"GuillaumeHERMOSO/IA02-HITMAN","owner":"GuillaumeHERMOSO","description":"Projet IA02 - Hitman","archived":false,"fork":false,"pushed_at":"2023-12-01T13:40:11.000Z","size":878,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-23T22:34:16.356Z","etag":null,"topics":["astar-algorithm","sat"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GuillaumeHERMOSO.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-05-08T08:40:19.000Z","updated_at":"2024-02-12T12:40:39.000Z","dependencies_parsed_at":null,"dependency_job_id":"b2350ea4-b5a7-48b6-8225-0353acf8344d","html_url":"https://github.com/GuillaumeHERMOSO/IA02-HITMAN","commit_stats":null,"previous_names":["guillaumehermoso/ia02-hitman"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GuillaumeHERMOSO%2FIA02-HITMAN","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GuillaumeHERMOSO%2FIA02-HITMAN/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GuillaumeHERMOSO%2FIA02-HITMAN/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GuillaumeHERMOSO%2FIA02-HITMAN/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GuillaumeHERMOSO","download_url":"https://codeload.github.com/GuillaumeHERMOSO/IA02-HITMAN/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244038324,"owners_count":20387826,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["astar-algorithm","sat"],"created_at":"2024-11-23T17:15:00.581Z","updated_at":"2025-03-17T12:45:52.329Z","avatar_url":"https://github.com/GuillaumeHERMOSO.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Projet IA02 - Hitman\n\n## Binôme de projet 60:\n- Guenchi Jawed\n- HERMOSO Guillaume\n\n\n## Sommaire:\n- [Prérequis](#prérequis)\n- [Phase 1](#phase-1)\n    - [1.1 Stratégie](#11-stratégie)\n    - [1.2 Heuristique](#12-heuristique)\n    - [1.3 SAT](#13-sat)\n- [Phase 2](#phase-2)\n    - [2.1 Stratégie](#21-stratégie)\n    - [2.2 Modelisation STRIPS](#22-modelisation-strips)\n- [Forces et faiblesses](#forces-et-faiblesses)\n    - [3.1 Forces](#31-forces)\n    - [3.2 Faiblesses](#32-faiblesses)\n- [Lancer le projet](#lancer-le-projet)\n\n\n\n## Prérequis\nAvant d'exécuter le code, assurez-vous d'avoir les éléments suivants :\n\n- **Le fichier hitman.py doit se trouver dans le dossier 'src/arbitre/'.**\n- **L'executable gophersat doit se trouver dans le meme dossier que main.py**\n\n\n## Phase 1\n\n### 1.1 Stratégie \n\n- Appliquer une stratégie de début de partie.\n- Tant que toutes les cases n'ont pas été explorées :\n\n    - Trouver les cases inconnues les plus proches.\n    - Prendre comme but la case inconnue la plus proche, accessible.\n    - Appliquer l'algorithme A* pour trouver le chemin optimal vers la case permettant de voir la inconnue.\n    - Transformer le chemin en une liste d'actions à exécuter.\n    - Exécuter les actions, mettre à jour les connaissances et afficher si nécessaire.\n    - Tourner le personnage dans la direction de la case inconnue.\n\n### 1.2 Heuristique \n\nOn a eu besoin de plusieurs heuristiques pour résoudre le problème:\n- distance de Manhattan, qui permet de trouver la case la plus proche de la case actuelle.\n- la case ou on est est elle vu par un ennemi.\n\npas utilisé car pas assez performante:\n- nbr de mur entre but et case actuelle\n- distance euclidienne\n- nombre de case inconnue proche\n- nombre de case inconnue proche vu par un ennemi\n- nombre de mur autour de la case inconnue\n- nombre de case inconnue autour de la case inconnue\n- nombre d'obstacle (garde ou mur) entre but et case actuelle\n\n\n\n\n\n### 1.3 SAT \n#### 1.3.1 Choix de modélisation \n  \n- Le plan est le suivant :\n  \n    1. Trouver une/des variable(s) à déduire, les implémenter dans une liste\n    2. Pour chaque élément de la liste, tester sa négation dans SAT avec nos clauses et voir si le solveur renvoie insatisfiable\n    3. Si oui : inclure la nouvelle variable dans notre dictionnaire de connaissances.\n    4. Si non : Ne rien déduire\n\n- La nature des variables sont des coordonées de personnes potentielles ( du type \"ij_P\") qui sont convertit en entier (admissible pour le solveur) avec un dictionnaire de conversion position-\u003e valeur avec la clé la position potentielle et la valeur de cette clé un entier. Une valeur vaut donc une position potentielle d'une personne. \n- Pour la recherche des variables à déduire, on recupere dans notre dictionnaire de connaissances les positions sans informations et on essaye pour chacune des variables de voir si nos clauses d'ecoute nous permmettent de déduire une personne sur cette position.\n- Avant chaque boucle de deduction on instancie un nouveau fichier SAT avec les clauses d'écoutes (depuis le debut) et les clauses de connaissances (actuelles).\n- Les clauses d'écoutes sont crées à partir d'une fonction python, qui, pour chaque situation de Hitman, c'est a dire du nombre de cases autour de lui( si il est situé près d'un mur, un coin , etc...Sinon il y a un rayon d'écoute de 2 cases autour de lui (25 cases en tout)) et du nombre de personnes k écoutés, genere soit une base de clauses avec la fonction `exactly`(k,liste_variables), soit une base de clauses `at_least`(5,liste_variables) si le nombre de personnes entendues dépassait 5 ( voir fichier : `src/contraintes.py`). \n- Du fait du nombre de clauses en fin d'exploration (~500 000 carte donné), le parcours de la carte prends plus de temps avec des déductions que sans. Cependant, le solveur arrive parfois à deviner les positions des gardes et des civils sur la carte.\n\n  \n#### 1.3.2 Problèmes rencontrés \n\nLors de l'implémentation du solveur SAT, nous avons rencontrés plusieurs problèmes tels que : \n- La réecriture impossible d'un fichier SAT à partir de lui même (ce qui nous a contraint à devoir écrire un nouveau fichier de zéro à chaque fois et exploser le temps de calcul )\n- Une gestion abérrante du nombre de clauses : Plus la carte est grande, plus le nombre de clauses explose, ce qui nous a limité seulement à l'utilisation du solveur à la potentielle déduction des personnes (gardes et invités ) avec les clauses d'écoutes.\n\n  \n## Phase 2\n\n\n### 2.1 Stratégie \nPour cette mission, nous devons effectuer une planification, nous avons decider de le faire en utilisant l'algorithme A* afin de trouver le chemin optimal entre notre position actuelle et la case visée. \n\nLa tâche de l'agent Hitman consiste à éliminer sa cible et revenir en (0,0). Pour ce faire, nous avons décidé d'étudier trois chemins différents et de choisir celui qui entraîne le moins de pénalités.\n\nVoici les trois chemins possibles pour atteindre l'objectif, exprimés sous forme d'actions :\n\n1. **Chemin 1** : départ -\u003e corde de piano -\u003e prendre la corde -\u003e cible -\u003e tuer la cible -\u003e (0,0)\n\n2. **Chemin 2** : départ -\u003e costume -\u003e mettre le costume -\u003e corde de piano -\u003e prendre la corde -\u003e cible -\u003e tuer la cible -\u003e (0,0)\n\n3. **Chemin 3** : départ -\u003e corde de piano -\u003e prendre la corde -\u003e costume -\u003e mettre le costume -\u003e cible -\u003e tuer la cible -\u003e (0,0)\n\nPour chaque chemin, nous calculons la pénalité en fonction des actions effectuées. Nous choisirons le chemin qui présente la plus petite pénalité et nous le ferons réaliser par Hitman.\n\n### 2.2 Modelisation STRIPS \nNotre modelisation est diponible dans le fichier `ModélisationSTRIPS.pdf`\n\n## Forces et Faiblesses\n\n### 3.1 Forces\n- La phase 1 est fonctionnelle et permet de découvrir toute les informations sur la carte.\n- La phase 1 peut être utilisée avec ou sans SAT.\n- La phase 2 est fonctionnelle et permet de repondre à la mission.\n- Utilisation d'une classe de connaissance pratique et modulable en fonction des besoins ( récupérations des données fournis par l'arbitre, ajout de connaissances, compatibilité avec les déductions du solveur SAT en phase 1 )\n- Interface graphique pratique et efficace ( on sait ce qu'on voit, ce qu'il reste à voir,l'orientation des gardes, des civils et du joueur ).\n\n\n### 3.2 Faiblesses\n- Déductions du solveur SAT chronophage ( phase 1) ( 30 000 fois superieur pour la carte founis : 0,008 s sans SAT contre 294,76 s).\n- SAT pas toujours rentable en score (Un score de 0 pour la carte founis avec SAT contre 4 sans SAT).\n- Fonctions heuristiques à améliorer (certaines configurations de cartes nous font perdres beaucoup de points).\n- La phase 2 ne prend pas en compte si il est rentable de neutraliser des personnes.\n\n        \n\n## Lancer le projet\n\n### 1.1 Les fonctions main \n\nNous avons plusieurs exemples de `main` permettant de lancer le projet et ses différentes phases :\n\n- `main_phase1()` : permet de lancer uniquement la phase 1.\n- `main_phase2()` : permet de lancer uniquement la phase 2.\n- `main_phase1_2()` : permet de lancer à la fois la phase 1 et la phase 2.\n\nCes trois `main` font appel aux fonctions suivantes :\n\n```python\ndef phase1(hr: HitmanReferee, sat=False, affichage=False, temp=0.5, cb_de_temp=True):\n    # Voir src/phase1.py\n```\nPour la phase 1, vous pouvez choisir si SAT sera utilisé ou pas pour deduire des informations. Vous pouvez également choisir si vous voulez afficher la carte à chaque itération et le temps de pause entre chaque itération. Cb_de_temp permet d'afficher le temps de calcul de la phase1.\n\n```python\ndef phase2(hr: HitmanReferee, con: HitmanKnowledge, affichage=False, temp=0.5):\n    # Voir src/phase2.py\n```\nPour la phase 2, vous pouvez choisir si vous voulez afficher la carte à chaque itération et le temps de pause entre chaque itération.\n\n### 1.2 L'affichage \n\n- \"O\" est Hitman et la flèche (\"^\",\"\u003e\",\"v\",\"\u003c\") représente la direction dans laquelle il regarde actuellement, idem pour \"G\" : Garde et \"C\": Civil.\n- \"X\" : Non découvert\n- \"A\" : Arme (Corde de piano)\n- \"S\" : Suit ( Le déguisement)\n- \"|\" ou \"-\" : les murs de la carte \n- \"P\" : represente une cible deduite par le solveur SAT mais pas encore vue par Hitman\n\nexemple d'affichage :\n\n![affichage.png](affichage.png)\n\n\n\n## Liens utiles\n\nsujet : https://hackmd.io/@ia02/S1LNF3CMn\narbitre : https://gitlab.utc.fr/ia02/hitman \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguillaumehermoso%2Fia02-hitman","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fguillaumehermoso%2Fia02-hitman","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguillaumehermoso%2Fia02-hitman/lists"}