You signed in with another tab or window.Reload to refresh your session.You signed out in another tab or window.Reload to refresh your session.You switched accounts on another tab or window.Reload to refresh your session.Dismiss alert
El métodothink comienza con Belkan parado. Se comprueba qué se hizo en la ejecuciónanterior y se actualizan los sensores, después se decide cuál será la siguiente acción.En el constructor, al empezar, se ponemapaResultado con todas las celdas a ’T’,suponiendo que todo es tierra.
Actualización
Si avanzó, se actualizan fila o columna. Si giró, se actualiza hacia dónde y se decida hacia dónde se girará la próxima vez deforma aleatoria. Y si hizo alguna acción relacionada con deshacerse de objetos, se actualizarán lasvariables auxiliares que controlan la mochila y el objeto activo.
Decisión
A continuación, después de actualizar la situación de Belkan, se pasa a decidir lasiguiente acción. Primero se comprueba que la variable de giro aleatorio no haya llegado a cero, si se da elcaso de que no se haya chocado con nada ni nadie y la variable haya llegado a cero,Belkan girará. En el caso en el que vaya avanzando justo al lado de un precipicio, siempregirará hacia el lado correcto, ahorrando así algo de vida. A continuación, si lo que tiene delante es terreno o superficie, Belkan avanzará. Si no,comprobará si tiene que girar o si tiene que usar un objeto.
Objetos
Si se encuentra de frente con un lobo y tiene un hueso como objeto activo, se le dará aeste. En el resto de casos de uso de los objetos, se comprueba si se tiene activo el objeto, si noes así, Belkan busca en la mochila y si está empezará a tirar objetos hasta que salga eldeseado. Cuando se encuentre con un bosque, usará las zapatillas; cuando se encuentre con agua,usará el bikini; y cuando se encuentre con una puerta, usará la llave.
Actualización del mapa
El mapa se irá guardando enmapaResultado, recibiendo la información de todos lossensores, una vez que haya pasado por una casilla de GPS. Estas casillas, si no las ha encontrado ya, serán buscadas por Belkan. Cuando una casillade GPS entra en los sensores de terreno 1, 3, 5, 7, 11 o 13 de Belkan, éste comenzará adirigirse hacia ellos para así tener el mapa guardado cuanto antes. Esta función de búsqueda también se usa para los objetos y las puertas. En el caso de losobjetos, solo los busca cuando ya ha encontrado el GPS y hay espacio en la mochila, y enel de las puertas, cuando el objeto activo sea una llave.
Funciones auxiliares
Girar
En esta función se engloba todo el código necesario para decidir hacia dónde girar y paraactualizar la variable de giro aleatorio. Cuando queden 100 puntos de vida, o menos, la variable de giro aleatorio tendrá valoresmás pequeños para girar más veces y descubrir más mapa con los últimos puntos devida.
ActionComportamientoJugador::Girar(Sensores sensores){Action accion;if(!girar_derecha){accion = actTURN_L;girar_derecha = (rand() %2 ==0);pasosGirar = (rand() %50) +1;/*Si gira, ya sea a la izquierda o a la derecha, pasosGirar tendrá quevolver a tomar un valor nuevo*/}else{accion = actTURN_R;girar_derecha = (rand() %2 ==0);pasosGirar = (rand() %50) +1;}if(sensores.vida <100){//Cuando le queden menos de 100 puntos de vida empezará a girar máspasosGirar = (rand() %10) +1;}return accion;}
guardarVisitado
Con esta función se guarda toda la información de los sensores de terreno (desde 0 hasta15) en mapaResultado.
A esta función se le pasan los sensores y el elemento que se quiere buscar. Esteelemento puede ser un punto de GPS, una puerta o un objeto. Se comprueban los sensores de terreno 1, 3, 5, 7, 11 y 13, y según en cuál se encuentreelemento a buscar se activarán unos bool u otros. En el caso del GPS, lo buscará cuando todavía no lo haya encontrado, para empezar aguardar mapa cuanto antes. Los objetos los buscará cuando tenga sitio en la mochila y ya haya encontrado el GPS,dándole así más prioridad al GPS. Y las puertas las buscará siempre que tenga una llave activa, ya que si reaparecedespués de morir dentro de una habitación cerrada por una puerta, cuando consiga lallave, podrá salir y buscar un GPS.
Cuando se encuentre con agua, bosque o una puerta delante, Belkan buscará en su mochila si tiene el objeto necesario. Si tiene el objeto necesario en sumochila, comenzará a tirar objetos hasta que se active el deseado y pueda avanzar.
Se da cuando tiene un objeto activo que puede usar para avanzar por el agua o el bosqueo abrir una puerta. Esta función únicamente comprueba que se de esa situación.
Devuelve a todas las variables a su valor inicial y vacía la mochila.
voidComportamientoJugador::reinicio(Sensores sensores){brujula =0;fil =99;col =99;pasosGirar = (rand() %50) +1;//Se le da un nuevo valorobjetoMano ='-';//Se vacían las manosbien_situado =false;girarEnIzUno = girarEnIzDos = girarEnIzTres = girarYaIz =false;girarEnDerUno = girarEnDerDos = girarEnDerTres = girarYaDer =false;girar_derecha =false;estaAbierta =false;ultimaAccion = actIDLE;for(int i =0; !mochila.empty(); i++){//Se vacía la mochilamochila.pop();}}
Variables utilizadas
fil, col y brujula: son usadas para determinar la posición y la orientación en el mapa deBelkan.
pasosGirar: variable que tomará valores aleatorios y que obligará a Belkan a girar unavez que llegue a cero.
girar_derecha, bien_situado: la primera decidirá de forma aleatoria hacia dónde girar yla segunda determina si ha encontrado o no una casilla de GPS.
girarEnIzUno, girarEnIzDos, girarEnIzTres, girarYaIz, girarEnDerUno, girarEnDerDos,girarEnDerTres, girarYaDer: son usadas por el método de búsqueda y determinan siseguir buscando o si ya ha encontrado el elemento que se estaba buscando.
estaAbierta: una vez que se abre una puerta, se pone a true, haciendo que Belkantenga que avanzar y no siga intentando usar la llave. Una vez que se ha cruzado lapuerta, ésta se cierra y se vuelve a poner a false esta variable.
objetoMano: determina cuál es el objeto que se encuentra activo en cada momento,teniendo ‘_’ cuando no hay ninguno.
mochila: determina qué objetos hay guardados en la mochila.
ultimaAccion: determina cuál fue la última acción realizada por Belkan para poderactualizar la situación de éste.
Los extraños mundos de Belkan II
Para empezar, comenzaré con la explicación de los cambios realizados a la parte que seentregó en la práctica anterior. Más adelante pasaré a explicar elmétodo deliberativo, su algoritmo y los métodos auxiliares asociados a él.
Cambios introducidos
Lo más importante en esta parte (que se centra especialmente en el método think) es todala parte relacionada con la ejecución de los planes. Lo primero que hace con los planes, si nos guiamos por el orden en el que está escrito, esque si hay un obstáculo (un objeto, un aldeano o un lobo) modifique el plan en lonecesario para adaptarse a la situación. Lo siguiente que se hace con los planes esgenerarlos, éstos son generados tanto para buscar reyes como para buscar regalos. Labúsqueda de regalos solo se hará si no tiene ningún regalo, no está ejecutando ningúnplan y, por supuesto, si tiene algún conocimiento de su entorno. La de reyes se hace deuna forma similar, solo la hará cuando tenga regalos, no esté ejecutando ningún plan,tenga conocimiento del entorno y que entre ese conocimiento esté la posición de un rey.Lo último relacionado con los planes de este método es la ejecución. A parte de los planes, el otro cambio en el método think ha sido que ya no busca objetosni puertas, solo puntos de GPS. En reiniciar también ha habido un cambio significativo, a parte de la reinicialización de lasnuevas variables introducidas. En esta práctica, cuando se entre en reiniciar por últimavez comprueba el mapa y si hay un elemento que predomine en más de un 75%, pintaráel resto del mapa que no haya sido descubierto a ese mismo color. ######Finalmente, el último cambio viene en el método Buscar, que ahora hace uso de losplanes y ha extendido su capacidad a todos los sensores de Belkan
pathFinding
Para el método pathFinding se ha utilizado el algoritmo de búsqueda con información A*.Este algoritmo se basa en consultar el coste que presenta viajar desde un nodo hasta eldestino. El coste se basa en una heurística que cuenta las casillas que hay que andarpara llegar a destino. Primero guardamos el nodo con menor coste en cerrados (la lista con la solución) y loborramos de abiertos (la lista de nodos posibles). A continuación asignamos el coste a losnodos vecinos y comprobamos si son candidatos para entrar en abiertos, esto sucedecuando no están en ninguna de las dos listas y a la vez son transitables. A la vez, se va generando una lista de acciones que terminará siendo el plan que seguiráBelkan para llegar a su destino por el camino más óptimo posible.
boolComportamientoJugador::pathFinding(const estado &origen,const estado &destino, list<Action> &plan){list< Nodo > abiertosLista, cerrados;priority_queue< Nodo, vector<Nodo>, functorNodo> abiertos;list< Nodo > vecinos;//izquierda, delante y derechalist< Action > chachiGuay;Nodo insercion;Nodo current;Nodo original, target;estado moverDer, moverDel, moverIzq;char queHay[3];//0 -> izquierda; 1 -> delante; 2 -> derechaint costeG, costeH;//Borro la listaplan.clear();//Insertar nodo incial en abiertosoriginal.setEstado(origen);original.setCosteF(0);original.setCosteG(0);original.setCosteH(0);abiertos.push(original);abiertosLista.push_back(original);//Crear un nodo para el destinotarget.setEstado(destino);//Comienza el algoritmo A*while(!abiertos.empty()){current.setEstado(abiertos.top().getEstado());current.setCosteF(abiertos.top().getCosteF());current.setCosteH(abiertos.top().getCosteH());current.setCosteG(abiertos.top().getCosteG());list<Action> caminoNuevoCerrado = abiertos.top().getCamino();abiertosLista.erase(find(abiertosLista.begin(), abiertosLista.end(), abiertos.top()));abiertos.pop();//Guardamos su camino en la lista chachiGuayfor(int i =0; !caminoNuevoCerrado.empty(); i++){chachiGuay.push_back(caminoNuevoCerrado.front());caminoNuevoCerrado.pop_front();}//Guardamos current en cerrados y lo borramos de abiertoscerrados.push_back(current);if(current.getFila() == destino.fila && current.getColumna() == destino.columna){/*Como en el bucle las acciones se hacen para colocarse encima de lacasilla de destino, después de darle la vuelta al plan, le borramosla última acción, que siempre será actFORWARD (aunque esto no tienenada que ver)*/plan = chachiGuay;if(!plan.empty()){plan.pop_back();}returntrue;//Si hemos llegado a destino, salimos del bucle, es decir, hay un camino}//Comprueba qué hay en cada nodo visitable para asignarle el coste más adelanteswitch(current.getBrujula()){case0:...case1:...case2:...case3:...}//Asigno los costesvecinos.clear();for(int i =0; i <3; i++){switch(i){case0:insercion.setEstado(moverIzq);insercion.addAccion(actTURN_L);insercion.addAccion(actFORWARD);costeG =20;break;case1:insercion.setEstado(moverDel);insercion.addAccion(actFORWARD);costeG =10;break;case2:insercion.setEstado(moverDer);insercion.addAccion(actTURN_R);insercion.addAccion(actFORWARD);costeG =20;break;}switch(queHay[i]){case'A'://Aguacase'B'://Bosquecase'P'://Precipiciocase'M'://Murocase'D'://Puertacase'?'://InexploradocosteG =5000;break;//El resto de casos (cuando es sencillo caminar por el terreno)//se ha hecho ya en el switch anterior}costeH =distanciaNodos(original, insercion);insercion.setCosteG(costeG);insercion.setCosteH(costeH);insercion.setCosteF(costeG + costeH);vecinos.push_back(insercion);}//Aquí viene la chicha del algoritmofor(auto it = vecinos.begin(); it != vecinos.end(); ++it){//La casilla es transitable//La casilla no está en cerradosif((*it).getCosteG() <5000 &&find(cerrados.begin(), cerrados.end(), (*it)) == cerrados.end()){int nuevoMovimientoVecino = current.getCosteG() +distanciaNodos(current, (*it));auto estaEnAb =find(abiertosLista.begin(), abiertosLista.end(), (*it));//Para comprobar si está ya en abiertosLista//Cuesta menos llegar así//No está en abiertosif(nuevoMovimientoVecino < (*it).getCosteG() || estaEnAb == abiertosLista.end()){// (*it).setCosteG(nuevoMovimientoVecino);// (*it).setCosteH(distanciaNodos((*it), target));if(estaEnAb == abiertosLista.end()){abiertos.push(*it);abiertosLista.push_back(*it);}}}}}returnfalse;//No ha conseguido encontrar un camino al rey}
Nota obtenida en ambas prácticas
Belkan reactivo: 9,5 / 10
Belkan deliberativo: 6,5 / 10
About
Prácticas realizadas en la asignatura de Inteligencia Artificial sobre un agente reactivo y deliberativo en la ETSIIT de la UGR