<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>