Documentos de Académico
Documentos de Profesional
Documentos de Cultura
IA p1 Grafos
IA p1 Grafos
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
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)); }
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