+#include "Population.h"
+
+#include <stdlib.h>
+#include <iostream>
+using namespace std;
+
+Population::Population()
+:taillepop(TAILLEPOP),individus(new Individu *[taillepop]),score(new int[taillepop])
+{
+ int i;
+ for (i=0 ; i<taillepop ; i++)
+ {
+ individus[i] = NULL;
+ score[i] = -1;
+ }
+}
+
+Population::Population(const Population &p)
+:taillepop(p.taillepop),individus(new Individu *[taillepop]),score(new int[taillepop])
+{
+ int i;
+ for (i=0 ; i<taillepop ; i++)
+ {
+ individus[i] = p.individus[i]->Copie();
+ score[i] = p.score[i];
+ }
+}
+
+
+Population::Population(const int &tp)
+:taillepop(tp),individus(new Individu *[taillepop]),score(new int[taillepop])
+{
+ int i;
+ for (i=0 ; i<taillepop ; i++)
+ {
+ individus[i] = NULL;
+ score[i] = -1;
+ }
+}
+
+Population::~Population()
+{
+ int i;
+ delete []score;
+ for (i=0 ; i<taillepop ; i++)
+ if (individus[i] != NULL)
+ delete individus[i];
+ delete []individus;
+}
+
+Population *Population::ReproductionParCroisement()
+{
+ int i,j;
+ Individu *pere, *mere;
+
+ //on copie la population présente afin de garantir de construire un population
+ //du même type.
+ Population *newpop = this->Copie();
+
+ //réinitialisation de la nouvelle population
+ for (i=0 ; i<newpop->taillepop ; i++)
+ {
+ if (newpop->individus[i] != NULL)
+ delete newpop->individus[i];
+ newpop->individus[i] = NULL;
+ newpop->score[i] = -1;
+ }
+
+ //création des individus
+ for (i=0 ; i<newpop->taillepop ; i++)
+ {
+ j = random() % taillepop;
+ pere = individus[j];
+ j = random() % taillepop;
+ mere = individus[j];
+ newpop->individus[i] = pere->Croiser(mere);
+ }
+
+ return newpop;
+}
+
+void Population::Mutation(const double & tauxmutation)
+{
+ int nbamuter = (int) (tauxmutation * (double)taillepop);
+ int i,j;
+ Individu *amuter;
+
+ for (i=0 ; i<nbamuter ; i++)
+ {
+ j = random() % taillepop;
+ amuter = individus[j];
+ amuter->Muter();
+ }
+}
+
+void Population::Evaluation()
+{
+ int i;
+ for (i=0 ; i<taillepop ; i++)
+ score[i] = individus[i]->Evaluation();
+}
+
+void Population::Selection(const Population *pop2)
+{
+ int selectionnes = 0;
+ int i, i1 = taillepop - 1, i2 = pop2->taillepop - 1;
+
+ //on copie la population présente afin de garantir de construire un population
+ //du même type.
+ Population *newpop = this->Copie();
+
+ //réinitialisation de la population
+ for (i=0 ; i<taillepop ; i++)
+ {
+ if (individus[i] != NULL)
+ delete individus[i];
+ individus[i] = NULL;
+ score[i] = -1;
+ }
+ //on trie les individus selon leur score
+ Trier(newpop, 0, newpop->taillepop-1);
+ Trier(pop2, 0, pop2->taillepop-1);
+ while (selectionnes < taillepop)
+ {
+ //on cherche l'élément qui a le plus gros score parmi les deux populations
+ if ((i2<0) || ((i1>=0)&&(newpop->score[i1] > pop2->score[i2])))
+ {
+ individus[selectionnes] = newpop->individus[i1]->Copie();
+ score[selectionnes] = newpop->score[i1];
+ i1--;
+ }
+ else
+ {
+ individus[selectionnes] = pop2->individus[i2]->Copie();
+ score[selectionnes] = pop2->score[i2];
+ i2--;
+ }
+ selectionnes++;
+ }
+ delete newpop;
+}
+
+void Trier(const Population*pop, const int &inf, const int &sup)
+{
+ int milieu;
+ if (sup > inf)
+ {
+ // s'il y a au moins 2 éléments
+ milieu = Partition(pop, inf,sup);
+
+ // trier la partie de gauche
+ Trier(pop, inf,milieu);
+
+ // trier la partie de droite
+ Trier(pop, milieu+1, sup);
+ }
+}
+
+int Partition(const Population *pop, const int &inf, const int &sup)
+{
+ int pivot, tempo;
+ Individu *tempind;
+ int i,j;
+
+ pivot = pop->score[(sup+inf)/2];
+ i = inf -1;
+ j = sup+1;
+
+ // tant que les index ne croisent pas
+ while (i<j)
+ {
+ // conserver les éléments plus petits ou
+ // égaux au pivot à gauche
+ do
+ {
+ i++;
+ } while (pop->score[i]<pivot);
+
+ // conserver les éléments plus grandoms ou
+ // égaux au pivot à droite
+ do
+ {
+ j--;
+ } while (pop->score[j]>pivot);
+
+ // Permuter les éléments qui ne sont pas
+ // à leur place
+ if ( i < j )
+ {
+ tempo = pop->score[i];
+ pop->score[i]= pop->score[j];
+ pop->score[j]= tempo;
+ tempind = pop->individus[i];
+ pop->individus[i]= pop->individus[j];
+ pop->individus[j]= tempind;
+ }
+ }
+ return j;
+}
+
+int Population::Meilleur() const
+{
+ int i, max, scoremax=-1;
+
+ for (i=0;i<taillepop;i++)
+ if (score[i] > scoremax)
+ {
+ max = i;
+ scoremax=score[i];
+ }
+
+ return max;
+}
+
+int Population::Taillepop() const
+{
+ return taillepop;
+}
+
+int Population::Score(const int &i) const
+{
+ return score[i];
+}
+
+Individu * Population::Ind(const int &i) const
+{
+ return individus[i];
+}
+
+void Population::SetInd(const int &i, Individu *ind)
+{
+ individus[i]=ind;
+}