Está en la página 1de 7

UNIVERSIDAD VERACRUZANA

DEPARTAMENTO DE INTELIGENCIA ARTIFICIAL

Solucin al problema de los


canbales y misioneros por
bsqueda en profundidad en Matlab
INTELIGENCIA ARTIFICIAL II
Tarea 2
PRESENTA:

LUIS LORENZO RASCON PEREZ

Fecha de entrega:

18 de Enero del 2012

Fecha de requerimiento:

11 de Enero del 2012

Abstract: El juego de los misioneros y los canbales


es uno de los juegos y problemas clsicos. El algoritmo implementado
en este trabajo permite hallar una solucin en base a una bsqueda
en profundidad sobre el rbol del espacio de soluciones.

Inteligencia Artificial

Technical Discussion:
El juego consiste en pasar a travs de una lancha a todos los misioneros(3) y a todos los
canbales(3) al otro lado del rio usando una lancha.
Las reglas del juego son las siguientes:
-La lancha solo puede llevar 2 personas
-La lancha no puede pasar al otro lado sola
-No debe haber ms canbales de que misioneros en ninguno de los 2 lados porque sino se
comern al misionero que este en desventaja.
El algoritmo se dise en base a un rbol que representa el estado de soluciones, donde
cada nodo es un estado de solucin valido de 5 posibles estados (nodos hijo). Para hacer el
recorrido del rbol se crea una pila (una matriz) que ir acumulando los vectores (nodos) hijo
del nodo actual (el cual al inicio del programa ser el estado inicial con 3 canbales y 3
misioneros en el lado izquierdo o derecho).
En el algoritmo para evitar el ciclo interminable debe restringirse a no repetir una vez tras otra
el mismo movimiento, as usando una variable que calcula el ltimo movimiento realizado
para el nodo actual.

Inteligencia Artificial

Discussion of results:
El diseo y desarrollo de este algoritmo en Matlab me ha permitido ver que es bastante
intuitiva y rpida la forma de desarrollar pequeos prototipos con ayuda del REPL y ver sus
resultados con la capacidad de graficarlos.
Una cosa en la que hay que poner mucha atencin para hacer un programa que sepa jugar
con los misioneros y canbales es la correlacin de las variables de los canbales y
misioneros en ambos lados y cmo aunque no est escrito en las reglas nosotros razonamos
de manera intuitiva que si en un estado hay ms canbales que misioneros, siempre y
cuando los ltimos sean 0, este es un estado valido.
En este algoritmo decid expandir todos los hijos del nodo actual (el que fuere en su
momento) para despus meterlos en orden a la pila y ya seguir con el funcionamiento normal
de la pila (First in, Lasto out). Esto debido a que la proyeccin que quera dar del recorrido
sobre el rbol fuera a profundidad de izquierda a derecha (Imagen 1 y 2).
El recorrido sobre el rbol se acumul en cada nodo como una propiedad ms de este
quedando en el extremo izquierdo el movimiento realizado anteriormente y hacia la derecha
los padres hasta llegar al extremo derecho con el nodo inicial (Imagen 3). Tambin se
muestra al final la solucin en pasos descriptivos en espaol (Imagen 3).

Imagen 1

Inteligencia Artificial

Imagen 2

Imagen 3

Inteligencia Artificial

Appendix
A continuacin se despliega el cdigo fuente del programa en Matlab:
display 'Problema de los misioneros y los canibales. El estado inicial E0 indica 3
canibales y 3 misioneros del lado izquierdo'
%La pila se inicializa con el estado inicial E0
%
[Ci,Mi,Cd,Md,lado,rutaSolucion]
E0=[3,3,0,0,0,0]
Esol=[0,0,3,3,1]
Pila=E0
solucion=0;
while(solucion==0)
%Codigo dentro del bucle
%Generador de posibles Movimientos (Nodos hijo a partir de E0)
can_izq=E0(1,1);
mis_izq=E0(1,2);
can_der=E0(1,3);
mis_der=E0(1,4);
lado_act=E0(1,5);
digitos=str2double(regexp(int2str(E0(:,6)),'\d','match'));
padre=E0(1,6);
LastMove=digitos(1,1);
if(E0(1:5) == Esol)
solucion=1;
display 'Una solucin al problema de los misioneros y los canibales es la
siguiente:'
digitos
for i=length(digitos):-1:1
switch(digitos(:,i))
case 0
display '0.-Estado Inicial.'
case 1
display '1.-Mover 1 canibal y 1 misionero.'
case 2
display '2.-Mover 2 misioneros.'
case 3
display '3.-Mover 2 canibales.'
case 4
display '4.-Mover 1 canibal.'
case 5
display '5.-Mover 1 misionero.'
end
end

else
%1.-si el estado solucin aun no ha sido alcanzado entonces se expande el
%nodo llenando la pila con los nodos hijos que son estados validos.
%Siempre existen 5 posibles estados hijos para un nodo, pero no todos son
%estados de solucin validos.
%2.-Ya que los valores del nodo actual han sido calculados antes de este
%paso, lo sacamos de la pila y establecemos la variable solucion a 0.

Inteligencia Artificial

%3.-Se llena la pila con los hijos del estado actual(solo estados validos)
%4.-Se toma el nodo en el top de la pila y se procesa de la misma manera
solucion=0;
Pila=Pila(2:length(Pila(:,1)),:)
%pasando 0 canibales y 1 misioneros
if(LastMove~=5 && (((lado_act==0 && mis_izq-1>=0)&&((can_izq<=mis_izq-1||
mis_izq-1==0) && (can_der<=mis_der+1||mis_der+1==0)))||((lado_act==1 && mis_der1>=0)&&((can_izq<=mis_izq+1||mis_izq+1==0) && (can_der<=mis_der-1||mis_der1==0)))))
hijo=5;
ruta_sol=str2double([int2str(hijo),int2str(padre)]);
if(lado_act==0)
E1= [can_izq, mis_izq-1 , can_der, mis_der+1,1,ruta_sol]
else
E1= [can_izq, mis_izq+1 , can_der, mis_der-1,0,ruta_sol]
end
Pila=[E1;Pila]
end
%pasando 1 canibal y 0 misioneros
if(LastMove~=4 &&(((lado_act==0 && can_izq-1>=0)&&((can_izq-1<=mis_izq||
mis_izq==0) && (can_der+1<=mis_der||mis_der==0)))||((lado_act==1 && can_der1>=0)&&((can_izq+1<=mis_izq||mis_izq==0) && (can_der-1<=mis_der||mis_der==0)))))
hijo=4;
ruta_sol=str2double([int2str(hijo),int2str(padre)]);
if(lado_act==0)
E1= [can_izq-1, mis_izq , can_der+1, mis_der,1,ruta_sol]
else
E1= [can_izq+1, mis_izq , can_der-1, mis_der,0,ruta_sol]
end
Pila=[E1;Pila]
end
%pasando 2 canibales en la lancha
if(LastMove~=3 &&(((lado_act==0 && can_izq-2>=0)&& ((can_izq-2<=mis_izq||
mis_izq==0) && (can_der+2<=mis_der||mis_der==0)))||((lado_act==1 && can_der-2>=0)&&
((can_izq+2<=mis_izq||mis_izq==0) && (can_der-2<=mis_der||mis_der==0)))))
hijo=3;
ruta_sol=str2double([int2str(hijo),int2str(padre)]);
if(lado_act==0)
E1= [can_izq-2, mis_izq , can_der+2, mis_der,1,ruta_sol]
else
E1= [can_izq+2, mis_izq , can_der-2, mis_der,0,ruta_sol]
end
Pila=[E1;Pila]
end
%pasando 2 misioneros en la lancha
if(LastMove~=2 &&(((lado_act==0 && mis_izq-2>=0)&& ((can_izq<=mis_izq-2||
mis_izq-2==0) && (can_der<=mis_der+2||mis_der+2==0)))||((lado_act==1 && mis_der2>=0)&& ((can_izq<=mis_izq+2||mis_izq+2==0) && (can_der<=mis_der-2||mis_der2==0)))))
hijo=2;
ruta_sol=str2double([int2str(hijo),int2str(padre)]);

Inteligencia Artificial

if(lado_act==0)
E1= [can_izq, mis_izq-2 , can_der, mis_der+2,1,ruta_sol]
else
E1= [can_izq, mis_izq+2 , can_der, mis_der-2,0,ruta_sol]
end
Pila=[E1;Pila]
end
%pasando 1 canibal y 1 misionero en la lancha
if(LastMove~=1 &&(((lado_act==0 && can_izq-1>=0 && mis_izq-1>=0)&& ((can_izq1<=mis_izq-1||mis_izq-1==0) && (can_der+1<=mis_der+1||mis_der+1==0)))||
((lado_act==1 && can_der-1>=0 && mis_der-1>=0 && ((can_izq+1<=mis_izq+1||
mis_izq+1==0) && (can_der-1<=mis_der-1||mis_der-1==0))))))
hijo=1;
ruta_sol=str2double([int2str(hijo),int2str(padre)]);
if(lado_act==0)
E1= [can_izq-1, mis_izq-1 , can_der+1, mis_der+1,1,ruta_sol]
else
E1= [can_izq+1, mis_izq+1 , can_der-1, mis_der-1,0,ruta_sol]
end
Pila=[E1;Pila]
end
E0=Pila(1,:)
solucion;

end
end

Inteligencia Artificial

También podría gustarte