IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Problème de tri


Sujet :

avec Java

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    En recherche d’emploi
    Inscrit en
    Février 2014
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : En recherche d’emploi

    Informations forums :
    Inscription : Février 2014
    Messages : 62
    Points : 36
    Points
    36
    Par défaut Problème de tri
    Bonjour,

    J'essaye d'implémenter un algo génétique mais j'ai un problème avec Collections.sort

    Il me trie bien mes individus mais une seule fois, je ne comprends pas.

    Voilà mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    public class Population {
    	private List<Individu> pop = new ArrayList<Individu>();
            ....
     
    	// CONSTRUCTOR
    	public Population(int taille, int nbIteration){
    		this.nbIteration = nbIteration;
    		for(int i=0; i<taille; i++){
    				pop.add(new Individu());
    		}	
    	} // Fin constructor
     
    // ALGORITHME GENETIQUE
    	public void  algo_genetique(){
     
    		List<Individu> mutants = new ArrayList<Individu>();
    		List<Individu> meilleurs = new ArrayList<Individu>();
     
    		int k = 0;
    		while(k < nbIteration){
     
    			for(int i=0; i<pop.size(); i++){
    				pop.get(i).getFitness();
    			}
     
    			Collections.sort(pop);
     
    			// Garde les N Meilleurs individuis selon leur rang (indice 0 étant le meilleur)
    			meilleurs =  meilleursIndividus(pourcentage);
     
    			// Mutation
    			mutants = mutation(meilleurs, tauxMutation);
    			for(int i=0; i<mutants.size(); i++){
    				meilleurs.add(mutants.get(i));
    			}
    			System.out.println("\nGeneration: " + k + " competence: " + meilleurs.get(0).getFitness() +"\n");
    			pop = meilleurs;
    			k++;
    		}
    	}

    et l'implementation de comparator
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    public class Individu implements Cloneable, Comparable<Individu>{
     
    	// Intervalle de solutions
    	private int valMin = -25;
    	private int valMax = 25;
    	private double fitness = -1;
    	private int[] genotype = new int[25];
     
     
    	// Constructeur1
    	public Individu(){
    		for(int i=0; i<25; i++){
    			int elt  = (int)(Math.random() * ((valMax - valMin) + 1) + valMin );
    			this.genotype[i] = elt;
    		}
    	}
     
    	// Constructeur Copie
    	public Individu clone() throws CloneNotSupportedException{
    		Individu copie = (Individu)super.clone();
    		copie.genotype = new int[genotype.length];
    		System.arraycopy(genotype, 0, copie.genotype, 0 , genotype.length);
    		return copie;
    	}
     
    	// Methodes
    	public int compareTo(Individu ind) {
    		double fit1 = ((Individu) ind).getFitness(); 
    	    double fit2 = this.getFitness(); 
    	    if (fit1 > fit2)  return -1; 
    	    else if(fit1 == fit2) return 0; 
    	    else return 1;
    	}
     
     
    	public double getFitness() {
    		if(this.fitness == -1)	{
    			this.fitness = Competence.getFitness(this); 
    			System.out.println("Calcul fitness de l'individu : ");
    			this.afficheIndividu();
    			System.out.println("Calcul fitness => " + this.fitness);
    		}
    		//System.out.println("retourne fitness ");
    		return this.fitness;
    	}
    }
    Quelqu'un pourrait m'aider à trouver ce qui cloche.

    Merci.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Ah ben getFitness() c'est le truc que tu appelles dans compareTo() pour comparer deux Individus l'un à l'autre...

    Ce serait bien que pendant que tu fais le tri, getFitness() ne s'amuse pas à changer les données avec this.fitness = Competence.getFitness(this);, forcément -_-°.

    De manière générale, quand une méthode s'appelle getQuelqueChose() ce serait intelligent qu'elle n'assigne rien à rien. Elle est là pour lire et c'est tout.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    En recherche d’emploi
    Inscrit en
    Février 2014
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : En recherche d’emploi

    Informations forums :
    Inscription : Février 2014
    Messages : 62
    Points : 36
    Points
    36
    Par défaut
    Dans ce cas je le mets dans le constructeur comme ceci?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    // Constructeur1
    	public Individu(){
    		for(int i=0; i<25; i++){
    			int elt  = (int)(Math.random() * ((valMax - valMin) + 1) + valMin );
    			this.genotype[i] = elt;
    		}
                    fitness = Competence.fitnessIndividu(this);
    	}
    // Methodes
    	public int compareTo(Individu ind) {
    		double fit1 = ((Individu) ind).getFitness(); 
    	    double fit2 = this.getFitness(); 
    	    if (fit1 > fit2)  return -1; 
    	    else if(fit1 == fit2) return 0; 
    	    else return 1;
    	}
     
    public double getFitness() {
        return fitness;
    }
    De cette manière, l'individu aura un tableau et son fitness, et lorsque je ferai le tri selon son fitness, les données ne seront pas modifiées puisque dans getFitness
    lors de l'appel dans compareTo la méthodes renvoie juste le fitness de l'individu en question et ne modifie rien.

Discussions similaires

  1. [MySQL] Problème de tri
    Par pounie dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 22/10/2005, 13h09
  2. Problème de tri avec analyse croisée
    Par drthodt dans le forum Access
    Réponses: 2
    Dernier message: 18/10/2005, 16h23
  3. [TToolBar] Problème de tri
    Par titiyo dans le forum Composants VCL
    Réponses: 6
    Dernier message: 01/09/2004, 09h21
  4. [Collections] Problème de tri
    Par feti2004 dans le forum Collection et Stream
    Réponses: 16
    Dernier message: 03/08/2004, 16h45
  5. problème de tri et optimisatiopn
    Par psyco2604 dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 13/05/2004, 10h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo