Tema: Algoritmos Backtracking.

Documentos relacionados
Tema: Algoritmos para la ruta más corta en un Grafo.

Tema: Grafos en C#. Objetivos Específicos. Materiales y Equipo. Introducción Teórica. Programación IV. Guía 7

Tema: Métodos de Ordenamiento. Parte 1.

Parte de Algoritmos de la asignatura de Programación Master de Bioinformática. Búsqueda exhaustiva

Tema: Plantillas en C++.

Guia#9: Punteros en C#.

UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO

Tema: Tipos Abstractos de Datos (TAD s) en C#.

Clase adicional 9. Listas enlazadas. Temas. Listas enlazadas Árboles Problemas de la clase adicional Ejercicios de diseño

Tema: Estructuras de Repetición en C# [For].

Tema: Introducción al IDE de Microsoft Visual C#.

Tema: Autómatas de Estado Finitos

Taller de Backtracking

Tema: Análisis Léxico

Tema: Estructuras de Selección en C#.

Tema: Análisis Sintáctico

Tema: Estructuras de Repetición en C# [While y Dowhile].

Estructura de datos y de la información Boletín de problemas - Tema 10

Estratégias generales de análisis y diseño de algorítmos

Tema: Repaso sobre el uso del IDE de Microsoft Visual C#.

Procesadores de lenguaje Tema 5 Comprobación de tipos

Tema: Tipos de datos y conversiones

Algoritmos y Estructuras de Datos Curso 06/07. Ejercicios

FACULTAD DE INGENIERÍA

GUIA 2: Repaso sobre uso de C#. Funciones, métodos y arreglos.

Árboles. Árboles. Árboles binarios de búsqueda. Árboles. Inserción en un árbol. Árbol binario de búsqueda

Definición de una base de datos. Un manejador de base de datos es un programa que permite administrar y organizar una serie de datos.

Tema1:Controles de Programas estructurados. Entrada y salida de datos ENTRADA Y SALIDA DE DATOS ENTRADA Y SALIDA

Práctica 1 Arreglos n-dimensionales y operaciones con bits PRÁCTICA I

Árboles balanceados (AVL) Tablas de dispersión (Hash) Colas de prioridad (Heap)

Complejidad computacional (Análisis de Algoritmos)

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

Tema: Sobrecarga. Objetivos. Materiales y Equipo. Introducción Teórica. Programación II. Guía No. 7

Tema: Punteros a Objetos. Puntero this.

Funciones: Pasos por Referencia Recursividad

Conexión SQL Server y C# (Consola)

Tema: Funciones, Procedimientos y Recursividad en C#.

Estructuras de datos utilizando JAVA

Tema 7- Modelo y Aplicación de Pila, Cola y. Tema 7- Modelo y Aplicación de. Lista Con Punto de Interés

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

Grafos Eulerianos y Hamiltonianos. Algoritmos y Estructuras de Datos III

Tema 10: Árbol binario de búsqueda

Tema: Clases y Objetos en C#. Parte II.

Tema: Introducción al uso del simulador S7-PLCSIM

Dirección de Operaciones

259. El número de combinaciones de m objetos entre un conjunto de n, denotado por n, para n 1 y 0 m n, se puede definir recursivamente por: m

TEMA 3. Árboles. Objetivos. Contenidos. Bibliografía. Básica

INFOTECH MÓDULO 1 CURSO. Conocimientos esenciales de programación. Lógica y Lenguaje de Programación

Tema: Autómata de Pila

Ejercicio 7 Tablas de Datos y Búsqueda

Tema: Configuración de spanning tree

Prueba N o 1. Programación II

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]

public class AtaqueVoraz extends EsquemaVZ implements EstrategiaSolucion {

Tema: Manejo del Puerto Paralelo con LabView

Metaheurísticas y heurísticas. Algoritmos y Estructuras de Datos III

Sudoku con AMPL. Stefano Nasini. Dept. of Statistics and Operations Research Universitat Politécnica de Catalunya

Unidad Nº V Listas Enlazadas

EDA. Tema 8 Colas de Prioridad: Heaps

Universidad de Valladolid. Departamento de informática. Campus de Segovia. Estructura de datos Tema 1: Recursividad. Prof. Montserrat Serrano Montero

Procesos de Fabricación I. Guía 1 1 SISTEMAS HIDRÁULICOS Y NEUMÁTICOS.

Guia#12: Tema: Archivos en C#.

Resolviendo Problemas Buscando Soluciones. Tomás Arredondo Vidal 16/6/2010

Agenda..NET C# Laboratorio #1

Inteligencia Artificial II Unidad Plan 2010-Ingeniería en Sistemas Computacionales

PROGRAMACIÓN LINEAL ENTERA

Porque usar Arreglos?

Tema 2 Tipos abstractos de datos. 2.2 Pila de números enteros

Programación III. 1. Facultad: Ingeniería Escuela: Computación Asignatura:Programación III I. OBJETIVOS II. INTRODUCCIÓN TEÓRICA

Unidad II: Análisis semántico

Taller de Programación Dinámica. Definiciones. Caso base. Laboratorio de Algoritmos y Estructuras de Datos III. 10 de Septiembre de 2010

Diseño Estructurado de Algoritmos

Análisis de Presupuestos, Herramientas de Análisis Y Si

Unidad Didáctica 3. Tipos genéricos. Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos

Tema 7.- Fundamentos de la Programación Orientada a Objetos

Examen escrito de Programación 1

Algoritmos genéticos

Configurar DHCP en los routers, para que permitan configuración de los hosts locales conectados en su Ethernet.

Búsqueda en línea y Búsqueda multiagente

GUÍA DE EXÁMENES DE PROGRAMACIÓN II

El problema del agente viajero

Clase 26. Introducción a los árboles. Árboles

1. Diseñe algoritmos que permitan resolver eficientemente el problema de la mochila 0/1 para los siguientes casos:

EJERCICIO 2 (3 PUNTOS) A) Sea el árbol binario AVL de la figura siguiente: B) Dada la estructura de la figura siguiente:

GUIA 1: Entorno de Visual Studio. Lenguajes de Programación.

El método main de la clase PruebaArbol, empieza creando una instancia de un objeto Árbol vacío y asigna su referencia a la variable árbol

Estado 3.2 (coste = 9)

Notación Asintótica 2

1. Título: Jugar sudoku

Grafos. Amalia Duch Brown Octubre de 2007

Objetivos de la sesión. Aplicación de consola 7/30/11. Código con que se inicia un programa en Visual C# (aplicación de consola)

como les va con las practicas?

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

Transcripción:

Programación IV. Guía 12 1 Facultad: Ingeniería Escuela: Computación Asignatura: Programación IV Tema: Algoritmos Backtracking. Objetivos Específicos Comprender el funcionamiento de un Algoritmo Backtracking. Identificar problemas que pueden resolverse con Algoritmos Bactracking. Codificar algoritmos backtracking en C#. Materiales y Equipo Guía Número 12. Computadora con programa Microsoft Visual C#. Introducción Teórica Hay problemas para los que no se conoce un algoritmo para su resolución o al menos, no cuentan con un algoritmo eficiente para calcular su solución. En estos casos, la única posibilidad es una exploración directa de todas las posibilidades. La técnica Backtracking es un método de búsqueda de soluciones exhaustiva sobre grafos dirigidos acíclicos, el cual se acelera mediante poda de ramas poco prometedoras. Es decir: Se representan todas las posibilidades en un árbol. Se resuelve buscando la solución por el árbol (de una determinada manera). Hay zonas que se evitan por no contener soluciones (poda). La solución del problema se representa en una lista ordenada (X 1, X 2,, X n ) (no llenando necesariamente todas las componentes). Cada Xi se escoge de un conjunto de candidatos. A cada lista se le llama estado. Se trata de buscar estados solución del problema.

2 Programación IV. Guía 12 Tiene condiciones de parada: a) cuando se alcanza un estado solución b) cuando se alcanzan todos los estados solución En su forma básica, la idea de backtracking se asemeja a un recorrido en profundidad dentro de un grafo dirigido. El grafo en cuestión suele ser un árbol, o por lo menos no contiene ciclos. Sea cual sea su estructura, existe sólo implícitamente. El objetivo del recorrido es encontrar soluciones para algún problema. El recorrido tiene éxito si, procediendo de esta forma, se puede definir por completo una solución. En este caso el algoritmo puede bien detenerse (si lo único que se necesita es una solución del problema) o bien seguir buscando soluciones alternativas (si deseamos examinarlas todas). Por otra parte, el recorrido no tiene éxito si en alguna etapa la solución parcial construida hasta el momento no se puede completar. En tal caso, el recorrido vuelve atrás exactamente igual que en un recorrido en profundidad, eliminando sobre la marcha los elementos que se hubieran añadido en cada fase. Cuando vuelve a un nodo que tiene uno o más vecinos sin explorar, prosigue el recorrido de una solución. Los problemas que deben satisfacer un determinado tipo de restricciones son problemas completos, donde el orden de los elementos de la solución no importa. Estos problemas consisten en un conjunto (o lista) de variables a la que a cada una se le debe asignar un valor sujeto a las restricciones del problema. La técnica va creando todas las posibles combinaciones de elementos para obtener una solución. Su principal virtud es que en la mayoría de las implementaciones se puede evitar combinaciones, estableciendo funciones de acotación (o poda) reduciendo el tiempo de ejecución. La técnica backtracking (vuelta atrás) está muy relacionada con la búsqueda binaria. Diseño e implementación Backtracking. Esencialmente, la idea es encontrar la mejor combinación posible en un momento determinado, por eso, se dice que este tipo de algoritmo es una búsqueda en profundidad. Normalmente, se suele implementar este tipo de algoritmos como un procedimiento recursivo. La diferencia con la búsqueda en profundidad es que se suelen diseñar funciones de cota, de forma que no se generen algunos estados si no van a conducir a ninguna solución, o a una

Programación IV. Guía 12 3 solución peor de la que ya se tiene. De esta forma se ahorra espacio en memoria y tiempo de ejecución. Al diseñar un algoritmo backtraking debemos considerar los siguientes elementos: a) Representación de la solución en una lista ordenada (X 1, X 2,, X n ). b) Una función objetivo para determinar si la lista a analizar es una solución. c) Unas restricciones a los candidatos para rellenar la lista: Implícitas del problema. Valores que puede tomar cada valor Xi Explícitas o externas al problema. Por ejemplo, problema de la mochila, el peso no debe superar la capacidad de la mochila. d) Una función de poda para eliminar partes del árbol de búsqueda e) Organización del problema en un árbol de búsqueda. f) Construir la solución al problema en distintas etapas. g) En cada paso se elige un candidato y se añade a la solución, y se avanza en la solución parcial. h) Si no es posible continuar en la construcción hacia una solución completa, se abandona ésta y la última componente se cambia por otro valor. i) Si no quedan más valores por probar, se retrocede al candidato anterior, se desecha, y se selecciona otro candidato. Para diseñar un algoritmo con la técnica backtracking, debemos seguir los siguientes pasos: 1. Buscar una representación del tipo (X 1, X 2,, X n ) para las soluciones del problema. 2. Identificar las restricciones implícitas y explícitas del problema. 3. Establecer la organización del árbol que define los diferentes estados en los que se encuentra una (sub)solución. 4. Definir una función solución para determinar si una lista ordenada es solución 5. Definir una función de poda B k (X 1, X 2,, X k ) para eliminar ramas del árbol que puedan derivar en soluciones poco deseables o inadecuadas. 6. Aplicar la estructura genérica de un algoritmo backtracking Estructura genérica para un algoritmo backtracking. Solución [i] S i para i = 1, 2,..., n

4 Programación IV. Guía 12 funcion BACKTRACKING_REC ( k, solucion[n]) para j S i si ( PODA (k, j, solucion) == true ) hacer sol[k] = j si ( TEST_SOL (solucion) == true ) hacer devolver solucion si ( k < n ) BACKTRACKING_REC(k+1,solucion[n]) La eficiencia en un algoritmo backtracking suele ser de tipo exponencial a n. La eficiencia depende de: la ramificación del árbol del tiempo de ejecución de la función solución del tiempo de ejecución de la función poda del ahorro de utilizar la poda Las buenas funciones de poda no son muy eficientes. Entre los problemas típicos que se pueden resolver fácilmente con las técnicas de vuelta atrás tenemos: la vuelta del caballo, sudoku, laberintos, sopa de letras, problema de las parejas, formación de una palabra con n cubos, problema del dominó, problema del reparto del botín, coloreado de grafos, problema del viajante sobre grafos dirigidos; entre otros. Procedimiento Ejemplo 1. Problema del Sudoku. El Sudoku es un rompecabezas matemático de colocación que se popularizó en Japón en 1986 y se dió a conocer en el ámbito internacional en 2005. El objetivo es rellenar una cuadrícula de 9 9 celdas dividida en subcuadrículas de 3 3 con las cifras del 1 al 9 partiendo de algunos números ya dispuestos en algunas de las celdas. No se debe repetir ninguna cifra en una misma fila, columna o subcuadrícula. Visualización de Sudoku:

Programación IV. Guía 12 5 A continuación, implementaremos el algoritmo backtracking para resolver el problema del Sudoku en un proyecto de Visual C#. 1. Crear un proyecto de consola, se sugiere llamarlo Algoritmo Backtracking. 2. Cambiamos el nombre del Program.cs a Sudoku.cs. 3. Agregar el siguiente código a la clase Sudoku using System; using System.Collections.Generic; using System.Text; namespace Algoritmo_Bactracking class Sudoku // Declaración de variable que definirá el tamaño del tablero public static int Dimension = 9; // Función para imprimir el tablero del Sudoku public static void imprimir(int[, ] tablero) for (int i = 0; i < Dimension; i++) if (i % 3 == 0) Console.WriteLine( ); for (int j = 0; j < Dimension; j++) if (j % 3 == 0) Console.Write(" "); Console.ForegroundColor = ConsoleColor.Yellow; // cambia el color de la Console.Write(tablero[i, j]); // fuente Console.WriteLine( );

6 Programación IV. Guía 12 //Esta función resuelve el Sudoku public static Boolean resolver(int[, ] tablero) for (int i = 0; i < Dimension; i++) for (int j = 0; j < Dimension; j++) if (tablero[i, j]!= 0) continue; else //Calcula los elementos de la solución, para ello revisa si es posible insertar //el valor k en las coordenadas correspondientes for (int k = 1; k <= 9; k++) if (esposibleinsertar(tablero, i, j, k)) //Si el valor de K es consistente, entonces establece en la posición el //valor de K, y luego se hace una llamada recursiva tablero[i, j] = k; Boolean b = resolver(tablero); if (b) return true; tablero[i, j] = 0; // Cuando se termina de recorrer el tablero y no se ha retornado el valor de // verdadero, entonces, el tablero no tiene solución return false; Console.WriteLine( ); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("Solucion encontrada: "); imprimir(tablero); return true; // Función para verificar si se añade un valor al tablero, el tablero siga siendo // consistente, es decir, que el valor no se repita en la fila o columna public static Boolean esposibleinsertar(int [, ] tablero, int i, int j, int valor) //Primeramente, se verifica que el valor no se encuentre en la misma fila for (int a = 0; a < Dimension; a++) if (a!= i && tablero[a, j] == valor) return false;

Programación IV. Guía 12 7 //Luego, se verifica que el valor no se encuentre en la misma columna for (int a = 0; a < Dimension; a++) if (a!= j && tablero[i, a] == valor) return false; //Se verifica que el valor no se encuentre en la misma cuadricula int y = (i / 3) * 3; int x = (j / 3) * 3; for (int a = 0; a < Dimension / 3; a++) for (int b = 0; b < Dimension / 3; b++) if (a!= i && b!= j && tablero[y + a, x + b] == valor) return false; return true; // Función principal del programa static void Main(string[ ] args) // Generamos un tablero inicial de Sudoku int[, ] tablero = new int [, ] 0,7,0, 0,0,0, 0,8,0, 0,5,8, 6,0,0, 0,0,1, 0,0,3, 1,4,0, 0,0,0, ; 9,0,6, 0,5,0, 3,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,5, 0,2,0, 1,0,7, 0,0,0, 0,6,5, 7,0,0, 3,0,0, 0,0,1, 9,2,0, 0,4,0, 0,0,0, 0,1,0, Console.WriteLine("El Juego a resolver es: "); imprimir(tablero); if(!resolver(tablero)) Console.WriteLine("El Sudoku no tiene solución"); Console.WriteLine( ); Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine("Presione la tecla Enter para salir"); Console.Read( );

8 Programación IV. Guía 12 Análisis de resultados Ejercicio 1. Realice un programa en C# para implementar la solución al problema del Sudoku en una interfaz gráfica de formulario (Windows Forms). La aplicación debe permitir realizar las siguientes operaciones: Generar nuevos juegos (distintos cada vez que se seleccione esta opción) de manera automática. Generar nuevos juegos (cargar un tablero en blanco, para que el usuario coloque la condición inicial del juego). Comprobar solución (debe verificarse la solución realizada por el usuario). Resolver juego actual. En las imágenes se muestran ejemplos de cómo podría lucir su aplicación:

Programación IV. Guía 12 9 Investigación Complementaria Para la siguiente semana: Investigue el problema de la vuelta del caballo (variante del juego de ajedrez), y realice su solución con algoritmo backtracking. La implementación debe realizarse con Visual C# en una interfaz gráfica de formulario (Windows Forms). La solución debe permitir realizar las siguientes acciones: Permitir al usuario indicar el tamaño del tablero. Permitir al usuario colocar el caballo en la posición inicial que desee. Los movimientos del caballo deben observarse en pantalla, es decir, que debe quedar en pantalla, las distintas posiciones que ya ocupó el caballo (es decir, que debe existir una simulación de los movimientos del caballo. El programa indicará si existe solución o no existe solución.

10 Programación IV. Guía 12 Guía 12: Algoritmos Backtracking Hoja de cotejo: 12 Alumno: Máquina No: Docente: GL: Fecha: EVALUACIÓN % 1-4 5-7 8-10 Nota CONOCIMIENTO Del 20 al 30% Conocimiento deficiente de los fundamentos teóricos Conocimiento y explicación incompleta de los fundamentos teóricos Conocimiento completo y explicación clara de los fundamentos teóricos APLICACIÓN DEL CONOCIMIENTO Del 40% al 60% ACTITUD Del 15% al 30% No tiene actitud proactiva. Actitud propositiva y con propuestas no aplicables al contenido de la guía. Tiene actitud proactiva y sus propuestas son concretas. TOTAL 100%