Está en la página 1de 8

Universidad Autnoma de Baja California Facultad de ciencias qumicas e ingeniera

Reporte Prctica 1
Grafos, Algoritmo el camino ms corto

Materia: Inteligencia Artificial Profesor: Dr. Alvarado Magaa Juan Paulo Nombre: Renteria Cuevas Roberto Alonso Fecha de entrega: 21 de marzo del 2012

Practica 1: Arboles Camino ms Corto de un nodo a otro Introduccin:


En esta prctica se busca aplicar algn tipo de algoritmo para calcular la ruta ms corta de una ciudad a otra pasando por la menor cantidad de ciudades, para esto se utilizaran arboles para representar el mapa de ciudades, cada ciudad ser un nodo del rbol y cada una tendr una lista de ciudades a las que se conecta y un nombre de la ciudad. Ejemplo de la estructura de una Ciudad: Ciudad { String Nombre; Lista<Ciudad> nodos; } Por otro lado un mapa tiene igual mente una lista de Ciudades que se interconectan entre s para formar un rbol. Ejemplo de estructura de un Mapa. Mapa { Lista<Ciudad> ciudades; } Teniendo esta estructura podremos generar nuestro mapa creando una serie de ciudades y agregando los nodos a los que se conecta. Ejemplo de cmo se hacen crea un mapa, simplemente se agregan ciudades a la lista de nodos de cada ciudad.

Desarrollo:

El programa se desarrollara en java, debido a que es un lenguaje orientado a objetos lo cual facilita la abstraccin del problema de una mejor manera, adems se utilizara las clases de java para el manejo de listas enlazadas, la clase a utilizar es ArrayList<?>, esta clase contiene todos los mtodos bsicos para el manejo de listas de esta forma nos preocupamos menos por crear la lista desde cero como se hara en el lenguaje C.

1- Comenzamos por crear nuestra clase Ciudad, el atributo paren es una bandera que indica que en la ciudad en un nodo padre, esto ser utilizado despus para no ciclarse en el algoritmo para encontrar la ruta ms corta.
public class Ciudad { private String name = null; //nombre de la ciudad private boolean parent = false; //bandera que indica que es nodo padre. private ArrayList<Ciudad> nextNodes = null; // Lista de nodos siguientes //constructor public Ciudad(String name) { this.name = name; this.nextNodes = new ArrayList<Ciudad>(); }

2- Agregamos todos los mtodos necesarios para manejar nuestra lista de nodos, como en este caso utilizaremos la clase ArrayList<?> de java esta ya incluye todos los mtodo necesarios para el manejo de la lista. 3- Creamos ahora la clase Map. public class Map { ArrayList<Ciudad> ciudades = null; //lista de ciudades del mapa public Map() { } }

MAPA
4- El siguiente paso es crear el mapa que utilizaremos para realiza las pruebas del algoritmo, esto se realiza en el constructor de la clase Map. El mapa que crearemos para este caso ser el siguiente:

Las conexiones a realizar sern la siguientes: o C0.nodos = { C1,C2 } o C1.nodos = { C0,C3,C4 } o C2.nodos = { C0,C6 } o C3.nodos = { C1,C5 } o C4.nodos = { C1,C5 } o C5.nodos = { C3,C4,C8 } o C6.nodos = { C2,C7 } o C7.nodos = { C6 } o C8.nodos = { C5 }

Ahora pasemos estas relaciones a cdigo, esto se agregara en el constructor de la clase Map, como continuacin se muestra.
public Map() { ciudades = new ArrayList<Ciudad>(); //inicializa las ciudades for (int i = 0; i <= 8; i++) { ciudades.add(new Ciudad("c" + i)); } //agregando los nodos a los que se conecta cada nodo para generar el mapa de arriba ciudades.get(0).addNextNode(ciudades.get(1)); ciudades.get(0).addNextNode(ciudades.get(2));

ciudades.get(1).addNextNode(ciudades.get(3)); ciudades.get(1).addNextNode(ciudades.get(4)); ciudades.get(1).addNextNode(ciudades.get(0)); ciudades.get(2).addNextNode(ciudades.get(6)); ciudades.get(2).addNextNode(ciudades.get(0)); ciudades.get(3).addNextNode(ciudades.get(5)); ciudades.get(3).addNextNode(ciudades.get(1)); ciudades.get(4).addNextNode(ciudades.get(5)); ciudades.get(4).addNextNode(ciudades.get(1)); ciudades.get(5).addNextNode(ciudades.get(3)); ciudades.get(5).addNextNode(ciudades.get(4)); ciudades.get(5).addNextNode(ciudades.get(8)); ciudades.get(5).addNextNode(ciudades.get(6)); ciudades.get(6).addNextNode(ciudades.get(5)); ciudades.get(6).addNextNode(ciudades.get(2)); ciudades.get(6).addNextNode(ciudades.get(7)); ciudades.get(7).addNextNode(ciudades.get(6)); ciudades.get(8).addNextNode(ciudades.get(5)); }

ALGORITMO: El camino ms corto.


El algoritmo que utilizaremos ser un algoritmo recursivo que lo que hace es a partir del nodo inicial expandir recursivamente cada uno de los nodos siguientes hasta encontrar el nodo destino, una vez que encuentra el nodo destino es nuestro caso base y a partir de ah regresa la como ruta una lista con el nodo destino y a partir de ah le agrega a la lista cada uno de los nodos por los que paso para llegar hasta el nodo destino, incrementando en cada nodo el tamao de la lista, adems en cada nodo anterior o nodo padre realiza una comparacin para determinar si el nuevo camino es ms corto que el anterior, si es que ya se tena un anterior y regresa la ruta con el camino ms corto, al termina de recorrer cada uno de los nodos de cada ciudad regresara una lista con la ruta ms corta de un nodo a otro, si no se encontr ningn camino que llegue al destino regresa una ruta vaca. El algoritmo que emplearemos ser un algoritmo de tipo codicioso ya que recorrer todo el rbol hasta encontrar la mejor ruta y no se detendr al encontrar la primera solucin sino que seguir recorriendo el rbol en busca de una mejor ruta hasta haber recorrido todo el rbol.

Explicacin: Este algoritmo recibe como parmetro la ciudad destino y el nodo padre. 123456Inicializa la lista Ruta. Pregunta si la ciudad actual es el es el destino. Si es el destino sale del la funcin y regresa una lista con la ciudad actual. Si No recorre cada uno de los nodos a los que se conecta la ciudad. Si el siguiente nodo es un nodo padre sale de la funcin y regresa vacio. Si no es nodo padre activa la bandera padre de nodo padre y Expande recursivamente el nodo realiza desde el paso 1 al nodo siguiente. 7- Compara el tamao de la lista que regreso la funcin recursiva, con la ruta anterior si es que ya existe alguna ruta anterior. 8- Si la longitud de la ruta es menor remplaza la ruta actual por la nueva ruta. 9- Al terminar de expandir todos los nodos de la ciudad regresa la ruta ms corta, si es que logro llegar a a la ciudad destino sino regresa lista vacia.

Pseudocdigo:
Funcin Lista shortestRoute(destino,nodoPadre){ Lista ruta
//caso base

IF (this = destino){ ruta.add(this) Return ruta }ELSE {//caso recursivo For(i=0 ; i < this.nodos.size() ; i++ ){ IF(this.nodos(i).esPadre = false){ nodoPadre.setParent(true); nuevaRuta= shortestRoute(destino,this ) IF(nuevaRuta.isNotEmpty AND (nuevaRuta.size < ruta.size OR ruta.isEmpty){ ruta=nuevaRuta } } } IF(ruta.isNotEmpty){ Ruta.add(this) } Return ruta } }

Cdigo en Java:
public ArrayList<Ciudad> findShortestRoute(String destination, Ciudad parentNode) { ArrayList<Ciudad> route = new ArrayList<Ciudad>(); //inicializa la ruta //CASO BASE : cuando encuentra el nodo destino if (this.name.equalsIgnoreCase(destination)) { route.add(this); return route; } else { for (int i = 0; i < nextNodes.size(); i++) //CASO RECURSIVO: expander nodo siguiente solo si no es nodo padre if (!nextNodes.get(i).isParent()) { parentNode.setParent(true); //le asigna la bandera parent al nodo padre. //expande recursivamente el siguiente nodo en la lista. ArrayList<Ciudad> newRoute = nextNodes.get(i).findShortestRoute(destination, this); if (!newRoute.isEmpty() && (newRoute.size() < route.size() || route.isEmpty())) //actualiza la la ruta si la nueva ruta es menor a la anterior o es el primer caso con xito. route = newRoute; } this.parent = false; //restaura la bandera parent antes de regresar a un nivel anterior. if (!route.isEmpty()) //si es caso de exito agrega la ciudad actual a la ruta y la regresa. route.add(this); return route; } }

RESULTADO

También podría gustarte