2. ABSTRACT El presente trabajo describe como resolver un juego con algoritmos de inteligencia artificial. El viajero perdido el cual consiste en un carro en el que un viajero trata de conducir para encontrar el destino al cual desea llegar, para ello debe ir pasando por unas calles las cuales tienen obstáculos y este deberá ir sorteándolos, y además deberá ir desde el inicio hasta el final siguiendo la ruta más corta.
3. INTRODUCCIÓN En los últimos años la inteligencia artificial a evolucionado en gran medida hasta el punto que se han construido maquinas inteligentes que inclusive tienen la capacidad de aprender. Abarca un sinnúmero de campos y conceptos entre los cuales se encuentra el concepto de agente, se dice que estos constituyen el próximo avance más significativo en el desarrollo de sistemas y pueden ser considerados como la nueva revolución en el software.
4. DESCRIPCIÓN DEL PROBLEMA Meta: El viajero deberá llegar a su destino final en un corto tiempo, de la manera más rápida, escogiendo las calles más cortas o ruta más corta y además deberá evitar chocar con los obstáculos que se encuentre en su camino. Inicio: El viajero tendrá un punto de partida cualquiera, tendrá varias rutas para llegar a su destino, y este deberá tener la capacidad para llegar al destino sorteando los obstáculos colocados en su trayecto. Obstáculos: Los obstáculos serán casas que las cuales estarán a lo largo de todo el trayecto.
5. INGENIERIA DEL AGENTE Tipo de agente Basado en Objetivos Sensores Sensor para detectar obstáculos. Sensor de posición final o meta. Sensor de posición inicial. Entorno Calles.- Por donde se va a desplazar el agente Obstáculos.- Con lo que debe evitar chocar el agente.
8. Metas Es el objetivo final del agente, al llegar a la meta el agente se detendrá y dará por concluida su misión.
9. Algoritmo y tipo de Agente para esteproblema Hemos determinado que la mejor opción para resolver este problema es implementar un agente de búsqueda online. La búsqueda online intercambia computación con acción, y difiere en esto con las búsquedas offline, las cuales determinan una solución antes de ejecutarla. Una búsqueda online es necesaria para entornos dinámicos y semi-dinámicos, es por eso que son utilizados comúnmente en problemas de exploración.
10. Pasos para resolver nuestro problema: Primeramente ubicamos la posición de inicio o partida para ello usamos la clase que la hemos denominado Nodo y enviamos como parámetros: la partida y la casilla en cual se encuentra dicha partida. Nodo("partida.", this.casilla_partida.Name) En esta clase utilizamos un procedimiento llamado ‘calcular ubicación’ en el cual obtenemos la ubicación de la partida. Para ello hemos dividido a nuestro cuadro en niveles y pasillos, los niveles son tomados en forma horizontal empezando desde cero por la parte superior, y los pasillos son tomados en forma vertical empezando desde cero por la izquierda
11.
12. Ahora que ya sabemos la ubicación de la partida ubicamos los vecinos de esta partida. Con vecinos nos referimos a los nodos que lo rodean. Para hacer esta ubicación enviamos como parámetro el nivel y pasillo de la partida al procediendo que lo hemos denominado ‘Definir Vecinos’. En este procedimiento, hacemos una comparación: si nivel = 0 no vecino hacia arriba, si nivel = 9 no vecino hacia abajo, si pasillo = 0 no vecino izquierda si el pasillo = 9 no vecino derecha
13. Siguiendo los mismos pasos del 1 al 3 calculamos la ubicación de la llegada, así mismo calculamos los vecinos de la casilla llegada. A continuación calculamos la heurística y enviamos como parámetro el nodo partida ya definido su ubicación y vecinos. CalcularHeuristica(this.miPartida)
14. En esta heurística calculamos la distancia que existe desde la partida, y desde cada vecino donde no existe un obstáculo, para calcular la heurística utilizamos el nivel y el pasillo en el que se encuentra cada nodo. Con la siguiente formula calculamos la heurística: a= nivel_nodo - nivel_llegada b= pasillo_nodo - pasillo_llegada h(n): a2 + b2 Math.Sqrt(Math.Pow(a, 2) + Math.Pow(b, 2)) Este algoritmo nos dice que antes de un agente poder realizar una acción debe calcular la heurística de los nodos sucesores y así luego hacer una comparación de que heurística es la mejor y tomar esa para su próxima acción.
15. Creamos dos variables de tipo array una para almacenar los nodos que expandiremos del árbol, y otro para almacenar la ruta que nos llevara a la llegada. Luego Hemos creado un procedimiento llamado BLO(Búsqueda Local Online), el cual a su vez hace un llamado a la función Búsqueda Local Online 1(BLO1), esta función BLO1 lo que nos hace es: Verificar si la casilla en donde nos encontramos es la llegada Llamar a la función expandir nodos enviando como parámetro el nodo en el cual nos encontramos actualmente. En la función expandir nodo verificamos cuantos nodos hojas puede tener un nodo, haciendo una comparación determinamos si un sucesor es un camino o es un obstáculo. En caso de ser un obstáculo pasamos, en caso de ser un camino hacemos el procedimiento del 1 al 3 que es de calcular su ubicación, definir sus vecinos y calcular la heurística.
16.
17. Una vez que definimos cada sucesor de un nodo lo ubicamos dentro en un array llamado árbol, calculando el costo desde el padre al nodo hijo en este caso desde n1 hasta s1 o desde n1 hasta s2, además calculamos la heurística de cada nodo hijo o sucesor. Ya tenemos en nuestro árbol el nodo padre y sus sucesores, con sus respectivas heurísticas, a continuación creamos un array auxiliar para poder ordenar nuestro árbol, ordenamos los sucesores de un nodo tomando en cuenta la función heurística en nodo con menor función heurística estará primero, esto con la finalidad de escoger como primera opción el nodo con función heurística más corta.
18. Además debemos tomar en cuenta que no siempre un nodo con mejor función heurística será el elegido, se debe hacer todo el proceso nuevamente con ese nodo con mejor función heurística para determinar si los sucesores de este son obstáculos o caminos y determinar sus funciones heurísticas respectivas. Así es el proceso que se hace nodo a nodo hasta llegar al objetivo final. Una vez que hemos llegado a la meta el nodo llegada tendrá una bandera llamada ‘llegada’, el cual nos indicara que hemos llegado al final. Además para poder almacenar las rutas que sigue el agente las almacenamos en un array llamado ruta, para luego pasar esta ruta a otro array llamado mi ruta y poder presentarla en pantalla.