Comparar valores de um array

4 respostas
J
Estou postando um novo tópico, pois não estou conseguindo editar o que antes tinha postado. Estou precisando comparar valores de uma array para ordená-lo. Tenho um array de individuos que possuem como atributos um int codigo, dois vetores: resultado e cromossomo e um int fitness. Bom, preciso colocar esses vetores em ordem pelo valor do fitness.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;


public class Equalizador {  

	public static void main(String[] args) { 


		List<Integer> espacoEstados = new ArrayList<Integer>(16); 
		int []cromossomo = new int [36];
		ArrayList<Individuo> individuos =new ArrayList <Individuo>(10);
		Individuo indi = new Individuo();
		Individuo ind = null;
		int fitness = 0;


		for(int i = 0; i<=15; i++) { 
			espacoEstados.add(i);   

		}
		int[] resultados = new int[9];  
		Random roleta = new Random();   
		for (int j= 1; j<10; j++){
			int cont = 0;
			for(int i = 0 ; i < 9; i++) {  
				resultados[i] = roleta.nextInt(espacoEstados.size());  


			}
			indi.EncontraGenotipo(cromossomo, resultados);
			fitness = indi.CalculaFitness(cromossomo);
			Individuo i = new Individuo (j, resultados, cromossomo, fitness);
			individuos.add(i);

		}



	}




}

4 Respostas

Eder_Peixoto

Boa noite!

O post da LecaDF não lhe ajudou? Qual seria a dúvida ainda?

J
JulianaSouza:
Estou postando um novo tópico, pois não estou conseguindo editar o que antes tinha postado. No tópico criado anteriormente me falaram que eu poderia utilizar o comparable. Será que não existe outra maneira de eu fazer isso. Estou precisando comparar valores de uma array para ordená-lo. Tenho um array de individuos que possuem como atributos um int codigo, dois vetores: resultado e cromossomo e um int fitness. Bom, preciso colocar esses vetores em ordem pelo valor do fitness.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;


public class Equalizador {  

	public static void main(String[] args) { 


		List<Integer> espacoEstados = new ArrayList<Integer>(16); 
		int []cromossomo = new int [36];
		ArrayList<Individuo> individuos =new ArrayList <Individuo>(10);
		Individuo indi = new Individuo();
		Individuo ind = null;
		int fitness = 0;


		for(int i = 0; i<=15; i++) { 
			espacoEstados.add(i);   

		}
		int[] resultados = new int[9];  
		Random roleta = new Random();   
		for (int j= 1; j<10; j++){
			int cont = 0;
			for(int i = 0 ; i < 9; i++) {  
				resultados[i] = roleta.nextInt(espacoEstados.size());  


			}
			indi.EncontraGenotipo(cromossomo, resultados);
			fitness = indi.CalculaFitness(cromossomo);
			Individuo i = new Individuo (j, resultados, cromossomo, fitness);
			individuos.add(i);

		}



	}




}
LecaDF

Juliana,

Você quer ordenar a lista de indivíduos ou os vetores: resultado e cromossomo de cada indivíduo?

Se você quiser ordenar a lista de indivíduos utilizando o atributo fitness, basta que a classe Individuo implemente a interface Comparable e o método compareTo esteja da seguinte forma:

public int compareTo(Individuo anotherInteger) {
  int thisVal = this.fitness;
  int anotherVal = anotherInteger.fitness;
  return (thisVal < anotherVal ? -1 : (thisVal == anotherVal ? 0 : 1));
}

A assinatura da classe Individuo fica assim:

public class Individuo implements Comparable<Individuo>

A tua classe Equalizador fica assim:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class Equalizador {

    public static void main(String[] args) {

	List<Integer> espacoEstados = new ArrayList<Integer>(16);
	int[] cromossomo = new int[36];
	ArrayList<Individuo> individuos = new ArrayList<Individuo>(10);
	Individuo indi = new Individuo();
	int fitness = 0;

	for (int i = 0; i <= 15; i++) {
	    espacoEstados.add(i);

	}
	int[] resultados = new int[9];
	Random roleta = new Random();
	for (int j = 1; j < 10; j++) {
	    for (int i = 0; i < 9; i++) {
		resultados[i] = roleta.nextInt(espacoEstados.size());
	    }
	    indi.EncontraGenotipo(cromossomo, resultados);
	    fitness = indi.CalculaFitness(cromossomo);
	    individuos.add(new Individuo(j, resultados, cromossomo, fitness));
	}
	Collections.sort(individuos);
    }
}

Sendo que o único código que adicionei foi: Collections.sort(individuos); para ordenar a lista pelo fitness do indivíduo.

ViniGodoy

A implementação do algoritmo genético é mesmo relevante para seu trabalho? Ou só a implementação do fitness e do indivíduo?

Porque, se quiser, tenho um framework completo para GAs, com diversos tipos de algoritmo de seleção, escala e mutação já implementados, tanto para Java, quanto para C++.

Chama-se SofiaIA. Até escrevi alguns artigos sobre ele:




Criado 10 de novembro de 2009
Ultima resposta 11 de nov. de 2009
Respostas 4
Participantes 4