[RESOLVIDO] Inteligencia Artificial

35 respostas Resolvido
iajava
J

Pessoal estou estudando inteligencia artificial pelo canal zarunbabel, ja implementei o codigo do aspirador de po, mais nao consigo fazer algo diferente como/:
No codigo dele toda vez que o aspirador passar troca a letra S sujo por Limpo L, pois toda a matriz é de L, ele so vai trocando,…

minha duvida é o seguinte, eu sortiei varias letras pela classe random, e quero que ele so troque por L onde tiver S de sujo…

o codigo esta assim…

`public void movimentar() {
	if (this.pilhaMovimentos >= 4) {
		return;
	}
	PosicaoXY proximoMovimento = retornarMovimento();
	char valor = this.labirinto.retornarValorPosicaoLabirinto(proximoMovimento);
	
	if (valor == 'L' || valor == 'R') {
                    
		proximoMovimento();
		aumentarPilha();//
		movimentar();
                   
                

                
            }else{
		this.labirinto.limpar();
		this.posXY = proximoMovimento;
            }
}`

o R é o robo ou seja o aspirador ai ele compara as duas letras ai, se nao for ela ele entra no metodo limpar que ai ele troca trodas as letras, mais no meu caso sao varias letras e ele continua trocando todas por L, preciso trocar somente o S,
o metodo limpar esta esse…

`    public void limpar() {
  
  PosicaoXY posicao = this.agente.getPosicao();
  labirinto[posicao.getPosX()][posicao.getPosY()] = 'L';
}`

alguma dica como modificar?

35 Respostas

staroski
PosicaoXY posicao = this.agente.getPosicao();
int x = posicao.getPosX();
int y = posicao.getPosY();
if (labirinto[x][y] == 'S') {
    labirinto[x][y] = 'L';
}
J

beleza @staroski, so pensei nesse metodo entendir sua logica ta filé, porem agora ele troca todas as letras pelo #, ou seja ele atualiza a posicao por #, esta trocando todas por #, deve ser meu metodo atualizaposicao,

`private void atualizarPosicaoAgente() {
    if (this.agente != null) {
        PosicaoXY posAgente = this.agente.getPosicao();
        labirinto[posAgente.getPosX()][posAgente.getPosY()] = '#';
    }
}`
J

todas as vezes que ele exibe o labirinto ele atualiza a posicao nesse caso ele ja troca por #

staroski

O seu método atualizarPosicaoAgente põe um # na posição atual do agente.
O que você gostaria que o método fizesse?

Dúvida:
Porque você tem um if (this.agente != null)?
Em que situação o agente estaria null?

J

o que eu gostaria de fazer era nao atualizar na vdd, eu queria que o # fosse pulando de casa so para verificar e simular um robo andando ai se ele encontrar o S ai trocaria por L, ele tem que passar e nao mudar o valor.

J

ele verifica se ja tem um agente ou nao, retirando ele poe um erro
@staroski

J

olha @staroski toda vez que vou exibir o ambiente ele atualiza a posicao, segue o codigo…

`public void exibirAmbiente() {
    atualizarPosicaoAgente();
    //this.getLabirinto();
    for (int i = 0; i < tamanhoLabirinto; i++) {
        for (int j = 0; j < tamanhoLabirinto; j++) {

            if (this.labirinto[i][j] == '#') {
                System.out.print("|" + labirinto[i][j] + "|");
            } else {
                System.out.print("|" + labirinto[i][j] + "|");
            }

        }
        System.out.println("");
    }
    System.out.println("");
}`
staroski

Não entendi essa lógica.

J

certo, foi uma logica aki mais nao interfere em nada acabei de retirar,

` public void exibirLabirinto() {
    atualizarPosicaoAgente();
     for (int i = 0; i < tamanhoLabirinto; i++) {
        for (int j = 0; j < tamanhoLabirinto; j++) {
         System.out.print("|" + labirinto[i][j] + "|");
            //} else {
               // System.out.print("|" + labirinto[i][j] + "|");
           // }

        }
        System.out.println("");
    }
    System.out.println("");
}

`

J

@staroski eu so preciso de uma ajuda como mover em cima da matriz sem alterar o valor

staroski
public void exibirLabirinto() {
    atualizarPosicaoAgente();
    PosicaoXY posAgente = this.agente.getPosicao();
    int x = posAgente.getPosX();
    int y = posAgente.getPosY();
    for (int i = 0; i < tamanhoLabirinto; i++) {
        for (int j = 0; j < tamanhoLabirinto; j++) {
            if (i == y && j == x) {
                System.out.print("|" + "#" + "|");  // exibe a posicao do agente
            } else {
                System.out.print("|" + labirinto[i][j] + "|");  // exibe o valor da posicao
            }
        }
        System.out.println("");
    }
    System.out.println("");
}
J

@staroski dessa forma ele dar um erro no metodo

Exception in thread main java.lang.NullPointerException

at Ambiente.Labirinto.exibirLabirinto(Labirinto.java:55)

at Principal.InteligenciaArtificial.main(InteligenciaArtificial.java:25)

Java Result: 1

ele consta o erro nessa linha

`PosicaoXY posAgente = this.agente.getPosicao();`
J

olhe por onde ele passa ele atualiza, o que vc mandou ele dar erro no metodo

staroski

Se aconteceu NullPointerException é porque faltou você inicializar a variável agente.

J

@staroski a variavel agente ja esta inicializada

J

no codigo nao dar erro @staroski

staroski

Então não aconteceria NullPointerException na linha que você postou.

Posta o Stack Trace e o código completo das classes

J

@staroski blzvou posta todas as classes

J

essa é a classe agente aspirador

`public class AgenteAspirador {

private Ambiente ambiente;
private Movimentos movimento;


private PosicaoXY posXY;

private int pilhaMovimentos;
//private int pontuacaoAspirador = 0;

public AgenteAspirador(Ambiente ambiente) {
    this.ambiente = ambiente;
    ambiente.setAgente(this);
    this.posXY = new PosicaoXY();
    this.movimento = Movimentos.CIMA;
    //this.pontuacaoAspirador++;
    
}
//se ele ja tiver feito os 4 movimentos ele vai saber 
//que nao vai ter nenhum outro movimento ai irá parar.

public void movimentar() {
    if (this.pilhaMovimentos >= 4) {
        return;
    }
    PosicaoXY proximoMovimento = retornarMovimento();
    char valor = this.ambiente.retornarValorPosicaoAmbiente(proximoMovimento);
  

    if (valor == '#' || valor == 'L') {
        proximoMovimento();
        aumentarPilha();//
        movimentar();
   
        
    
    } else {
        this.ambiente.limpar();
        this.posXY = proximoMovimento;
     

    }
}

//ele fica sabendo o tamnho dele, ele nao vai conseguir encontrar nenhuma sujeira e ira parar
private void aumentarPilha() {
    this.pilhaMovimentos++;
}

private void proximoMovimento() {
    switch (this.movimento) {
        case CIMA:
            this.movimento = Movimentos.BAIXO;
            break;
        case BAIXO:
            this.movimento = Movimentos.ESQUERDA;
            break;
        case ESQUERDA:
            this.movimento = Movimentos.DIREITA;
            break;
        case DIREITA:
            this.movimento = Movimentos.CIMA;
            break;
    }
}

public PosicaoXY retornarMovimento() {
    int retornoPosX = this.posXY.getPosX();
    int retornoPosY = this.posXY.getPosY();
    switch (movimento) {
        case CIMA:
            if (retornoPosX > 0) {
                retornoPosX -= 1;
            }
            break;
        case BAIXO:
            if (retornoPosX < this.ambiente.getTamanhoAmbiente() - 1) {
                retornoPosX += 1;
            }
            break;
        case ESQUERDA:
            if (retornoPosY > 0) {
                retornoPosY -= 1;
            }
            break;
        case DIREITA:
            if (retornoPosY < this.ambiente.getTamanhoAmbiente() - 1) {
                retornoPosY += 1;
            }
            break;
    }
    return new PosicaoXY(retornoPosX, retornoPosY);
}

public PosicaoXY getPosicao() {
    return this.posXY;
}

public boolean isAindaLimpando() {
    return pilhaMovimentos < 4;
}

public void zerarPilha() {
    this.pilhaMovimentos = 0;
}

}
`

J

classe movimentos

`public enum Movimentos {

CIMA, BAIXO, ESQUERDA, DIREITA;

}`

J

classe posicaoxy

public class PosicaoXY {

private int posX;
private int posY;

public PosicaoXY() {
    this.posX = 0;
    this.posY = 0;
}

public PosicaoXY(int posX, int posY) {
    this.posX = posX;
    this.posY = posY;
}

public int getPosX() {
    return posX;
}

public void setPosX(int posX) {
    this.posX = posX;
}

public int getPosY() {
    return posY;
}

public void setPosY(int posY) {
    this.posY = posY;
}

}

J

main

public class Main {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws InterruptedException {
 
    Ambiente ambiente = new Ambiente(4);	
	ambiente.exibirAmbiente();
	
	AgenteAspirador agente = new AgenteAspirador(ambiente);
	//agente.setPosicao(new PosicaoXY(2,2));

	while(agente.isAindaLimpando()) {
		agente.zerarPilha();
		agente.movimentar(); 
		ambiente.exibirAmbiente();
		Thread.sleep(1500);
	}
	
       
}

    
    
}
J

classe ambiente

public class Ambiente {

private int tamanhoAmbiente;


char[] letras = new char[]{'C', 'M', 'A', 'S', 'L'};
char[][] ambiente;
int cont = 0;

//new char[tamanhoLabirinto][tamanhoLabirinto];
private AgenteAspirador agente;

public Ambiente(int tamanhoAmbiente) {
    this.tamanhoAmbiente = tamanhoAmbiente;
    this.construirNovoAmbiente();
}

//sortear letras
Random random = new Random();

// Construir o labirinto
private void construirNovoAmbiente() {
    ambiente = new char[this.tamanhoAmbiente][this.tamanhoAmbiente];
    for (int i = 0; i < this.tamanhoAmbiente; i++) {
        for (int j = 0; j < this.tamanhoAmbiente; j++) {
            // labirinto[i][j] = "S"; 
            ambiente[i][j] = letras[random.nextInt(letras.length)];
        }
    }
}

public char[][] getAmbiente() {
    return ambiente;
}

//exibe a matriz
public void exibirAmbiente() {

atualizarPosicaoAgente();

PosicaoXY posAgente = this.agente.getPosicao();

int x = posAgente.getPosX();

int y = posAgente.getPosY();

for (int i = 0; i < tamanhoAmbiente; i++) {

for (int j = 0; j < tamanhoAmbiente; j++) {

if (i == y && j == x) {

System.out.print("|" + “#” + |);  // exibe a posicao do agente

} else {

System.out.print("|" + ambiente[i][j] + |);  // exibe o valor da posicao

}

}

System.out.println("");

}

System.out.println("");

}
public int getTamanhoAmbiente() {

    return this.tamanhoAmbiente;
}

//retorna o valor que esta ali naquela posicao do ambiente
//retorna o valor que esta ali

public char retornarValorPosicaoAmbiente(PosicaoXY posicao) {
    return this.ambiente[posicao.getPosX()][posicao.getPosY()];
}

public void setAgente(AgenteAspirador agente) {
    this.agente = agente;
}

//verifica se esta sujo e limpa trocando S por L

public void limpar() {
    PosicaoXY posicao = this.agente.getPosicao();
    int x = posicao.getPosX();
    int y = posicao.getPosY();
    if (ambiente[x][y] == 'S') {
        ambiente[x][y] = 'L';
    }
}

private void atualizarPosicaoAgente() {
    if (this.agente != null) {
        PosicaoXY posAgente = this.agente.getPosicao();
        ambiente[posAgente.getPosX()][posAgente.getPosY()] = '#';

    }

}

}

J

@staroski esta ai todas as classes do progama

J

@staroski o erro dar naquela linha msm NullPointerException;

J

J

@staroski deu para olhar o codigo?

staroski
Solucao aceita

Consegui ver sem dar.

Como eu já havia dito, você não inicializou a variável agente.

Olha o código do seu método main, você chama o método exibirAmbiente() antes de instanciar o AgenteAspirador.

Nesse momento o atributo agente do objeto ambiente ainda está null.

Você só inicializa o agente através do método setAgente, dentro do construtor da classe AgenteAspirador.

Resumindo, você só pode chamar o método exibirAmbiente() depois de ter chamado o setAgente.

J

certo agradeco a ajuda eu fiz la mais ainda continua na msm, a diferenca é que por um lado ele percorre normalmente pulando as casas sem o substituir e o outro lado ele comoca a substituir como antes…entende?

rodriguesabner

Kkkkkkkkk

staroski

Pôxa, você poderia ao menos fazer uns testes de mesa pra entender o que está acontecendo.
A posição do agente não deve ser setada no array, ela só deve ser apresentada.
Olha o que você faz no método atualizarPosicaoAgente, esse método nem precisa existir.

J

beleza meu amigo, ja ajudou demais deixa pelo menos mim viro pelo menos tento e aprendo mais, valeu mesmo pela ajuda…

staroski

Percebeu que o método atualizarPosicaoAgente não precisa existir?
Quem atualiza a posição no seu código é o método retornarMovimento, deveria ser o método movimentar.

pfk66

Se você valoriza seu tempo eu sugiro usar uma linguagem mais fácil. Eu sei que aqui é um site de Java, mas não é uma boa ferramenta para IA, só vai retardar o seu aprendizado.

Outra coisa, se quer aprender leia livros em vez de seguir desconhecidos no YouTube.

J

sim, blz

Criado 12 de agosto de 2018
Ultima resposta 15 de ago. de 2018
Respostas 35
Participantes 4