Programación II. Mario Aldea Rivas Programación II 09/05/11 1

Documentos relacionados
Problema de las N Reinas. Resolución paralela

(b) Cuál es la desventaja principal de una heurística con aprendizaje? es más informada que otra función heurística optimista h 2 *?

Este método se basa en buscar el elemento menor el vector y colocarlo en la primera

Ejemplo: El problema de la mochila. Algoritmos golosos. Algoritmos y Estructuras de Datos III. Segundo cuatrimestre 2013

C a l ses P P y y NP C a l se P C a l se N P N P [No N n o -De D te t rmin i i n s i ti t c i Polynomial-tim i e]

Grafos. Amalia Duch Brown Octubre de 2007

Programación. Tema 8: Tablas Hash. Apuntes elaborados por: Eduardo Quevedo, Aaron Asencio y Raquel López Revisado por: Javier Miranda el????

Tema 9. Algoritmos sobre listas. Programación Programación - Tema 9: Algoritmos sobre listas

Complejidad computacional (Análisis de Algoritmos)

El Juego como Problema de Búsqueda

3. Técnicas de diseño de algoritmos

UNIVERSIDAD MAYOR DE SAN SIMÓN FACULTAD DE CIENCIAS Y TECNOLOGÍA INGENIERÍA DE SISTEMAS BÚSQUEDA PRIMERO EL MEJOR

Grafos. AMD Grado en Ingeniería Informática. AMD Grado en Ingeniería Informática (UM) Grafos 1 / 30

El TAD Grafo. El TAD Grafo

Algoritmos y Estructuras de Datos Curso 06/07. Ejercicios

Estado 3.2 (coste = 9)

Búsqueda con adversario

Retículos y Álgebras de Boole

(d) Puede haber estrategias que funcionan mejor que Minimax si el contrincante es

(e) Con la poda alfa-beta se eliminan nodos que nunca serán alcanzados

Tipos algebraicos y abstractos. Algoritmos y Estructuras de Datos I. Tipos algebraicos

Guía práctica de estudio 05: Diagramas de flujo

El determinante de una matriz se escribe como. Para una matriz, el valor se calcula como:

Tema 2 Introducción a la Programación en C.

FACULTAD DE INGENIERÍA

ALGORITMO MINIMAX. o Nodo: Representa una situación del juego. o Sucesores de un nodo: Situaciones del juego a las que se

TEMA 1. MATRICES, DETERMINANTES Y APLICACIÓN DE LOS DETERMINANTES. CONCEPTO DE MATRIZ. LA MATRIZ COMO EXPRESIÓN DE TABLAS Y GRAFOS.

Algorítmica y Complejidad. Tema 3 Ordenación.

Programación Estructurada

Planificaciones Algoritmos y Programación I. Docente responsable: AZCURRA DIEGO ANDRES. 1 de 5

PROCESADORES DE LENGUAJE EXAMEN FINAL 8-JUNIO-07

4ta. Práctica. Búsqueda en árbol con contrincante: MiniMax con poda Alfa-Beta. Inteligencia Artificial Prácticas 2004/2005

Procesadores de lenguaje Tema 6 La tabla de símbolos

UNIVERSIDAD NACIONAL EXPERIMENTAL DE GUAYANA VICERRECTORADO ACADÉMICO COORDINACION DE PRE-GRADO PROYECTO DE CARRERA DE INGENIERIA INDUSTRIAL

Universidad de Valladolid. Departamento de informática. Campus de Segovia. Estructura de datos Tema 4: Ordenación. Prof. Montserrat Serrano Montero

Clases e instancias. Algoritmos y Estructuras de Datos I. Clases e instancias. memoria dinámica.

greedy (adj): avaricioso, voraz, ávido, codicioso, glotón

Jueves, 30 de abril. Ejemplo de recursión. Ejemplo de PD. Ejemplo de programación dinámica. Programación dinámica

RELACIÓN DE PROBLEMAS DE CLASE DE PROGRAMACIÓN LINEAL ENTERA

ALGORITMOS DE ORDENAMIENTO COUNTING SORT CHRISTIAN ESTEBAN ALDANA ROZO BRAYAN STIF FORERO CRUZ GIOVANNY GUZMÁN CÉSPEDES JORGE MEJIA

Búsqueda en e.e. --> reglas para elegir entre las ramas que con más probabilidad lleven a la solución.

Apuntes elaborados por: Aaron Asencio, Eduardo Quevedo, Raquel López Revisado por: Javier Miranda el???

1. Conceptos básicos sobre el problema en cuestión y cuestiones afines. 2. Formulación de los correspondientes algoritmos y su pseudocódigo.

COMBINAR CORRESPONDENCIA

APUNTADORES. Un apuntador es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable.

Introducción a la Computación (para Matemática) Primer Cuatrimestre de 2015

Métodos para escribir algoritmos: Diagramas de Flujo y pseudocódigo

Tema 3. Análisis de costes

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Control de Flujo. Estructuras de Control! Experiencia Educativa de Algorítmica CONTROL DE FLUJO

Estatutos de Control C# Estatutos de Decisión (Selección)

ÍNDICE INTRODUCCIÓN...13

Aprendizaje Automatizado

Introducción al tipo Vector Cómo guardar una colección de datos conceptualmente relacionados? - almacenar los 100 primeros números primos, - al

Unidad Nº V Listas Enlazadas

Estudiemos el siguiente problema, propuesto por Wirth y desarrollado por Dijkstra: Una lista de las primeras secuencias que cumplen es:

Juegos y Estrategias de resolución

Para definir en formalmente el juego se deberá establecer:

SISTEMAS INFORMÁTICOS PROGRAMACION I - Contenidos Analíticos Ing. Alejandro Guzmán M. TEMA 2. Diseño de Algoritmos

El método simplex 1. 1 Forma estándar y cambios en el modelo. 2 Definiciones. 3 Puntos extremos y soluciones factibles básicas. 4 El método simplex.

Fundamentos de Programación. Flujo de Control I: Estructuras selectivas

Materia: Matemática de Tercer Año Tema: Pendiente

Clase adicional 2. Estructuras básicas de control. Temas

ALGORITMOS, ESTRUCTURAS Y PROGRAMACION

Algoritmos de Ordenación

Algoritmos glotones. mat-151

public class AtaqueVoraz extends EsquemaVZ implements EstrategiaSolucion {

SCUACAC026MT22-A16V1. SOLUCIONARIO Ejercitación Generalidades de números

Problemas de Recursividad

un conjunto cuyos elementos denominaremos vectores y denotaremos por es un espacio vectorial si verifica las siguientes propiedades:

Cuando se enumeran todos los elementos que componen el conjunto. A = { 1, 2, 3, 4, 5 }

Seleccionamos el programa Excel. Nos aparece la pantalla del programa

MANUAL DE PRÁCTICAS DEL TALLER DE PROGRAMACIÒN PRACTICA NO.6

MODELOS DE COMPUTACION I Preguntas Tipo Test. 1. El lema de bombeo puede usarse para demostrar que un lenguaje determinado es regular.

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

LEX. Las definiciones y subrutinas son opcionales. El segundo %% es opcional pero el primer %% indica el comienzo de las reglas.

Análisis y síntesis de sistemas digitales combinacionales

Práctica 1 de Excel (Curso )

5. Sentencias selectivas o condicionales

Problema - Sumando Digitos

Las plantillas permiten definir funciones genéricas.

Tema 4: Búsqueda informada mediante técnicas heurísticas

Ruta más Corta con una sóla Fuente de Inicio (Single-Source Shortest Paths) DR. JESÚS A. GONZÁLEZ BERNAL CIENCIAS COMPUTACIONALES INAOE

Tema 3: El Método Simplex. Algoritmo de las Dos Fases.

Semana de las Matemáticas e Ingeniería. Desarrollo de algoritmos recursivos empleando la aplicación PseInt

Programación Dinámica 1

Con miras a conocer la metodología que se aplica en el Método SIMPLEX, tenemos a continiacion un ejemplo:

Administración de la producción. Sesión 9: Hojas de cálculo (Microsoft Excel)

CI-6675 Algoritmos y Estructuras Optimizadas para Videojuegos

Estructuras en LabVIEW.

SISTEMAS DE ECUACIONES LINEALES. Método de reducción o de Gauss. 1º DE BACHILLERATO DPTO DE MATEMÁTICAS COLEGIO MARAVILLAS AUTORA: Teresa González.

Análisis y Diseño de Algoritmos Tablas de Hash

UNIDAD 4. MODIFICAR TABLAS DE DATOS

Algoritmos. Intro. Prof. Raquel Torres Peralta / Gerardo Sanchez S. Unison

<tipo> Tipo de dato de los elementos del vector

Programación II. Mario Aldea Rivas Programación II 05/04/11 1. Tema 5. Algoritmos voraces, heurísticos y aproximados

Teoría de grafos y optimización en redes

7ª Práctica. Matlab página 1 EJERCICIO 1. ORDENAR UN VECTOR CON EL MÉTODO DE LA BURBUJA...1

Programación II. Mario Aldea Rivas Programación II 14/04/11 1

Algoritmos. Medios de expresión de un algoritmo. Diagrama de flujo

Transcripción:

Programación II Bloque temático 1. Lenguajes de programación Bloque temático 2. Metodología de programación Bloque temático 3. Esquemas algorítmicos Tema 4. Introducción a los Algoritmos Tema 5. Algoritmos voraces, heurísticos y aproximados Tema 6. Divide y Vencerás Tema 7. Ordenación Tema 8. Programación dinámica Tema 10.Ramificación y poda Tema 11.Introducción a los Algoritmos Genéticos Tema 12.Elección del esquema algorítmico Programación II 09/05/11 1 9.1. Introducción a la Vuelta Atrás 9.2. Eficiencia de los algoritmos VA 9.3. Problema de la mochila con Vuelta Atrás 9.4. Las N Reinas 9.5. Laberinto 9.6. Bibliografía Programación II 09/05/11 2 9.1 Introducción a la Vuelta Atrás 9.1 Introducción a la Vuelta Atrás Los algoritmos de Vuelta Atrás (Backtracking) realizan una exploración sistemática de las posibles soluciones del problema Vuelta Atrás suele utilizarse para resolver problemas complejos en los que la única forma de encontrar la solución es analizando todas las posibilidades - ritmo de crecimiento exponencial constituye una forma sistemática de recorrer todo el espacio de soluciones En general, podremos utilizar Vuelta Atrás para problemas: con solución representada por una n-tupla {x 1,x 2,,x n en los que cada una de las componentes x i de ese vector es elegida en cada etapa de entre un conjunto finito de valores (y 1,y 2,,y v ) Programación II 09/05/11 3

9.1 Introducción a la Vuelta Atrás Introducción a la Vuelta Atrás (cont.) El algoritmo va obteniendo soluciones parciales: normalmente el espacio de soluciones parciales es un árbol - árbol de búsqueda de las soluciones el algoritmo realiza un recorrido en profundidad del árbol cuando desde un nodo no se puede seguir buscando la solución se produce una vuelta atrás Problema del cambio: monedas:{v 1 =1,v 2 =2,v 3 =3 ccambiar=4 4 8 {1,1,1 {1,1,2 5 {1,1,1,1 6 {1,1,1,1,1 3 {1,1 9 {1,1,2,1 7 {1,1,1,2 10 {1,1,3 11 {1,2 12 {1,2,1 2 {1 13 {1,1,2,1 14 {1,2,2 15 {1,3 17 24 {2 {3 18 22 {2,1 {2,2 19 {2,1,1 25 {3,1 Programación II 09/05/11 4 1 { 16 {1,3,1 20 {2,1,1,1 21 {2,1,2 23 {2,2,1 26 {3,1,1 27 {3,2 9.1 Introducción a la Vuelta Atrás Introducción a la Vuelta Atrás (cont.) Algunas definiciones: Nodo vivo: nodo del que todavía no se han generado todos sus hijos Nodo prometedor: nodo que no es solución pero desde el que todavía podría ser posible llegar a la solución Dependiendo de si buscamos una solución cualquiera o la óptima el algoritmo se detiene una vez encontrada la primera solución o continúa buscando el resto de soluciones Estos algoritmos no crean ni gestionan el árbol explícitamente se crea implícitamente con las llamadas recursivas al algoritmo Programación II 09/05/11 5 9.2 Eficiencia de los algoritmos VA 9.2 Eficiencia de los algoritmos VA La eficiencia de este tipo de algoritmos depende del número de nodos que sea necesario explorar para cada caso - es imposible de calcular a priori de forma exacta Pero es posible calcular una cota superior sea n la longitud máxima de la solución y 0..v-1 el rango de valores para cada decisión tenemos que: n 1 nodos = v i v n i = 0 0 1 2 v-1 luego su eficiencia temporal será O(v n ) - resultado muy pesimista en la mayoría de los casos v 0 nodos v 1 nodos v 2 nodos v n-1 nodos Tienen unos requisitos de memoria O(n) - máxima profundidad de las llamadas recursivas Programación II 09/05/11 6

Vamos a resolver otra versión del problema de la mochila: se dispone un número ilimitado de objetos de cada tipo los objetos no se pueden fraccionar ( mochila entera o mochila {0,1 ) Problema NP-completo El problema verifica las condiciones necesarias para que pueda ser abordable utilizando Vuelta Atrás: la solución se puede representar con una N-tupla - conjunto de objetos metidos en la mochila en cada etapa de formación de la solución de elige un nuevo objeto de entre todos los objetos existentes (un conjunto finito) Programación II 09/05/11 7 Árbol de búsqueda del problema de la mochila Veamos el árbol de búsqueda para un caso particular tipos de objetos: {p 0 =2,v 0 =3, {p 1 =3,v 1 =5, {p 2 =4,v 2 =6 y {p 3 =5,v 3 =10, N=4 la mochila soporta un peso máximo P m =8 { 0 {1 3 {2 5 {3 6 {4 10 {1,1 6 {1,2 8 {1,3 9 {1,4 13 {2,2 10 {2,3 11 {2,4 15 {3,3 12 {1,1,1 9 {1,1,2 11 {1,1,3 12 {1,2,2 13 solución {1,1,1,1 12 La solución es la pareja {2,4 Programación II 09/05/11 8 Pseudocódigo (sólo da valor máximo) // retorna el máximo valor que podemos guardar en // una mochila de peso máximo pm método mochila(entero pm) retorna entero v:=0 // valor almacenado // probamos si cabe cada clase de objeto desde n:=0 hasta N-1 hacer si p n <=pm entonces // el objeto cabe en la mochila v:=max(v, v n +mochila(pm-p n )) retorna v Se puede optimizar este algoritmo para no repetir en una llamada recursiva casos ya explorados con anterioridad Programación II 09/05/11 9

Pseudocódigo optimizado // retorna el máximo valor que podemos guardar en // una mochila de peso máximo pm utilizando sólo // objetos de los tipos n0..n-1 método mochila(entero n0, entero pm) retorna entero v:=0 // valor almacenado // probamos si cabe cada clase de objeto desde n:=n0 hasta N-1 hacer si p n <=pm entonces // el objeto cabe en la mochila v:=max(v, v n +mochila(n,pm-p n )) retorna v La primera llamada a este método será: mochila(0,p) // donde P es el peso máximo Programación II 09/05/11 10 Árbol de búsqueda La llamadas recursivas incluidas en el pseudocódigo anterior generan el árbol de búsqueda formado por las soluciones parciales Ejemplo de árbol de búsqueda para un caso sencillo: tipos de objetos: {p 0 =1,v 0 =2 y {p 1 =2,v 1 =3, N=2 la mochila soporta un peso máximo P m =2 v=4 n=1 mochila(0,1) n=1 v=2 n=2 +v 1 mochila(0,0) v=0 n=1 n=2 mochila(0,2) v=4 v=3 +v 1 +v 2 n=2 v=0 mochila(1,0) n=1 n=2 Programación II 09/05/11 11 Eficiencia (resultado pesimista) Para un problema con N tipos de objetos, en que el peso máximo es P m y el peso del objeto más ligero es p el número máximo de objetos que caben en la mochila es P m /p N 0 nodos 0 1 2 N-1 N 1 nodos N 2 nodos N Pm/p-1 nodos Su eficiencia es proporcional al máximo número de nodos que puede ser necesario explorar Eficiencia: O(N Pm/p ) Programación II 09/05/11 12

Pseudocódigo (retorna objetos incluidos) método mochila(entero n0, entero pm) retorna listaincluidos listaincluidos:= // lista vacía // probamos si cabe cada clase de objeto desde n:=n0 hasta N-1 hacer si p n <=pm entonces lista := mochila(n, pm-p n ) si v n +lista.v > listaincluidos.v entonces // lista más el nuevo objeto tiene mejor // valor que listaincluidos listaincluidos := lista añade objeto n a listaincluidos retorna listaincluidos Programación II 09/05/11 13 Implementación (retorna objetos incluidos) // cada uno de los tipos de objetos disponibles para // incluir en la mochila public static class ObjetoMochila { int v; int p; String nombre; public ObjetoMochila(int v, int p, String nombre){ this.v=v; this.p=p; this.nombre=nombre; // solución del algoritmo: lista de objetos // incluidos en la mochila y suma de su valor public static class SoluciónMochila { int v = 0; LinkedList<ObjetoMochila> lista = new LinkedList<ObjetoMochila>(); Programación II 09/05/11 14 Implementación (retorna objetos incluidos) (cont.) // método que retorna el contenido óptimo de la mochila // (conjunto de objetos con el que se consigue el mayor valor) // Recibe como argumentos el array con los objetos y // el peso máximo soportado por la mochila // Llama a mochilarec public static SoluciónMochila mochila(objetomochila[] objs, int pm){ return mochilarec(0,objs,pm); // retorna el conjunto de objetos con mayor valor que podemos // guardar en una mochila de peso máximo pm utilizando sólo // objetos de los tipos n..obj.length-1 private static SoluciónMochila mochilarec(int n0, ObjetoMochila[] objs, int pm){ // código en la transparencia siguiente Programación II 09/05/11 15

Implementación (retorna objetos incluidos) (cont.) private static SoluciónMochila mochilarec(int n0, ObjetoMochila[] objs, int pm) { SoluciónMochila sm = new SoluciónMochila(); // probamos si cabe cada clase de objeto for(int n=n0; n<objs.length; n++) { if (objs[n].p<=pm) { SoluciónMochila sm1= mochilarec(n, objs, pm-objs[n].p); if (objs[n].v+sm1.v > sm.v) { // sm1+objs[n] tiene mejor valor que sm // elegimos sm1+objs[n] como la sol. actual sm=sm1; sm.v = objs[n].v+sm.v; sm.lista.add(objs[n]); // fin for return sm; Programación II 09/05/11 16 Colocar N reinas en un tablero de ajedrez de N N de forma que no se puedan comer entre sí En una solución nunca podrá haber dos reinas en la misma fila este hecho permite expresar la solución como una N-tupla {c 0,c 1,,c N-1 1 2 3 siendo c f la columna donde se sitúa la reina de la f-ésima fila - la solución del dibujo se representa por la 4-tupla:{1,3,0,2 El problema verifica las condiciones necesarias para que pueda ser abordable utilizando Vuelta Atrás: la solución se puede representar con una N-tupla los componentes c i se eligen uno a uno de entre un conjunto finito de valores (las columnas de la tabla) Programación II 09/05/11 17 0 1 2 3 0 Una de las dos posibles soluciones al problema de las 4 reinas Árbol de búsqueda de las soluciones Deberemos recorrer las posibles soluciones parciales cada posible solución parcial es una n-tupla (n N) una solución parcial es n-prometedora si define una colocación de n reinas en las n primeras filas sin que se coman la expansión de una rama se corta al encontrar una solución NO n-prometedora una solución al problema es cualquier solución N-prometedora Ejemplo: árbol de búsqueda para un tablero de 4 4: { 0 {0,0 {0,1 {0 1 {0,2 2 {0,3 3 {1,0 {0,2,0 {0,2,1 {0,2,2 {0,2,3 {0,3,0 {0,3,1 4 {0,3,2 {0,3,3 {0,3,1,0 {0,3,1,1 {0,3,1,2 {0,3,1,3 {1,1 {1,3,0,0 Solución {1 encontrada! 5 {1,3,0 {1,3,0,1 {1,2 7 {1,3,0,2 {1,3 8 6 Programación II 09/05/11 18

Pseudocódigo N Reinas // método que encuentra una solución para el // problema de las N reinas // Retorna un array con la columna en que se sitúa // la reina de cada fila método nreinas(entero N) retorna entero[0..n-1] solución:=nuevo entero[0..n-1] si nreinasrec(0,solución) entonces retorna solución else retorna nulo // Coloca recursivamente las reinas de las filas f..n-1 // Retorna verdadero si encuentra la solución método nreinasrec(entero f, entero[0..n-1] sol) retorna Booleano // código en la transparencia siguiente Programación II 09/05/11 19 Pseudocódigo N Reinas (cont.) método nreinasrec(entero f, entero[0..n-1] sol) retorna Booleano // para cada columna desde c:=0 hasta N-1 hacer sol[f]:=c // reina de la fila f en la columna c si nprometedora(sol[0..f]) entonces si f==n-1 entonces // es f la última fila? // la solución incluye a todas las reinas retorna verdadero // solución encontrada // llamada recursiva para la siguiente fila solencontrada:=nreinasrec(f+1, sol) si solencontrada entonces retorna verdadero retorna falso Programación II 09/05/11 20 Pseudocódigo N Reinas (cont.) Necesitamos un método para determinar si una solución parcial (sparcial) es n-prometedora (n N): método nprometedora(entero[0..n] sparcial) retorna Booleano {sparcial[0..n-1] es (n-1)prometedora desde i:=0 hasta n-1 hacer // misma columna o misma diagonal? si sparcial[i] == sparcial[n] o sparcial[i]-sparcial[n] == i-n entonces retorna falso // no n-prometedora // sparcial[0..n] es n-prometedora retorna true Dos reinas están en la misma diagonal cuando: columna a -columna b == fila a -fila b Programación II 09/05/11 21

Eficiencia Eficiencia temporal: longitud de la solución: N (número de reinas) alternativas en cada etapa: N (número de columnas) eficiencia: O(N N ) Eficiencia espacial: un array de tamaño N: O(N) variables auxiliares: O(1) como máximo N llamadas recursivas anidadas: O(N) eficiencia: O(N) Programación II 09/05/11 22 Encontrar la salida de un laberinto representado mediante una matriz filas columnas Cada posición del laberinto puede tener los valores: -1:muro, -2:salida, 0:camino {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, {-1,00,-1,-1,-1,-1,-2,-1,00,00,-1, {-1,00,-1,00,-1,-1,00,-1,-1,00,-1, {-1,00,-1,00,-1,-1,00,00,00,00,-1, {-1,00,00,00,00,00,00,-1,00,-1,-1, {-1,-1,00,-1,00,-1,-1,-1,00,-1,-1, {-1,-1,00,-1,00,-1,-1,-1,00,-1,-1, {-1,00,00,-1,00,00,00,00,00,00,-1, {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 Es un problema abordable con Vuelta Atrás: su solución está constituida por una secuencia de decisiones: - cada uno de los pasos en el camino hacia la salida en cada decisión elegimos entre un número finito de opciones: - movimientos a izquierda, arriba, abajo o derecha Programación II 09/05/11 23 Algoritmo (encuentra salida) {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, {-1, 1,-1,-1,-1,-1,-2,-1,00,00,-1, {-1, 2,-1,12,-1,-1,27,-1,-1,00,-1, {-1, 3,-1,11,-1,-1,26,25,24,00,-1, {-1, 4, 5,10,13,00,00,-1,23,-1,-1, {-1,-1, 6,-1,14,-1,-1,-1,22,-1,-1, {-1,-1, 7,-1,15,-1,-1,-1,21,-1,-1, {-1, 9, 8,-1,16,17,18,19,20,00,-1, {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 Solución encontrada En cada paso el algoritmo: escribe el número de paso en la posición actual realiza llamadas recursivas para cada uno de los movimientos válidos (posiciones con valor 0) Cuando para una posición no existe ningún movimiento válido se produce una vuelta atrás se retrocede hasta la posición anterior que tenga todavía algún movimiento sin realizar // encuentra la salida de un laberinto partiendo // desde la posición xini, yini método resuelvelaberinto(entero xini, entero yini, entero[][] laberinto) retorna Booleano // código en la transparencia siguiente Programación II 09/05/11 24

Pseudocódigo (encuentra salida) entero paso = 0 // contador de pasos método resuelvelaberinto(entero xini, entero yini, entero[][] laberinto) retorna Booleano paso++ laberinto[yini][xini]:=paso para mov en (izquierda,arriba,abajo,derecha) hacer (xnew, ynew):=movimiento(mov,xini,yini) si laberinto[ynew][xnew] es la salida entonces retorna verdadero // salida alcanzada sino si laberinto[ynew][xnew] es camino entonces // llamada recursiva desde la nueva posición si resuelvelaberinto(xnew, ynew, laberinto) entonces retorna verdadero // salida alcanzada retorna falso // no hay solución Programación II 09/05/11 25 Eficiencia La eficiencia temporal depende del número de posiciones del laberinto que sean camino (C): máxima longitud de la solución: C alternativas en cada etapa: 3 (como máximo, menos en la 1ª que podrían ser 4) eficiencia: O(3 C ) C está acotado por el tamaño del laberinto (filas columnas) Eficiencia espacial: laberinto (tabla filas columnas): O(filas columnas) variables auxiliares: O(1) como máximo C llamadas recursivas anidadas: O(C) eficiencia: O(filas columnas) Programación II 09/05/11 26 Algoritmo (camino más corto) El algoritmo anterior paraba al encontrar la primera solución supongamos que no nos basta con eso, sino que queremos encontrar el camino más corto entre la entrada y la salida Algoritmo modificado para encontrar el camino más corto: va almacenando la solución parcial en curso (camino recorrido) - una solución contiene una copia del laberinto (con los pasos ya dados hasta llegar a la posición actual), la posición actual y el número de pasos dados va apuntando la mejor solución encontrada hasta el momento (mejorsol) a cada llamada recursiva se le pasa una copia de la solución en curso - de esta forma cuando se produce una vuelta atrás se vuelve a la situación original Programación II 09/05/11 27

Pseudocódigo (camino más corto) // encuentra el camino más corto en un laberinto // comenzando desde la posición xini, yini método caminomascortolaberinto(entero xini, entero yini, entero[][] labe) retorna entero[][] SoluciónLaberinto situacióninicial:= (pasos:=0, x:=ini,y:=yini,laberinto:=labe) mejorsol.pasos:=valor muy grande caminomascortorec(situacióninicial) retorna mejorsol.laberinto; método caminomascortorec(soluciónlaberinto lab) // código en la transparencia siguiente Programación II 09/05/11 28 Pseudocódigo (camino más corto) (cont.) método caminomascortorec(soluciónlaberinto lab) lab.paso++ lab.laberinto[lab.y][lab.x]:=lab.paso para mov en (izquierda,arriba,abajo,derecha) hacer (xnew, ynew):=movimiento(mov,lab.x,lab.y) si lab[ynew][xnew] es la salida entonces si lab.pasos<mejorsol.pasos entonces // el camino encontrado pasa es el mejor mejorsol=copia(lab); sino si lab.laberinto[ynew][xnew] es camino entonces // Copia el estado actual del laberinto y // realiza la llamada recursiva SoluciónLaberinto copialab = copia(lab) copialab.(x,y):=(xnew,ynew) caminomascortolaberintorec(copialab) Programación II 09/05/11 29 Eficiencia La eficiencia temporal depende del número de posiciones del laberinto que sean camino (C) y del máximo número de caminos distintos (ncaminos) máxima longitud de la solución: C (C filas columnas) alternativas en cada etapa: 3 (menos en la 1ª que podrían ser 4) tiempo para resolver cada camino: O(3 C ) eficiencia: O(nCaminos 3 C ) (resultado muy pesimista) Eficiencia espacial: una copia del laberinto por cada llamada recursiva O(filas columnas) como máximo C llamadas recursivas anidadas: O(C) eficiencia: O(C filas columnas) Programación II 09/05/11 30

Posibles mejoras Sería posible aplicar algunas optimizaciones una vez que sepamos donde está la salida (encontremos la primera solución): elegir primero el movimiento que más nos acerque a ella cortar el desarrollo de una rama cuando el número de pasos sea mayor que el de la mejor solución encontrada o mejor todavía: cortar el desarrollo de una rama cuando el número de pasos más el mínimo número de pasos que necesitaríamos hasta la salida sea mayor que el de la mejor solución También estaría bien poder realizar una vuelta atrás temporal cuando un camino se aleja demasiado de la salida de forma que resolveríamos las posiciones prometedoras por orden de cercanía a la salida veremos como esto se puede hacer con Ramificación y Poda Programación II 09/05/11 31 9.6 Bibliografía 9.6 Bibliografía [1] Brassard G., Bratley P., Fundamentos de algoritmia. Prentice Hall, 1997. [2] Aho A.V., Hopcroft J.E., Ullman J.D., Estructuras de datos y algoritmos. Addison-Wesley, 1988. [3] Sartaj Sahni, Data Structures, Algoriths, and Applications in Java. Mc Graw Hill, 2000 El capítulo sobre Vuelta Atrás está en la web: http://www.cise.ufl.edu/~sahni/dsaaj/ Programación II 09/05/11 32