el problema de las jarras de agua tema 6 prolog
TRANSCRIPT
1
Universidad Nacional de Trujillo
Facultad de Ciencias Físicas y Matemáticas
Escuela Profesional de Informática
PROGRAMACIÓN LÓGICA
“El problema de las jarras de agua”
Autores:
Poémape Vargas Oscar Roberto
Silva Coronado Oskar Hernando
Vásquez Alvarado Mario Fernando
Ciclo:
VII
Profesor:
Arturo Díaz Pulido
2014
2
Índice
Dedicatoria................................................................................................................................................... 3
Introducción ................................................................................................................................................ 4
Marco teórico .............................................................................................................................................. 5
Capitulo I. Teoría de Grafos y árboles. ............................................................................................... 5
Capitulo II. Búsqueda por Profundidad y Búsqueda por amplitud ....................................................... 8
Capitulo III. Descripción y Solución del Problema ............................................................................. 10
A. Enunciado del problema.................................................................................................................. 10
B. Descripción ..................................................................................................................................... 11
1. Algoritmo Principal .................................................................................................................... 11
2. Algoritmo busca .......................................................................................................................... 11
3. Algoritmo aplica ......................................................................................................................... 12
4. Algoritmo llenar ......................................................................................................................... 13
5. Algoritmo vaciar ......................................................................................................................... 14
6. Algoritmo verter ......................................................................................................................... 15
7. Algoritmo vertido ........................................................................................................................ 16
C. Código solución .............................................................................................................................. 17
Conclusiones .............................................................................................................................................. 18
Referencias Bibliográficas ........................................................................................................................ 19
Anexos ........................................................................................................................................................ 20
Apéndice A. Código en Prolog para el Problema de Jarras de 3 y 5 unidades................................. 20
Apéndice B. Algoritmo Solución para el problema de las Jarras Propuesto .................................... 23
3
Dedicatoria
El presente trabajo está dedicado a todos los compañeros
que llevan el curso de Programación Lógica, a aquellos
que lo llevarán en el futuro y también para quienes les
interese esta parte de las Ciencias de la Computación,
esperando contribuir con el aprendizaje de todos y
también contar con sus críticas constructivas las cuales,
estamos seguros, nos harán mejorar.
4
Introducción
Si consideramos un problema como una situación que se presenta en la que se sabe más o menos, o
con toda claridad, a dónde se quiere ir, pero no se sabe cómo; entonces resolver un problema es
precisamente aclarar dicha situación y encontrar algún camino adecuado que lleve a la meta.
A veces no sabremos si la herramienta adecuada para la situación está entre la colección de técnicas
que dominamos o ni siquiera si se ha creado una técnica que pueda ser suficientemente potente para
resolver el problema. Esta es precisamente la circunstancia del investigador, en matemáticas y en
cualquier otro campo, y, por otra parte, ésta es la situación en la que nos encontramos a veces en nuestra
vida normal.
Precisamente en el presente trabajo, se trata un problema lógico: El problema de las jarras de agua;
y se concibe una solución utilizando herramientas muy potentes como son la programación lógica y los
árboles de búsqueda.
Para la introducción al tema se ha considerado la teoría más importante y necesaria para entender el
modo de resolución del problema: primero un breve repaso por la teoría de grafos para luego usar este
concepto en la definición de árbol y cómo es que se aplica en la solución mediante la búsqueda por
profundidad y la búsqueda por amplitud.
Teniendo ya claros los conceptos básicos, se presenta la descripción del problema y luego la
descripción de la solución, finalizando con la presentación del código del programa en lenguaje Prolog
que refleja la solución planteada.
5
Marco teórico
Capitulo I. Teoría de Grafos y árboles.
A. Introducción
La Teoría de Grafos juega un papel importante en la fundamentación matemática
de las Ciencias de la Computación. Los grafos constituyen una herramienta básica para
modelar fenómenos discretos y son fundamentales para la comprensión de las estructuras
de datos y el análisis de algoritmos. En matemáticas y ciencias de la computación, la
teoría de grafos estudia las propiedades de los grafos, que son colecciones de objetos
llamados vértices (o nodos) conectados por líneas llamadas aristas (o arcos) que pueden
tener orientación (dirección asignada). Típicamente, un grafo está diseñado por una serie
de puntos (los vértices) conectados por líneas (las aristas).
B. Definición
Un grafo es una pareja G = (V, A), donde V es un conjunto de puntos, llamados
vértices, y A es un conjunto de pares de vértices, llamadas aristas.
En teoría de grafos, sólo queda lo esencial del dibujo: la forma de las aristas no son
relevantes, sólo importa a qué vértices están unidas. La posición de los vértices tampoco
importa, y se puede variar para obtener un grafo más claro.
C. Elementos
Vértices: Son los objetos representados por punto dentro del grafo.
Aristas: son las líneas que unen dos vértices.
Aristas Adyacentes: dos aristas son adyacentes si convergen sobre el mismo
vértice.
6
D. Caracterización de los grafos
Grafos simples
Un grafo es simple si a lo más existe una arista uniendo dos vértices cualesquiera.
Esto es equivalente a decir que una arista cualquiera es la única que une dos vértices
específicos. Un grafo que no es simple se denomina multigrafo.
Grafos conexos
Un grafo es conexo si cada par de vértices está conectado por un camino; es decir,
si para cualquier par de vértices (a, b), existe al menos un camino posible desde a hacia b.
Un grafo es doblemente conexo si cada par de vértices está conectado por al menos
dos caminos disjuntos; es decir, es conexo y no existe un vértice tal que al sacarlo el grafo
resultante sea disconexo.
Es posible determinar si un grafo es conexo usando un algoritmo Búsqueda en
anchura (BFS) o Búsqueda en profundidad (DFS).
En términos matemáticos la propiedad de un grafo de ser (fuertemente) conexo
permite establecer con base en él una relación de equivalencia para sus vértices, la cual
lleva a una partición de éstos en "componentes (fuertemente) conexas", es decir,
porciones del grafo, que son (fuertemente) conexas cuando se consideran como grafos
aislados. Esta propiedad es importante para muchas demostraciones en teoría de grafos.
E. Árbol
Sea G un grafo no dirigido. G es un árbol si satisface las siguientes condiciones:
● G es conexo y no tiene ciclos (ciclo es un camino que no repite aristas y llega al
mismo vértice inicial)
● G no tiene ciclos y, si se añade alguna arista se forma un ciclo.
● G es conexo y si se le quita alguna arista deja de ser conexo.
● Dos vértices cualesquiera de G están conectados por un único camino simple.
Las condiciones anteriores son todas equivalentes, es decir, si se cumple una las
demás se cumplirán.
Si un árbol G tiene un número finito de vértices, n, entonces tiene n − 1 aristas.
En resumen:
7
Un árbol es un grafo en el que cualesquiera dos vértices están conectados por
exactamente un camino.
F. Árboles en resolución de problemas
Mediante los árboles de búsqueda se puede representar todo el espacio de estados
para resolver un problema y así todos los caminos posibles desde la raíz hasta las hojas
representan una posible solución o un fracaso. Está claro que la forma de hallar las
soluciones sería realizando una búsqueda que recorra el árbol.
8
Capitulo II. Búsqueda por Profundidad y Búsqueda por amplitud
A. Búsqueda por profundidad:
Una búsqueda por profundidad es un algoritmo que permite recorrer todos los
nodos de un grafo o árbol de manera ordenada, pero no uniforme. Su funcionamiento
consiste en ir expandiendo todos y cada uno de los nodos que va localizado, de forma
recurrente, en un camino concreto. Cuando ya no quedan más nodos que visitar en dicho
camino, regresa (Backtracking), de modo que repite el mismo proceso con cada uno de
los hermanos del nodo ya procesado.
B. Búsqueda por amplitud:
Una búsqueda por amplitud o anchura es un algoritmo para recorrer o
buscar elementos en un grafo. Intuitivamente, se comienza en la raíz (eligiendo algún
nodo como elemento raíz en el caso de un grafo) y se exploran todos los vecinos de este
nodo. A continuación para cada uno de los vecinos se exploran sus respectivos vecinos
adyacentes, y así hasta que se recorra todo el árbol.Formalmente es un algoritmo de
búsqueda sin información, que se expande y examina todos los nodos de un árbol
sistemáticamente para buscar una solucion. El algoritmo no usa estrategia heurística.
Si las aristas tienen pesos negativos aplicaremos el algoritmo de Bellman-Ford en
alguna de sus dos versiones.
9
10
Capitulo III. Descripción y Solución del Problema
A. Enunciado del problema
“Tenemos dos jarras, una de 4 litros de capacidad y otra de 3 litros.
Ninguna de ellas tiene marcas que permitan identificar cuánta agua hay en ellas.
Existe un grifo que permite llenar las jarras de agua; es posible vaciar el
contenido de las jarras; verter el contenido de una en otra. El problema consiste
en encontrar una secuencia de movimientos que consiga dejar exactamente 2
litros de agua en la jarra de 4 litros de capacidad.”
En este enunciado nos presenta las siguientes propiedades, operaciones y
estados que se pueden realizar en las jarras:
● Propiedades:
○ Se refiere al maximo y minimo de cantidades que puede
poseer una jarra, hay que entender que como mínimo la
cantidad será 0 para ambas jarras y como máximo
dependerá de la jarra
● Estados
○ Es la cantidad de litros que posea jarra en un momento
dado
● Operaciones:
○ Llenado
○ Vaciado
○ Vertido
A su vez se ha decidido añadir algunas restricciones en cuanto a las
operaciones, con el fin de evitar caer en bucles o no recorrer nodos innecesarios,
entre las restricciones planteadas tenemos:
● No se puede verter a una jarra que esté llena
● No se puede vaciar una jarra vacía
● No se puede llenar una jarra llena
● Solo se llenan jarras vacías
11
B. Descripción
Para la solución se usa el árbol búsqueda de Prolog, donde tenemos 6
nodos hijos (de los cuales solo algunos se cumplirán dependiendo del caso).
1. Algoritmo Principal
2. Algoritmo busca
12
3. Algoritmo aplica
13
4. Algoritmo llenar
14
5. Algoritmo vaciar
15
6. Algoritmo verter
16
7. Algoritmo vertido
17
C. Código solución
Una solución propuesta se ve en el Apéndice A, propuesta para jarras de
tres y cinco litros, y la jarra más grande debe llenarse con cuatro litros, usando
cierto número de litros de agua, que sirve como delimitador y evita que se caiga
en un bucle infinito, pues el vaciado de una jarra no se retorna a los litros de agua
disponible.
Se ha decidido realizar ciertas modificaciones al algoritmo (Apéndice B),
con el fin de generalizar la solución modificando la menor cantidad de lineas de
codigo, para eso se añaden tres hechos que son:
● maxJarraGrande
● maxJarraPequena
● litrosObjetivo
Se añaden estos hechos para que solo modificando estos se logre cambiar
completamente el funcionamiento del algoritmo a diferencia del primero que es
necesario cambiar más de tres lineas de codigo para conseguir el objetivo
planteado, es decir (jarras de tres y cuatro litros y como objetivo llenar dos litros
en la más grande)
18
Conclusiones
Se realizó un programa en prolog para solucionar el problema de las jarras bajo el concepto de árboles de
búsqueda por profundidad.
Se buscó la forma de construir el algoritmo para el programa de la manera más eficiente de tal forma que
no recorra caminos innecesario o repita algunos ya descartados
Construimos el árbol de manera gráfica para poder demostrar y comprobar el recorrido que tendrá el arbol
en el programa.
19
Referencias Bibliográficas
● Wikipedia, Árbol (informática), recuperado el 29/06/2014
http://es.wikipedia.org/wiki/%C3%81rbol_(inform%C3%A1tica)
● Nabor Chirinos, Teoría de grafos, recuperado el 29/06/2014
http://www.slideshare.net/naborchirinos/conceptos-teoria-de-grafos-5778778
● Wikipedia, Teoría de grafos, recuperado el 29/06/2014
http://es.wikipedia.org/wiki/Teor%C3%ADa_de_grafos
● Wikipedia, Árbol (teoría de grafos), recuperado el 29/06/2014
http://es.wikipedia.org/wiki/%C3%81rbol_(teor%C3%ADa_de_grafos)
● Yarox, Resolución del problema de las jarras en Prolog, recuperado el 29/06/2014
https://gist.github.com/yarox/2829983
20
Anexos
Apéndice A. Código en Prolog para el Problema de Jarras de 3 y 5 unidades
Descripción: La solución usada es para jarras de 3 y 5 litros, además de usar un
limitante (agua disponible)
21
22
23
Apéndice B. Algoritmo Solución para el problema de las Jarras Propuesto
24