[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