Es un problema que ayuda a desarrollar la destreza intelectual del usuario.
Al resolver este problema, no solo implica obtener el resultado, sino comprender la importancia de usar La
Teoría de Grafos y el algoritmo de Recorrido en Profundidad y Anchura en la solución de los problemas lógicos y algoritmos actuales, ya que nos permite hacerlo de forma ordenada y se pueden usar técnicas como el Backtracking.
Planteamiento del Problema:
- Se tienen dos jarras, una de 4 litros de capacidad y otra de 3.
- Ninguna de ellas tiene marcas de medición.
- Se tiene una bomba que permite llenar las jarras de agua.
- Averiguar cómo se puede lograr tener exactamente 2 litros de agua en la jarra de 4 litros de capacidad.
- Enfocar este ejercicio en un área de trabajo como la agricultura, para ver su importancia y aplicación.
Análisis del problema:
Problema como el anterior es resuelto con un simple algoritmo de búsqueda; pero lo que hay que tener claro primero es cuáles son los elementos del diseño del algoritmo.
En este caso son 4 los elementos:
- Estado inicial
- Estado final
- Acciones
- Función de costo
Solución Teórica:
- Llenar la jarra de 4 litros completamente (para ello, la jarra de 4 litros no debe estar completamente llena).
- Llenar la jarra de 3 litros completamente (para ello, la jarra de 3 litros no debe estar completamente llena).
- Vaciar la jarra de 4 litros (para ello, la jarra debe contener algo de líquido).
- Vaciar la jarra de 3 litros (para ello, la jarra debe contener algo de líquido).
- Verter el contenido de la jarra de 4 litros en la jarra de 3 litros (para ello, la jarra de 4 litros debe contener algo de líquido y la de 3 litros no estar completamente llena).
- Verter el contenido de la jarra de 3 litros en la jarra de 4 litros (para ello, la jarra de 3 litros debe contener algo de líquido y la de 4 litros no estar completamente llena).
Implementación:
%llenar A
accion(e(X,Y),e(4,Y)):- X < 4.
%llenar B
accion(e(X,Y),e(X,3)):- Y < 3.
%vaciar A
accion(e(X,Y),e(0,Y)):- X > 0.
%vaciar B
accion(e(X,Y),e(X,0)):- Y > 0.
%vertir A en B : jarra A se queda vacia
accion(e(X,Y),e(0,Z)):- X > 0,
Y < 3,
Z is X + Y,
Z =< 3.
%vertir A en B : jarra B se queda llena
accion(e(X,Y),e(Z,3)):- X > 0,
Y < 3,
Z is X+Y-3,
Z =< 4.
%vertir B en A : jarra B se queda vacia
accion(e(X,Y),e(Z,0)):- Y > 0,
X < 4,
Z is X + Y,
Z =< 4.
%vertir B en A : jarra A se queda llena
accion(e(X,Y),e(4,Z)):- Y > 0,
X < 3,
Z is X+Y-4,
Z =< 3.
menu:-siguiente(e(4,0),[e(4,0)],R),
procesa(R).
procesa([]):- !.
procesa(H|C):- procesa(C),
writeln(H).
pertenece(E,[E|_]):- !.
pertenece(E,[_|C]):- pertenece(E,C).
siguiente(e(2,_),V,V):- !.
siguiente(e(_,2),V,V):- !.
siguiente(e(X,Y),V,R):- accion(e(X,Y), e(Xs,Ys)),
%format('estado(~W,~W)',[Xs,Ys]),
not(pertenece(e(Xs,Ys), V)),
siguiente(e(Xs,Ys), [e(Xs,Ys)|V],R).


0 comentarios: