misioneros y canibales
TRANSCRIPT
TEMA:
Caníbales y Misioneros
TRUJILLO – PERU
2014
Presentación
En el presente informe trataremos de explicar el procedimiento de
desarrollo del problema de los tres misioneros y tres caníbales, el cual
consiste en pasar los tres misioneros y tres caníbales de un extremo a
otro a través de una canoa que tiene como capacidad máxima dos
personas. Hallar la manera de cruzarlos a todos sanos y salvos, talque
no puede exceder el numero de caníbales al de misioneros sino estos se
los comerán y la canoa no se devuelve sola. Aquí aplicaremos la
búsqueda por porfundidad.
Importancia
Los sistemas basados en Conocimiento representan un paso delante de
los sistemas de información convencionales al pretender representar
funciones cognitivas del ser humano como el aprendizaje y el
razonamiento. Esta clase de aplicaciones descansan en las
contribuciones de la Inteligencia Artificial en lo general y en la Ingeniería
del Conocimiento en lo particular. Su orientación es la automatización
del análisis de problemas, la búsqueda de soluciones, la toma de
decisiones y el empleo de conocimiento especializado en un campo
específico de aplicación.
Problema de los Misioneros y Caníbales Tres misioneros y tres caníbales quieren cruzar un rio. Solo hay una canoa que puede ser
usada por una o dos personas, ya sean misioneros o caníbales. En ningún momento el
numero de caníbales debe superar al de misioneros, en ninguna de las dos orillas (estén
en la barca o fuera de ella), porque se los comerán.
El problema consiste en encontrar una secuencia de movimientos posibles para
que los seis pasen de una orilla a la otra.
Existe mas de una solución a este problema. El mínimo numero de movimientos es
de once.
Solución:Existe mas de una solución a este problema. La que te mostramos es una de ellas, con once movimientos
totales, el minino que se puede conseguir, pero se puede llegar a la misma solución con pequeñas
variaciones de los mismos.
Para empezar la única combinación que no puedo hacer es irme con 2 misioneros, que pase con 2 caníbales
o 1 caníbal y 1 misionero es indiferente; pero en este ultimo caso tienes que volver con el misionero.
1. Primero llevo 2 caníbales en la canoa y dejo uno del lado (izquierdo), regresando con un caníbal en la
canoa.
2. Vuelvo a llevar dos caníbales en la canoa y dejo al segundo caníbal del lado (izquierdo)
quedándome dos y regreso con uno en la canoa.
3. Dejo un caníbal del lado (Derecho) y llevo dos misioneros en la canoa, dejando solo un
misionero del lado (Izquierdo) y regresando en la canoa con un misionero y un caníbal.
4. Dejo dos caníbales del lado (Derecho) y regreso al lado (Izquierdo) con dos misioneros en
la canoa dejando tres misioneros del lado (Izquierdo) y regresando la canoa con un
caníbal al lado (Derecho).
5. Llevo dos caníbales en la canoa del al lado (Izquierdo) y dejo uno para volver por el
ultimo caníbal del lado (Derecho) y por ultimo vuelvo llevar dos caníbales en la canoa y
bajan los dos quedando así del lado (Izquierdo) 3 caníbales y 3 misioneros.
Algoritmo para el CasoDefinimos los posibles estados
Se podría indicar la posición de la barca, junto con el número de misioneros y caníbales que
hay en cada lado.
Se podría pensar que, dado que el número de personas en el extremo final puede calcularse
a partir de los que hay en el inicial, basta con indicar la posición de la barca y los misioneros
y caníbales que quedan en el extremo inicial. Sin embargo, la primera aproximación permite
describir más fácilmente las precondiciones y efectos de los operadores, por lo que
mantenemos la representación inicial. Además, el espacio de estados tiene el mismo tamaño
e idéntica semántica con ambas representaciones.
Formalmente, por tanto, un estado es una terna(M i, Ci, B, Mf, Cf) en la que:
B ϵ [i, f] indica la posición de la barca, por lo que toma el valor i si está en el extremo inicial
o f si está en el final.
Mi, Ci, B, Mf, Cf ϵ [0,…,3] indican el número de misioneros y caníbales que quedan en el
extremo inicial y final del río, respectivamente.
De esta manera el estado inicial se representa como (3,3,i,0,0) y el final como (0,0,f,3,3).
Definimos los operadores
El conjunto de operadores es el mostrado en la Tabla 1. Se dispone de 5 operadores.
Cada uno de ellos consiste en trasportar personas de la orilla x hasta la orilla y;
Mover2M(x,y) transporta 2 misioneros desde x hasta y; y así sucesivamente. Las
precondiciones de cada operador se dividen en tres grupos de requisitos. El primer grupo
(primera columna de precondiciones) hace referencia a que para transportar a una
persona desde x, esa persona debe estar en x. Así, el operador Mover1M1C(x,y) requiere
que en x haya al menos un caníbal y un misionero. El segundo grupo de
condiciones(segunda columna) hace referencia a la posición de la barca: para todos los
operadores, la barca debe estar en la posición de origen.
El tercer grupo de condiciones evita que los caníbales se coman a los misioneros,
evitando hacer movimientos que dejen a más caníbales que misioneros en cualquier
orilla.
TABLA 1: Operadores del problema de los caníbales y misioneros
Definimos la Heurística
En este caso, vamos a obtener las heurísticas por relajación del problema original. Para
dicha relajación, partimos de las precondiciones expuestas en la Tabla 1. Estas
precondiciones se pueden relajar fácilmente teniendo en cuenta los tres tipos de
precondiciones definidas anteriormente:
1. Eliminar primer grupo de precondiciones. Si eliminamos ese primer grupo de
condiciones, se obtiene un problema relajado que no parece ser mucho más fácil de
resolver que el problema original, por lo que no tiene mucho sentido.
2. Eliminar segundo grupo de precondiciones. Al eliminar el segundo grupo de
condiciones, el problema resultante es más fácil que el original, puesto que se puede
asumir que hay infinitas barcas tanto en un lado como en otro.
Este problema tiene una solución muy sencilla que es asumir que siempre viajan un
caníbal y un misionero juntos, con el operador Mover1M1C(i,f). Por tanto, la heurística
resultante de este problema relajado es:
h1(n) = (Ci + Mi)/2 ………………………(1)
Asumiendo que en el estado n se cumplen los requisitos definidos por el grupo de
precondiciones 3.
3. Al eliminar el tercer grupo de condiciones, obtenemos un problema relajado en el que
los caníbales nunca se comen a los misioneros. Entonces, en cada viaje de ida y vuelta,
podemos transportar a una persona (dado que la otra tendrá que volver para llevar la
barca). Por lo tanto la heurística resultante es:
h2(n) = 2 x (Ci + Mi) –orilla(n) ………………………(2)
Donde orilla(n) = 1 si en el estado n la barca está en la orilla i (B = i), y orilla(n) = 0 si la
barca está en la orilla final( B = f).
Una cuarta posibilidad sería eliminar el grupo de condiciones 2 y 3 a la vez. Sin
embargo, como hemos visto anteriormente, este problema es equivalente a eliminar sólo
el grupo de condiciones 2.
Las dos heurísticas son admisibles, puesto que son resultado de relajar el problema
original. Para decidir que heurística elegir, h2 o h3, estudiamos cuál es la más
informada, puesto que será la que, siendo admisible, tendrá un valor más cercano a h*.
Se observa fácilmente que la más informada es h2, puesto que h2(n) ≥ h3(n), sea cual
sea el valor de Ci y Ci para el estado n. Por tanto elegimos h2(n).
Código en Prolog%% estados posibles
estado(e0, [] , [b,m,m,m,c,c,c]).
estado(e1, [c] , [b,m,m,m,c,c]).
estado(e2, [m,c] , [b,m,m,c,c]).
estado(e3, [c,c] , [b,m,m,m,c]).
estado(e4, [m,m,m] , [b,c,c,c]).
estado(e5, [c,c,c] , [b,m,m,m]).
estado(e6, [m,m,c,c] , [b,m,c]).
estado(e7, [m,m,m,c] , [b,c,c]).
estado(e8, [m,m,m,c,c] , [b,c]).
estado(e9, [b,c] , [m,m,m,c,c]).
estado(e10, [b,m,c] , [m,m,c,c]).
estado(e11, [b,c,c] , [m,m,m,c]).
estado(e12, [b,m,m,m] , [c,c,c]).
estado(e13, [b,c,c,c] , [m,m,m]).
estado(e14, [b,m,m,c,c] , [m,c]).
estado(e15, [b,m,m,m,c] , [c,c]).
estado(e16, [b,m,m,m,c,c] , [c]).
estado(e17, [b,m,m,m,c,c,c], []).
%% movimientos posibles
movim(m1, [m,m]).
movim(m2, [m]).
movim(m3, [m,c]).
movim(m4, [c,c]).
movim(m5, [c]).
%% hacer un movimiento de un estado a otro
mover(e0,m3,e10).
mover(e0,m4,e11).
mover(e0,m5,e9).
mover(e1,m2,e10).
mover(e1,m4,e13).
mover(e1,m5,e11).
mover(e2,m1,e15).
mover(e2,m3,e14).
mover(e3,m1,e14).
mover(e3,m5,e13).
mover(e4,m4,e16).
mover(e4,m5,e15).
%% no hay movimientos posibles desde el estado e5
mover(e6,m2,e16).
mover(e6,m3,e17).
mover(e7,m4,e17).
mover(e7,m5,e16).
mover(e8,m5,e17).
mover(e9,m5,e0).
mover(e10,m2,e1).
mover(e10,m3,e0).
mover(e11,m4,e0).
mover(e11,m5,e1).
%% no hay movimientos posibles desde el estado e12
mover(e13,m4,e1).
mover(e13,m5,e3).
mover(e14,m1,e3).
mover(e14,m3,e2).
mover(e15,m1,e2).
mover(e15,m5,e4).
mover(e16,m2,e6).
mover(e16,m4,e4).
mover(e16,m5,e7).
mover(e17,m3,e6).
mover(e17,m4,e7).
mover(e17,m5,e8).
%% estados inicial y final
ini(e0).
final(e17).
%% programa principal (búsqueda en profundidad)
solucion(S) :- ini(E),
prolongable([], [E], LM, LE),
reverse(LM, S),
nl,nl, imprimir(S).
prolongable(LM, [E|RE], LM, [E|RE]) :- final(E).
prolongable(LM, [E|RE], LMP, LEP)
:- mover(E, M, NE),
not(member(NE, [E|RE])),
prolongable([M|LM], [NE,E|RE], LMP, LEP).
imprimir([]) :- nl.
imprimir([M|Resto]) :- escribe(M), nl, imprimir(Resto).
escribe(m1):- write( 'Cruzan 2 misioneros').
escribe(m2):- write( 'Cruza 1 misionero').
escribe(m3):- write( 'Cruza 1 misionero y 1 caníbal').
escribe(m4):- write( 'Cruzan 2 caníbales').
escribe(m5):- write( 'Cruza 1 caníbal').
%% pregunta: solucion(X).
Referencias Bibliográficas
http://echandola.com/juegos/cruza-canibales-y-misioneros/
http://www.psicoactiva.com/inteli/solcanib.htm
http://www.psicoactiva.com/inteli/solcanib.htm
http://cibercompu10.blogspot.com/2009/02/algoritmo-acerca-de-
canibales-y.html
http://misarticulosm.fullblog.com.ar/misioneros-y-canibales.html