<div dir="ltr">Bueno, creo que he resuelto el problema<br><br>El código <br><br>#ifndef _AGENTE_
<br>#define _AGENTE_
<br> <br>#include "CTablero.hpp"
<br>#include "Tipos.h"
<br>extern unsigned int anchomatriz;
<br>extern unsigned int altomatriz;
<br>#include <iostream>
<br> <br>using namespace std;
<br> <br> <br>class CAgente{
<br> <br>private:
<br> <br> <br> TPosicion pos_anterior, pos_actual;
<br>public:
<br> <br> CAgente();
<br> ~CAgente();
<br> void Percepcion();
<br> void Mover(TPosicion posicion);
<br> void Analizar();
<br> void Inferir();
<br> void Salir();
<br> void SalirSinPuente();
<br> void Volver_Casa();
<br> void Reiniciar();
<br> void Avanzar();
<br> <br> CTablero tablero;
<br> int rendimiento;
<br> int sensaciones[3]; // Sensaciones de obstaculos
<br> char c_anterior, c_actual;
<br> int puente=0;
<br> <br>};
<br> <br> <br>CAgente::CAgente(){
<br> rendimiento=0; //Inicializa el rendimiento y la base de conocimientos
<br> c_anterior=c_actual=0;
<br> for(int i=0; i<=anchomatriz; i++){
<br> sensaciones[i]=0;
<br> }
<br> pos_actual.x=anchomatriz; pos_actual.y=altomatriz; //Posiciona el agente "abajo del todo"
<br> tablero.tablero_real[pos_actual.x][pos_actual.y]='A';
<br>}
<br> <br>void CAgente::Percepcion(){ //Almacena en la base de conocimientos lo que percibe el agente
<br> if(c_actual=='C' || c_actual=='A' || c_actual=='S'){
<br> sensaciones[0]=1;
<br> }else if (c_actual=='P' || c_actual=='P'){
<br> puente=1;
<br> }else if (c_actual=='R'){
<br> sensaciones[2]=1;
<br> }else{
<br> sensaciones[0]=sensaciones[1]=sensaciones[2]=0;
<br> }
<br>}
<br> <br>void CAgente::Mover(TPosicion pos_siguiente){ //Mueve el agente a una posicion determinada
<br> <br> tablero.tablero_real[pos_actual.x][pos_actual.y]=0;
<br> pos_anterior=pos_actual; c_anterior=c_actual;
<br> pos_actual=pos_siguiente; c_actual=tablero.tablero_real[pos_siguiente.x][pos_siguiente.y];
<br> <br> //Aqui ya me he movido
<br> Percepcion();
<br> Analizar();
<br> Inferir();
<br> tablero.Marcar(tablero.tablero_real, pos_actual,'J');
<br> tablero.Marcar(tablero.tablero_real, pos_anterior,c_anterior);
<br>}
<br> <br>void CAgente::Analizar(){ //Analiza si las casillas adyacentes son seguras
<br> <br> if(sensaciones[0]==1){ //Si hay sillas cerca de un
<br> tablero.Marcar(tablero.tablero_conocido, pos_actual,'S');
<br> tablero.Marcar_Adyacentes(tablero.tablero_supuesto, pos_actual,'A');
<br> <br> }else if((sensaciones[2]==1) && (puente==1)){ //Salida
<br> Salir();
<br> <br> }else if((sensaciones[2]==1)){ //Salida
<br> SalirSinPuente();
<br> }else if(sensaciones[1]==1){ //Si hay Arbol
<br> tablero.Marcar_Adyacentes(tablero.tablero_supuesto, pos_actual,'A');
<br> tablero.Marcar(tablero.tablero_supuesto, pos_actual,'A');
<br> }else{ //Si no hay obstaculos
<br> tablero.Marcar(tablero.tablero_conocido, pos_actual,'S');
<br> tablero.Marcar_Adyacentes(tablero.tablero_conocido, pos_actual,'S');
<br> }
<br>}
<br> <br>void CAgente::Inferir(){ //Superpone el conocido con el supuesto (prevalece seguro)
<br>int contador=0; //Si de un obstaculo no se hace nada
<br>TPosicion pos_peligro[4];
<br>pos_peligro[0]=pos_peligro[1]=pos_peligro[2]=pos_peligro[3]={0,0};
<br> <br> //Marca las casillas que son seguras en el supuesto
<br> for(int j=0; j<=anchomatriz;j++){
<br> for(int i=0; i<=altomatriz;i++){
<br> if((tablero.tablero_supuesto[i][j]=='H' || tablero.tablero_supuesto[i][j]=='W') && tablero.tablero_conocido[i][j]=='S'){
<br> tablero.Marcar(tablero.tablero_supuesto, {i,j}, 0);
<br> }
<br> }
<br> }
<br> //Cuenta si hay mas de un peligro
<br> for(int j=0; j<=anchomatriz;j++){
<br> for(int i=0; i<=altomatriz;i++){
<br> if(tablero.tablero_supuesto[i][j]=='H' || tablero.tablero_supuesto[i][j]=='W'){
<br> contador++; pos_peligro[0]={i,j};
<br> }
<br> }
<br> }
<br> <br> //Si hay mas de un peligro, marcamos peligro en conocido
<br> //Si hay solo uno, marcamos lo que es en conocido
<br> if(contador==1){
<br> tablero.tablero_conocido[pos_peligro[0].x][pos_peligro[0].y]=tablero.tablero_supuesto[pos_peligro[0].x][pos_peligro[0].y];
<br> }else{
<br> for(int j=0; j<=anchomatriz;j++){
<br> for(int i=0; i<=altomatriz;i++){
<br> if(tablero.tablero_supuesto[i][j]=='H' || tablero.tablero_supuesto[i][j]=='W'){
<br> tablero.tablero_conocido[i][j]='P';
<br> }
<br> }
<br> }
<br> }
<br> tablero.Borrar(tablero.tablero_supuesto);
<br> <br> if(tablero.Adyacentes(tablero.tablero_conocido, pos_actual, 'W')){
<br> SalirSinPuente();
<br> }
<br>}
<br> <br>void CAgente::Avanzar(){
<br>TPosicion pos_siguiente;
<br>int num_ale1,num_ale2;
<br>num_ale1=-1+rand()%(2+1); num_ale2=-1+rand()%(2+1);
<br>tablero.Marcar(tablero.tablero_visitado, pos_actual,'V');
<br> <br> <br> <br> <br> if(pos_actual.x==0 && pos_actual.y==0 && tablero.tablero_visitado[pos_actual.x+1][pos_actual.y]=='X' &&
<br> tablero.tablero_visitado[pos_actual.x][pos_actual.y+1]=='X'){
<br> Volver_Casa();
<br> }else if(pos_actual.x==7 && pos_actual.y==7 && tablero.tablero_visitado[pos_actual.x-1][pos_actual.y]=='X' &&
<br> tablero.tablero_visitado[pos_actual.x][pos_actual.y-1]=='X'){
<br> Volver_Casa();
<br> }else if(pos_actual.x==0 && pos_actual.y==7 && tablero.tablero_visitado[pos_actual.x+1][pos_actual.y]=='X' &&
<br> tablero.tablero_visitado[pos_actual.x][pos_actual.y-1]=='X'){
<br> Volver_Casa();
<br> }else if(pos_actual.x==7 && pos_actual.y==0 && tablero.tablero_visitado[pos_actual.x-1][pos_actual.y]=='X' &&
<br> tablero.tablero_visitado[pos_actual.x][pos_actual.y+1]=='X'){
<br> Volver_Casa();
<br> }else if(tablero.tablero_visitado[pos_actual.x+1][pos_actual.y]=='X' &&
<br> tablero.tablero_visitado[pos_actual.x][pos_actual.y-1]=='X' &&
<br> tablero.tablero_visitado[pos_actual.x-1][pos_actual.y]=='X' &&
<br> tablero.tablero_visitado[pos_actual.x][pos_actual.y+1]=='X'){
<br> Volver_Casa();
<br> }else if(pos_actual.x==0 && tablero.tablero_visitado[pos_actual.x+1][pos_actual.y]=='X' &&
<br> tablero.tablero_visitado[pos_actual.x][pos_actual.y-1]=='X' &&
<br> tablero.tablero_visitado[pos_actual.x][pos_actual.y+1]=='X'){
<br> Volver_Casa();
<br> }else if(pos_actual.x==7 && tablero.tablero_visitado[pos_actual.x-1][pos_actual.y]=='X' &&
<br> tablero.tablero_visitado[pos_actual.x][pos_actual.y-1]=='X' &&
<br> tablero.tablero_visitado[pos_actual.x][pos_actual.y+1]=='X'){
<br> Volver_Casa();
<br> }else if(pos_actual.y==0 && tablero.tablero_visitado[pos_actual.x+1][pos_actual.y]=='X' &&
<br> tablero.tablero_visitado[pos_actual.x][pos_actual.x-1]=='X' &&
<br> tablero.tablero_visitado[pos_actual.x][pos_actual.x+1]=='X'){
<br> Volver_Casa();
<br> }else if(pos_actual.y==7 && tablero.tablero_visitado[pos_actual.y-1][pos_actual.y]=='X' &&
<br> tablero.tablero_visitado[pos_actual.x][pos_actual.x-1]=='X' &&
<br> tablero.tablero_visitado[pos_actual.x][pos_actual.x+1]=='X'){
<br> Volver_Casa();
<br> }
<br>// if(pos_actual.x+num_ale1>=0 && tablero.tablero_conocido[pos_actual.x+num_ale1][pos_actual.y+num_ale2]=='S' &&
<br>// pos_actual.x+num_ale1<=7 && tablero.tablero_visitado[pos_actual.x+num_ale1][pos_actual.y+num_ale2]!='X' &&
<br>// pos_actual.y+num_ale2>=0 && pos_actual.y+num_ale2<=7){
<br>// pos_siguiente={pos_actual.x+num_ale1,pos_actual.y+num_ale2};
<br>// }else{
<br>// tablero.tablero_visitado[pos_actual.x][pos_actual.y]='X';
<br>// }
<br> <br> <br> if(pos_actual.x+1>=0 && tablero.tablero_conocido[pos_actual.x+1][pos_actual.y]=='S' &&
<br> pos_actual.x+1<=anchomatriz && tablero.tablero_visitado[pos_actual.x+1][pos_actual.y]!='X'){
<br> <br> pos_siguiente={pos_actual.x+1,pos_actual.y};
<br> }else{
<br> tablero.tablero_visitado[pos_actual.x][pos_actual.y]='X';
<br> if(pos_actual.y-1>=0 && tablero.tablero_conocido[pos_actual.x][pos_actual.y-1]=='S' &&
<br> pos_actual.y-1<=anchomatriz && tablero.tablero_visitado[pos_actual.x][pos_actual.y-1]!='X'){
<br> <br> pos_siguiente={pos_actual.x,pos_actual.y-1};
<br> }else{
<br> tablero.tablero_visitado[pos_actual.x][pos_actual.y]='X';
<br> if(pos_actual.x-1>=0 && tablero.tablero_conocido[pos_actual.x-1][pos_actual.y]=='S' &&
<br> pos_actual.x-1<=anchomatriz && tablero.tablero_visitado[pos_actual.x-1][pos_actual.y]!='X'){
<br> <br> pos_siguiente={pos_actual.x-1,pos_actual.y};
<br> }else{
<br> tablero.tablero_visitado[pos_actual.x][pos_actual.y]='X';
<br> if(pos_actual.y+1>=0 && tablero.tablero_conocido[pos_actual.x][pos_actual.y+1]=='S' &&
<br> pos_actual.y+1<=anchomatriz && tablero.tablero_visitado[pos_actual.x][pos_actual.y+1]!='X'){
<br> <br> pos_siguiente={pos_actual.x,pos_actual.y+1};
<br> }else{
<br> tablero.tablero_visitado[pos_actual.x][pos_actual.y]='X';
<br> pos_siguiente=pos_anterior;
<br> }
<br> }
<br> }
<br> }
<br> <br> Mover(pos_siguiente);
<br> tablero.Marcar(tablero.tablero_visitado, pos_actual,'V');
<br>}
<br> <br>void CAgente::Reiniciar(){
<br> tablero.Reiniciar();
<br> rendimiento=0; c_anterior=c_actual=5;
<br> for(int i=0; i<=anchomatriz; i++){
<br> sensaciones[i]=0;
<br> }
<br> int posicionagentex, posicionagentey;
<br> posicionagentex = rand()%anchomatriz;
<br> posicionagentey = rand()%anchomatriz;
<br> cout<<"El agente inicia en"<<posicionagentex<<" y "<<posicionagentey;
<br> pos_actual.x=posicionagentex; pos_actual.y=posicionagentey;
<br> tablero.tablero_real[pos_actual.x][pos_actual.y]='J';
<br>}
<br> <br>void CAgente::Volver_Casa(){
<br> rendimiento=-100;
<br>}
<br> <br>void CAgente::Salir(){
<br> rendimiento+=1000;
<br>}
<br> <br>void CAgente::SalirSinPuente(){
<br> rendimiento+=2000;
<br>}
<br> <br>CAgente::~CAgente(){
<br>}
<br> <br> <br>#endif<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">El 29 de marzo de 2013 11:51, Davidson, Steven<span dir="ltr"><<a href="mailto:srd4121@njit.edu" target="_blank">srd4121@njit.edu</a>></span> escribió:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hola Jhosman,<div class="gmail_extra"><br><div class="gmail_quote"><div class="im">2013/3/29 Jhosman Lizarazo - Ubuntu Colombia <span dir="ltr"><<a href="mailto:jhosman@ubuntu.com" target="_blank">jhosman@ubuntu.com</a>></span><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div dir="ltr"><div><div class="gmail_extra"><div class="gmail_quote"><div>La salida debe estar tal como dices y así ya lo he programado.... solo me falta es hacer la búsqueda de P ya que el robot solo realiza el </div></div>
</div></div></div></blockquote><div><br></div></div><div>No deberías buscar P, ya que es conocido por el robot, al comienzo de la simulación.<br></div><div class="im"><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div dir="ltr"><div><div class="gmail_extra"><div class="gmail_quote"><div>análisis en la posición actual, por lo cual no se como realizar ambas comparaciones, (Si ya pasó por el puente o no) crees que me puedas ayudar con este código por interno? <br>
</div></div></div></div></div></blockquote><div><br></div></div><div>Si estás dudando de si el robot pasó por el puente o no, entonces no me has entendido. La solución general es:<br><br><div>1. Comenzar</div>2. Buscar una ruta de X a S.</div>
<div><div>3. Terminar</div><div><br></div></div><div>Para implementar esta solución, la dividimos en dos soluciones menos complejas:<br><br>1. Comenzar</div><div>2. Buscar una ruta de X a P</div><div>
3. Buscar una ruta de P a S</div><div>4. Terminar</div><div><br></div><div>Obviamente, tienes que implementar cada búsqueda, pero si la haces correctamente, se trata de la misma función. Idealmente no debería haber diferencia entre buscar una ruta de X a P, ni de P a S, ni de A a B, ni ninguna casilla a otra casilla. Esto es porque el algoritmo A* es general para cualquier búsqueda de rutas entre 2 puntos.</div>
<div><br></div><div><br></div><div>Espero haber aclarado la duda.</div><span class="HOEnZb"><font color="#888888"><div><br></div><div>Steven</div><div><br></div></font></span></div></div></div>
<br>_______________________________________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br></blockquote></div><br><br clear="all"><br>-- <br><div>Cordialmente.</div>
<div><br></div><div><br></div><div><br></div><div>Jhosman Lizarazo</div><div><a href="https://launchpad.net/~jhosman" target="_blank">https://launchpad.net/~jhosman</a></div>
</div>