[C con Clase] Programación en C con Inteligencia Artificial

Jhosman Lizarazo - Ubuntu Colombia jhosman en ubuntu.com
Vie Mar 29 17:57:35 CET 2013


Bueno, creo que he resuelto el problema

El código

#ifndef _AGENTE_
#define _AGENTE_

#include "CTablero.hpp"
#include "Tipos.h"
extern unsigned int anchomatriz;
extern unsigned int altomatriz;
#include <iostream>

using namespace std;


class CAgente{

private:


    TPosicion pos_anterior, pos_actual;
public:

    CAgente();
    ~CAgente();
    void Percepcion();
    void Mover(TPosicion posicion);
    void Analizar();
    void Inferir();
    void Salir();
    void SalirSinPuente();
    void Volver_Casa();
    void Reiniciar();
    void Avanzar();

    CTablero tablero;
    int rendimiento;
    int sensaciones[3];     // Sensaciones de obstaculos
    char c_anterior, c_actual;
    int puente=0;

};


CAgente::CAgente(){
    rendimiento=0;               //Inicializa el rendimiento y la base de
conocimientos
    c_anterior=c_actual=0;
    for(int i=0; i<=anchomatriz; i++){
        sensaciones[i]=0;
    }
    pos_actual.x=anchomatriz; pos_actual.y=altomatriz; //Posiciona el
agente "abajo del todo"
    tablero.tablero_real[pos_actual.x][pos_actual.y]='A';
}

void CAgente::Percepcion(){  //Almacena en la base de conocimientos lo que
percibe el agente
    if(c_actual=='C' || c_actual=='A' || c_actual=='S'){
        sensaciones[0]=1;
    }else if (c_actual=='P' || c_actual=='P'){
        puente=1;
    }else if (c_actual=='R'){
        sensaciones[2]=1;
    }else{
        sensaciones[0]=sensaciones[1]=sensaciones[2]=0;
    }
}

void CAgente::Mover(TPosicion pos_siguiente){        //Mueve el agente a
una posicion determinada

    tablero.tablero_real[pos_actual.x][pos_actual.y]=0;
    pos_anterior=pos_actual;  c_anterior=c_actual;
    pos_actual=pos_siguiente;
c_actual=tablero.tablero_real[pos_siguiente.x][pos_siguiente.y];

    //Aqui ya me he movido
    Percepcion();
    Analizar();
    Inferir();
    tablero.Marcar(tablero.tablero_real, pos_actual,'J');
    tablero.Marcar(tablero.tablero_real, pos_anterior,c_anterior);
}

void CAgente::Analizar(){        //Analiza si las casillas adyacentes son
seguras

    if(sensaciones[0]==1){      //Si hay sillas cerca de un
        tablero.Marcar(tablero.tablero_conocido, pos_actual,'S');
        tablero.Marcar_Adyacentes(tablero.tablero_supuesto,
pos_actual,'A');

    }else if((sensaciones[2]==1) && (puente==1)){ //Salida
        Salir();

    }else if((sensaciones[2]==1)){ //Salida
        SalirSinPuente();
    }else if(sensaciones[1]==1){ //Si hay Arbol
        tablero.Marcar_Adyacentes(tablero.tablero_supuesto,
pos_actual,'A');
        tablero.Marcar(tablero.tablero_supuesto, pos_actual,'A');
    }else{      //Si no hay obstaculos
        tablero.Marcar(tablero.tablero_conocido, pos_actual,'S');
        tablero.Marcar_Adyacentes(tablero.tablero_conocido,
pos_actual,'S');
    }
}

void CAgente::Inferir(){  //Superpone el conocido con el supuesto
(prevalece seguro)
int contador=0;           //Si de un obstaculo no se hace nada
TPosicion pos_peligro[4];
pos_peligro[0]=pos_peligro[1]=pos_peligro[2]=pos_peligro[3]={0,0};

    //Marca las casillas que son seguras en el supuesto
    for(int j=0; j<=anchomatriz;j++){
        for(int i=0; i<=altomatriz;i++){
            if((tablero.tablero_supuesto[i][j]=='H' ||
tablero.tablero_supuesto[i][j]=='W') &&
tablero.tablero_conocido[i][j]=='S'){
                tablero.Marcar(tablero.tablero_supuesto, {i,j}, 0);
            }
        }
    }
    //Cuenta si hay mas de un peligro
    for(int j=0; j<=anchomatriz;j++){
        for(int i=0; i<=altomatriz;i++){
            if(tablero.tablero_supuesto[i][j]=='H' ||
tablero.tablero_supuesto[i][j]=='W'){
                contador++; pos_peligro[0]={i,j};
            }
        }
    }

    //Si hay mas de un peligro, marcamos peligro en conocido
    //Si hay solo uno, marcamos lo que es en conocido
    if(contador==1){

tablero.tablero_conocido[pos_peligro[0].x][pos_peligro[0].y]=tablero.tablero_supuesto[pos_peligro[0].x][pos_peligro[0].y];

    }else{
        for(int j=0; j<=anchomatriz;j++){
            for(int i=0; i<=altomatriz;i++){
                if(tablero.tablero_supuesto[i][j]=='H' ||
tablero.tablero_supuesto[i][j]=='W'){
                    tablero.tablero_conocido[i][j]='P';
                }
            }
        }
    }
    tablero.Borrar(tablero.tablero_supuesto);

    if(tablero.Adyacentes(tablero.tablero_conocido, pos_actual, 'W')){
        SalirSinPuente();
    }
}

void CAgente::Avanzar(){
TPosicion pos_siguiente;
int num_ale1,num_ale2;
num_ale1=-1+rand()%(2+1); num_ale2=-1+rand()%(2+1);
tablero.Marcar(tablero.tablero_visitado, pos_actual,'V');




    if(pos_actual.x==0 && pos_actual.y==0 &&
tablero.tablero_visitado[pos_actual.x+1][pos_actual.y]=='X' &&
       tablero.tablero_visitado[pos_actual.x][pos_actual.y+1]=='X'){
        Volver_Casa();
    }else if(pos_actual.x==7 && pos_actual.y==7 &&
tablero.tablero_visitado[pos_actual.x-1][pos_actual.y]=='X' &&
       tablero.tablero_visitado[pos_actual.x][pos_actual.y-1]=='X'){
        Volver_Casa();
    }else if(pos_actual.x==0 && pos_actual.y==7 &&
tablero.tablero_visitado[pos_actual.x+1][pos_actual.y]=='X' &&
       tablero.tablero_visitado[pos_actual.x][pos_actual.y-1]=='X'){
        Volver_Casa();
    }else if(pos_actual.x==7 && pos_actual.y==0 &&
tablero.tablero_visitado[pos_actual.x-1][pos_actual.y]=='X' &&
       tablero.tablero_visitado[pos_actual.x][pos_actual.y+1]=='X'){
        Volver_Casa();
    }else if(tablero.tablero_visitado[pos_actual.x+1][pos_actual.y]=='X' &&
             tablero.tablero_visitado[pos_actual.x][pos_actual.y-1]=='X' &&
             tablero.tablero_visitado[pos_actual.x-1][pos_actual.y]=='X' &&
             tablero.tablero_visitado[pos_actual.x][pos_actual.y+1]=='X'){
        Volver_Casa();
    }else if(pos_actual.x==0 &&
tablero.tablero_visitado[pos_actual.x+1][pos_actual.y]=='X' &&
             tablero.tablero_visitado[pos_actual.x][pos_actual.y-1]=='X' &&
             tablero.tablero_visitado[pos_actual.x][pos_actual.y+1]=='X'){
        Volver_Casa();
    }else if(pos_actual.x==7 &&
tablero.tablero_visitado[pos_actual.x-1][pos_actual.y]=='X' &&
             tablero.tablero_visitado[pos_actual.x][pos_actual.y-1]=='X' &&
             tablero.tablero_visitado[pos_actual.x][pos_actual.y+1]=='X'){
        Volver_Casa();
    }else if(pos_actual.y==0 &&
tablero.tablero_visitado[pos_actual.x+1][pos_actual.y]=='X' &&
             tablero.tablero_visitado[pos_actual.x][pos_actual.x-1]=='X' &&
             tablero.tablero_visitado[pos_actual.x][pos_actual.x+1]=='X'){
        Volver_Casa();
    }else if(pos_actual.y==7 &&
tablero.tablero_visitado[pos_actual.y-1][pos_actual.y]=='X' &&
             tablero.tablero_visitado[pos_actual.x][pos_actual.x-1]=='X' &&
             tablero.tablero_visitado[pos_actual.x][pos_actual.x+1]=='X'){
        Volver_Casa();
    }
//    if(pos_actual.x+num_ale1>=0 &&
tablero.tablero_conocido[pos_actual.x+num_ale1][pos_actual.y+num_ale2]=='S'
&&
//       pos_actual.x+num_ale1<=7 &&
tablero.tablero_visitado[pos_actual.x+num_ale1][pos_actual.y+num_ale2]!='X'
&&
//       pos_actual.y+num_ale2>=0 && pos_actual.y+num_ale2<=7){
//        pos_siguiente={pos_actual.x+num_ale1,pos_actual.y+num_ale2};
//    }else{
//        tablero.tablero_visitado[pos_actual.x][pos_actual.y]='X';
//    }


    if(pos_actual.x+1>=0 &&
tablero.tablero_conocido[pos_actual.x+1][pos_actual.y]=='S' &&
       pos_actual.x+1<=anchomatriz &&
tablero.tablero_visitado[pos_actual.x+1][pos_actual.y]!='X'){

        pos_siguiente={pos_actual.x+1,pos_actual.y};
    }else{
        tablero.tablero_visitado[pos_actual.x][pos_actual.y]='X';
        if(pos_actual.y-1>=0 &&
tablero.tablero_conocido[pos_actual.x][pos_actual.y-1]=='S' &&
           pos_actual.y-1<=anchomatriz &&
tablero.tablero_visitado[pos_actual.x][pos_actual.y-1]!='X'){

        pos_siguiente={pos_actual.x,pos_actual.y-1};
        }else{
            tablero.tablero_visitado[pos_actual.x][pos_actual.y]='X';
            if(pos_actual.x-1>=0 &&
tablero.tablero_conocido[pos_actual.x-1][pos_actual.y]=='S' &&
               pos_actual.x-1<=anchomatriz &&
tablero.tablero_visitado[pos_actual.x-1][pos_actual.y]!='X'){

                pos_siguiente={pos_actual.x-1,pos_actual.y};
            }else{
                tablero.tablero_visitado[pos_actual.x][pos_actual.y]='X';
                if(pos_actual.y+1>=0 &&
tablero.tablero_conocido[pos_actual.x][pos_actual.y+1]=='S' &&
                   pos_actual.y+1<=anchomatriz &&
tablero.tablero_visitado[pos_actual.x][pos_actual.y+1]!='X'){

                    pos_siguiente={pos_actual.x,pos_actual.y+1};
                }else{

tablero.tablero_visitado[pos_actual.x][pos_actual.y]='X';
                    pos_siguiente=pos_anterior;
                }
            }
        }
    }

    Mover(pos_siguiente);
    tablero.Marcar(tablero.tablero_visitado, pos_actual,'V');
}

void CAgente::Reiniciar(){
    tablero.Reiniciar();
    rendimiento=0; c_anterior=c_actual=5;
    for(int i=0; i<=anchomatriz; i++){
        sensaciones[i]=0;
    }
    int posicionagentex, posicionagentey;
    posicionagentex = rand()%anchomatriz;
    posicionagentey = rand()%anchomatriz;
    cout<<"El agente inicia en"<<posicionagentex<<" y "<<posicionagentey;
    pos_actual.x=posicionagentex; pos_actual.y=posicionagentey;
    tablero.tablero_real[pos_actual.x][pos_actual.y]='J';
}

void CAgente::Volver_Casa(){
    rendimiento=-100;
}

void CAgente::Salir(){
    rendimiento+=1000;
}

void CAgente::SalirSinPuente(){
    rendimiento+=2000;
}

CAgente::~CAgente(){
}


#endif


El 29 de marzo de 2013 11:51, Davidson, Steven<srd4121 en njit.edu> escribió:

> Hola Jhosman,
>
> 2013/3/29 Jhosman Lizarazo - Ubuntu Colombia <jhosman en ubuntu.com>
>>
>> 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
>>
>
> No deberías buscar P, ya que es conocido por el robot, al comienzo de la
> simulación.
>
> 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?
>>
>>
>
> Si estás dudando de si el robot pasó por el puente o no, entonces no me
> has entendido. La solución general es:
>
> 1. Comenzar
> 2. Buscar una ruta de X a S.
> 3. Terminar
>
> Para implementar esta solución, la dividimos en dos soluciones menos
> complejas:
>
> 1. Comenzar
> 2. Buscar una ruta de X a P
> 3. Buscar una ruta de P a S
> 4. Terminar
>
> 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.
>
>
> Espero haber aclarado la duda.
>
> Steven
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>



-- 
Cordialmente.



Jhosman Lizarazo
https://launchpad.net/~jhosman
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130329/933b3d5b/attachment.html>


Más información sobre la lista de distribución Cconclase