To fazendo um algoritmo de busca por largura(puzzle 3x3). A estrutura esta montada tudo certo, só que pra cada estado novo cria um objeto novo que verifica novamente os estados possiveis, e por ai vai. Isso ta dando um erro (Exception in thread “main” java.lang.StackOverflowError), que dei uma olhada, e vi que é algo sobre quando se tem um looping infinito de objetos criados, a memória n suporta (é isso né? )…
Vi sobre pilha, isso resolveria? E queria saber como funciona… ela remove os objetos criados da memória, algo assim?
Se alguem puder ajudar, ou passar um link sobre o assunto, mas algo didático pois nunca trabalhei com isso…
publicclassNode{//Essa classe tem um ArrayList aonde armazeno os estados visitados para não repeti-losestadosVisitadosev=newestadosVisitados();// Fiz um construtor para receber os parâmetrospublicNode(Nodepai,inttabuleiro[][],intnivel){this.tabuleiro=tabuleiro;this.pai=pai;filho=newNode[4];this.nivel=nivel;grau=0;ev.estados.add(this.tabuleiro);resolver();}// O método resolver chama o método para achar a posição "0", e depois o mover. publicvoidresolver(){if(ehMeta(this.tabuleiro)==false){acharPosicaoZero(this.tabuleiro);// Toda vez que ele acha uma nova posição ele adiciona no ArrayList estados visitados da outra classe, sendo que ele sempre verifica se já está criado.mover(this.linha,this.coluna);}else{System.out.println("Solução!");}}// Esse método, sempre que o mover achar um movimento true, ele o usa.// Aqui eu crio um novo objeto Node, e no contrutor ele chama o método resolver() novamente para o novo estado, e assim vai, e da um looping infinito, por isso o erro.publicvoidsetFilho(inttabuleiro[][]){filho[grau]=newNode(this,tabuleiro,nivel+1);grau++;ev.estados.add(tabuleiro);}// E no main() eu instancio o primeiro objeto setando o estado inicial, e começa o "looping"...
Alguém dá um help ???
vlws abçs.
J
Jdanos
Então cara ainda fica um pouco confuso (pelo menos pra mim, que sou noao em java tbm) , mas assim ao que parece vc tem um loop infinito de criação de objetos, ou seja uma hora o Heap num vai ter mais espaço para criação de objetos (lembre-se objetos residem no Heap).
Continuando… o que parece é que existe pouca tarefa pra muito objeto, vc já tentou fazer um fluxograma antes de escrever um programa? as vezes p;arece que não mas agente perde um bocado de tempo tentando resolver este tipo de problema programando quando uma caneta, régua e papel fariam todo o trabalho, mas sei também que quando estamos querendo aprender a escrever não nos preucupamos muito com a qualidade de nossa letra.
Mas é isso ae espero ter ajudado.
Caso esteja afim, coloque o programa todo, eu posso roda-lo aqui na minha máquina e t ajudar a resolver o problema.
sergiotaborda
malstryx:
Ae…
To fazendo um algoritmo de busca por largura(puzzle 3x3). A estrutura esta montada tudo certo, só que pra cada estado novo cria um objeto novo que verifica novamente os estados possiveis, e por ai vai. Isso ta dando um erro (Exception in thread “main” java.lang.StackOverflowError), que dei uma olhada, e vi que é algo sobre quando se tem um looping infinito de objetos criados, a memória n suporta (é isso né? )…
É isso.
O seu exemplo é confuso. Primeiro vc fala que está pequisando um puzzle mas depois a sua classe chama-se Nodo ? Afinal o que vc está fazendo ?
Se o objetivo é encontrar alguma coisa na arvore e está precisando ler todos os nodos o padrão recomendado é Visitor ( aliás a variável estadosVisitados já indica que deve ser isso que vc precisa). Sem saber realmento o que vc quer - porque não entendi nem o codigo nem a aplicação, é o maximo que dá para dizer…