Você está na 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_izq1||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_izq1<=mis_izq||mis_izq==0) && (can_der+1<=mis_der||mis_der==0)))||((lado_act==1 && can_der-1>=0)&&((can_izq+1<=mis_izq||mis_izq==0) && (can_der1<=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_izq2<=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_der2<=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_izq2||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)))))

Inteligencia Artificial

hijo=2; ruta_sol=str2double([int2str(hijo),int2str(padre)]); 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_der1>=0 && ((can_izq+1<=mis_izq+1||mis_izq+1==0) && (can_der-1<=mis_der-1||mis_der1==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

Você também pode gostar