Referência incorreta!

1 resposta
L
Gente, estou tentando resolver o problema da mochila com Algortimo Genetico, e pra isso, eu tenho uma classe Objeto, com as caracteristicas dos mesmos, e outra classe Mochila, que possui um Vector desses objetos. Cada objeto que for escolhido para ser carregado passa a ter um campo com o valor 1, e o restante valor 0. Acontece que, eu também tenho um ArrayList> que é uma população, com as 10 soluções escolhidas, e neste array, chamado "populacao", eu insiro os vetores de objetos, cada um com uma sequencia de 0 e 1 diferentes. Só que após inserí-los, eu imprimo o ArrayList, e só imprime (10 vezes) o último Vector inserido, alguém me ajuda?
package problemamochila;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.Vector;

public class Mochila {

    private double carga;
    private Vector<Objeto> objetos_disponiveis; 
    private ArrayList<Vector<Objeto>> populacao;

    public Mochila(double carga, Vector<Objeto> objetos_disponiveis) {
        setCarga(carga);
        populacao = new ArrayList<Vector<Objeto>>();
        this.objetos_disponiveis = objetos_disponiveis; // Pego de um arquivo os objetos com suas informações e salvo nesse Vector, no main, e jogo pro dessa classe.
    }

    public Mochila() {

    }

    public void Zera() {
        for (int i = 0; i < objetos_disponiveis.size(); i++) {
            objetos_disponiveis.get(i).setUsado(0); // Pra deixar todos como não usados.
        }
    }

    public double somaCarga() {
        double sum = 0;

        for (int i = 0; i < objetos_disponiveis.size(); i++) {
            if (objetos_disponiveis.get(i).getUsado() == 1) {
                sum = sum + objetos_disponiveis.get(i).getPeso();
            }
        }
        return sum;
    }

    public void metodoRandomico() {
        while (populacao.size() < 10) { 
            int cont = 0;

            Random r = new Random();
            Zera();

            while (true) {
                i = r.nextInt(objetos_disponiveis.size());
                if (getCarga() >= somaCarga() + objetos_disponiveis.get(i).getPeso()) {
                    objetos_disponiveis.get(i).setUsado(1);
                    cont = 0;
                } else {
                    cont++;
                    if (cont > 10) {
                        break;
                    }
                }
            }
            populacao.add(objetos_disponiveis);
            System.out.print("\nsizeX: " + populacao.size() + "|"); // Aqui e na linha debaixo é só pra imprimir as soluções diferentes geradas.
            
            print2(); 
        }

        for (int i = 0; i < populacao.size(); i++) { //Aqui imprime o Array preenchido, mas só sai com o último Vector inserido.
            System.out.print("\nsizeZ: " + i + "|");
            for (int j = 0; j < populacao.get(i).size(); j++) {
                System.out.print(" " + populacao.get(i).get(j).getUsado());
            }
        }

    }

    public void print2() {

        for (int j = 0; j < objetos_disponiveis.size(); j++) {
            System.out.print(" " + objetos_disponiveis.get(j).getUsado());
        }
    }

    public int getTamanhoPopulação() {
        return populacao.size();
    }


    public void printObjetosEscolhidos() {
        for (int i = 0; i < objetos_disponiveis.size(); i++) {
            if (objetos_disponiveis.get(i).getUsado() == 1) {
                objetos_disponiveis.get(i).print();
            }
        }
    }


    public double getBeneficio(int indice) {
        double beneficio_total = 0;
        for (int j = 0; j < populacao.get(indice).size(); j++) {
            if (populacao.get(indice).get(j).getUsado() == 1) {
                beneficio_total = beneficio_total + populacao.get(indice).get(j).getBeneficio();
            }
        }

        return beneficio_total;

    }

    public Vector<Objeto> getObjeto(int indice) {

        return populacao.get(indice);

    }

    public void printVetorSolucao() {
        for (int i = 0; i < populacao.size(); i++) {
            System.out.print("\nsize: " + i + "|");
            for (int j = 0; j < populacao.get(i).size(); j++) {
                System.out.print(" " + populacao.get(i).get(j).getUsado());
            }
        }
    }

    public void setCarga(double carga) {
        this.carga = carga;
    }

    public double getCarga() {
        return carga;
    }

    public void print() {
        System.out.println("\nCarga Total: " + somaCarga() + "\nVetor solução: ");
        printVetorSolucao();

    }
}

Alguém me salva?

1 Resposta

regis_hideki

Veja essa linha:

populacao.add(objetos_disponiveis);

Você adiciona objetos_disponiveis (em Java, a boa prática é usar camel case), mas ele só é criado uma única vez no construtor.

Cada vez que adiciona na população, você precisa passar um objeto diferente. Seja dando new, clone, etc.

Criado 1 de dezembro de 2013
Ultima resposta 3 de dez. de 2013
Respostas 1
Participantes 2