{"id":25144071,"url":"https://github.com/dfleta/problem-solving-searching","last_synced_at":"2025-04-03T05:41:01.844Z","repository":{"id":275862010,"uuid":"927424748","full_name":"dfleta/problem-solving-searching","owner":"dfleta","description":"AI problem solving by A* search algoritm","archived":false,"fork":false,"pushed_at":"2025-02-12T00:12:25.000Z","size":1325,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-12T01:25:15.216Z","etag":null,"topics":["ai","problem-solving","searching-algorithms"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dfleta.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2025-02-04T23:41:58.000Z","updated_at":"2025-02-12T00:12:28.000Z","dependencies_parsed_at":"2025-02-12T01:22:30.030Z","dependency_job_id":null,"html_url":"https://github.com/dfleta/problem-solving-searching","commit_stats":null,"previous_names":["dfleta/problem-solving-searching"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfleta%2Fproblem-solving-searching","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfleta%2Fproblem-solving-searching/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfleta%2Fproblem-solving-searching/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfleta%2Fproblem-solving-searching/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dfleta","download_url":"https://codeload.github.com/dfleta/problem-solving-searching/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246944384,"owners_count":20858773,"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":["ai","problem-solving","searching-algorithms"],"created_at":"2025-02-08T19:36:35.405Z","updated_at":"2025-04-03T05:41:01.834Z","avatar_url":"https://github.com/dfleta.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Algoritmos resolución de problemas mediante búsquedas.\n\n## Ejercicios módulo Modelos de Intelixencia Artificial\n\n\n### Instalación y Ejecución con uv\n\n#### Instalación\n\n1. Clona el repositorio:\n```bash\ngit clone https://github.com/dfleta/problem-solving-searching.git\ncd problem-solving-searching\n```\n\nSi quieres instalar las dependencias de desarrollo del proyecto, utiliza `uv`, sinom salta al epígrafe \"ejecución\".\n\n2. Instala `uv`:\n```bash\npython -m pip install uv\n```\n\n3. Crea y activa un entorno virtual con `uv`:\n```bash\nuv venv\nsource .venv/bin/activate  # En Linux/MacOS\n# O en Windows:\n# .venv\\Scripts\\activate\n```\n\n4. Instala las dependencias del proyecto declaradas en `pyproject.toml`\n```bash\nuv sync\n```\nRecueda que puedes emplear la interfaz de `pip`:\n```bash\npip install -r requirements.txt\n```\n\n5. Instala el linter `ruff`:\n```bash\nuv sync --group lint\n```\n\n#### Ejecución\n\nEl programa implementa el algoritmo A* y puede ejecutarse desde la línea de comandos con diferentes parámetros:\n\n```bash\npython a_star.py \u003cestado_inicial\u003e \u003cestado_objetivo\u003e [-v_c COSTO_VERTICAL] [-h_c COSTO_HORIZONTAL]\n```\n\n##### Parámetros:\n- `estado_inicial`: Estado desde donde comenzar la búsqueda\n- `estado_objetivo`: Estado que se desea alcanzar\n- `-v_c`: Costo para movimientos verticales (opcional, valor predeterminado: 1)\n- `-h_c`: Costo para movimientos horizontales (opcional, valor predeterminado: 2)\n\n##### Ejemplos de uso:\n\n1. Búsqueda básica de Z a N:\n```bash\npython a_star.py Z N\n```\n\n2. Búsqueda con costos personalizados:\n```bash\npython a_star.py -v_c 2 -h_c 3 Z N\n```\n\n`python3 a_star -h`\n\n```zsh\nusage: a_star.py [-h] [-v_c V_C] [-h_c H_C] start_state goal_state\n\nA* Search Algorithm\n\npositional arguments:\n  start_state  Initial state\n  goal_state   Goal state\n\noptions:\n  -h, --help   show this help message and exit\n  -v_c V_C     Cost for vertical movements\n  -h_c H_C     Cost for horizontal movements\n```\n\n#### Ejemplos\n\n`python3 a_star.py -v_c 1 -h_c 2 Z N`\n\no \n\n`python3 a_star.py Z N`\n\n![\"CLI output Z N\"](./doc/CLI_1.png)\n\n`python3 a_star.py -v_c 1 -h_c 2 S F`\n\n![\"outpu CLI S F\"](./doc/CLI_2.png)\n\n### Algoritmo\n\n![\"Pseudocódigo A star I\"](./doc/pseudocodigo_A_star_I.png)\n\n![\"Pseudocódigo A star II\"](./doc/pseudocodigo_A_star_II.png)\n\n\nEl método `__update_g()` actualiza de manera recursiva todos los nodos de la frontera que son descendientes del nodo que se está actualizando. Veamos cómo funciona:\n\n1. El método recibe dos parámetros:\n\n   - `g_decrement`: la diferencia entre el valor g antiguo y el nuevo\n   - `new`: el nodo que se acaba de actualizar\n\n2. El proceso recursivo funciona así:\n\n```py\n   def __update_g(self, g_decrement, new):\n       # Itera sobre todos los elementos en la frontera\n       for element in self.get_elements():\n           # Verifica si el elemento tiene un padre y si ese padre es el nodo que acabamos de actualizar\n           if element.parent and element.parent.state == new.state:\n               # Actualiza el valor g del elemento\n               element.g -= g_decrement\n               # Recalcula el valor f (f = g + h)\n               element.f = element.g + element.h\n               # Llamada recursiva para actualizar los hijos de este elemento\n               self.__update_g(g_decrement, element)\n```\n\n\nLa recursión ocurre porque:\n\n1. Primero actualiza los hijos directos del nodo modificado\n\n2. Para cada hijo actualizado, llama recursivamente a `__update_g()` para actualizar sus propios hijos\n\n3. Este proceso continúa hasta que se hayan actualizado todos los descendientes en la frontera\n\n\n\n### Ejercicio 1\n\nConsidérese el problema de encontrar un camino, en la situación representada en la figura, desde la posición $i$ hasta la posición $e$. El NPC (*non-player character*) puede moverse de forma horizontal y vertical, un solo cuadrado en cada movimiento (cada movimiento tiene coste uno). Las zonas sombreadas impiden el paso del NPC a través de ellas.\n\n![\"Mapa ejercicio 1\"](./doc/mapa_ejercicio_1.png)\n\n\n#### Consideraciones:\n\n- Para aquellos algoritmos en los que no es relevante el coste, el orden de los operadores (movimientos) es: **arriba, abajo, izquierda, derecha**.\n- Si algún algoritmo no controla los ciclos, supondremos que existen mecanismos para eliminarlos.\n- El **coste del movimiento**:\n  - **Vertical**: 1.\n  - **Horizontal**: 2.\n- Para el algoritmo **A** se utilizará la **distancia Manhattan** como heurística:\n\n$$ h(n) = {distancia \\ horizontal} + {distancia \\ vertical} $$\n\n- En el ejemplo, la distancia Manhattan entre $i$ y $e$ es $4$.\n\n#### Representación de la solución:\n\n- Resuelve el problema con cada uno de los algoritmos de búsqueda propuestos.\n- Indica, para cada algoritmo, cuál se aplica para extraer los nodos de la frontera.\n- Escribe:\n  - La evolución del conjunto de nodos frontera.\n  - El conjunto de nodos explorados durante el desarrollo del algoritmo.\n  - La función coste y la heurística en los algoritmos que hagan uso de ellas.\n- En la figura:\n  - Nombra (enumera) los nodos según el orden en que son generados (incluidos en la frontera).\n- Indica:\n  - Cuándo la función test objetivo determina que el nodo chequeado es la solución.\n  - La profundidad en la que se encuentra la solución.\n- Razona y explica qué nodos y por qué conforman la solución.\n- Representa:\n  - El camino que conforma la solución (con una flecha en la figura).\n  - El árbol de búsquedas.\n\n### Ejercicio 2\n\n#### Preguntas específicas:\n\n1. La heurística utilizada en el algoritmo **A**, ¿es admisible? ¿Por qué?\n   - ¿Podemos decir que el algoritmo es **A***?\n\n### Consideraciones sobre la búsqueda A*\n\n![\"Evaluación de los algoritmos de búsquedas\"](./doc/Evaluacion%20_algoritmos_busquedas.png)\nFigura 3.15 Evaluación de los algoritmos de búsquedas. Russell y Norvig (2022)\n\n![\"Peso de la función heurística\"](./doc/Heuristica_ponderada.png)\nEpígrafe 3.5.4 \"_Satisficing search: Inadmissible heuristics and weighted A*_\". Russell y Norvig (2022)\n\n![\"A* ponderada\"](./doc/A_ponderada.png)\nFigura 3.15 Evaluación de los algoritmos de búsquedas. Russell y Norvig (2022)\n\n## Bibliografía\n\nRussell, S. J., \u0026 Norvig, P. (2022). _Artificial intelligence: a modern approach_. Global edition. Pearson Education Limited.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdfleta%2Fproblem-solving-searching","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdfleta%2Fproblem-solving-searching","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdfleta%2Fproblem-solving-searching/lists"}