El problema de las jarras de agua tema 6 prolog

24
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

Transcript of El problema de las jarras de agua tema 6 prolog

Page 1: El problema de las jarras de agua  tema 6 prolog

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

Page 2: El problema de las jarras de agua  tema 6 prolog

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

Page 3: El problema de las jarras de agua  tema 6 prolog

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.

Page 4: El problema de las jarras de agua  tema 6 prolog

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.

Page 5: El problema de las jarras de agua  tema 6 prolog

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.

Page 6: El problema de las jarras de agua  tema 6 prolog

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:

Page 7: El problema de las jarras de agua  tema 6 prolog

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.

Page 8: El problema de las jarras de agua  tema 6 prolog

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.

Page 9: El problema de las jarras de agua  tema 6 prolog

9

Page 10: El problema de las jarras de agua  tema 6 prolog

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

Page 11: El problema de las jarras de agua  tema 6 prolog

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

Page 12: El problema de las jarras de agua  tema 6 prolog

12

3. Algoritmo aplica

Page 13: El problema de las jarras de agua  tema 6 prolog

13

4. Algoritmo llenar

Page 14: El problema de las jarras de agua  tema 6 prolog

14

5. Algoritmo vaciar

Page 15: El problema de las jarras de agua  tema 6 prolog

15

6. Algoritmo verter

Page 16: El problema de las jarras de agua  tema 6 prolog

16

7. Algoritmo vertido

Page 17: El problema de las jarras de agua  tema 6 prolog

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)

Page 18: El problema de las jarras de agua  tema 6 prolog

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.

Page 19: El problema de las jarras de agua  tema 6 prolog

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

Page 20: El problema de las jarras de agua  tema 6 prolog

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)

Page 21: El problema de las jarras de agua  tema 6 prolog

21

Page 22: El problema de las jarras de agua  tema 6 prolog

22

Page 23: El problema de las jarras de agua  tema 6 prolog

23

Apéndice B. Algoritmo Solución para el problema de las Jarras Propuesto

Page 24: El problema de las jarras de agua  tema 6 prolog

24