Essai d'algorythme genetique (dev c++ 4)

Soyez le premier à donner votre avis sur cette source.

Vue 4 096 fois - Téléchargée 314 fois

Description

c'est un essai.les algos genetique s'inspirent de l'evolution decouverte par darwin.ici,l'ordi 'aprend' a jouer au jeu ou il ne faut pas prendre le dernier baton tout en enlevant a chaque tour.il tire une combinaison aleatoire pour le pere,puis la recrit avec de petites modifications.anssuite,le meilleur des fils devient pere et ainssi de suitte. C un systeme tres puissant qui permet de faire des miracles en robotique autonome mais la ca marche pas tres bien.
c'est possible que ca ne marche pas sur certaines machines (notament a cause de system("cls") qui est je pensse specifique a dev C++).

je debute, donc vos commentaires sont les bienvenus! merci.... :-)

Source / Exemple :


#include <iostream.h>
#include <stdlib.h>
#include <time.h>
#include <conio.c>
#include <conio.h>

void affiche(int combine[14][6])
{

for(int y=0;y<=5;y++)
      {
      for(int x=1;x<=13;x++)
             {
             gotoxy(x+1,y+2);
             cout<<combine[x][y];
             }
      }

}

int match(int combine[14][6],int J1,int J2)
{
int battons=13;
for(;;)
     {
     battons=battons-combine[battons][J1];
     if(battons<=0)
          return J2;
     battons=battons-combine[battons][J2];
     if(battons<=0)
          return J1;
     }
}

int main()
{
srand (time(NULL));

int combine[14][6]={0},score[6]={0},meilleur,temp;

       //donne un code aleatoire au père
for(int x=1;x<=13;x++)
        {
        combine[x][0]=rand()%3+1;
        }
        debut:

cout<<"combien de generations attendre? (ou 0 pour quitter et -1 pour jouer)";
cin>>temp;
if(temp==0)
return 0;

if(temp==-1)
     {
     for(int battons =13,enleve;;)
          {
          system("cls");
          cout<<"il reste "<<battons<<" a enlever.\n";
          cout<<"combien de battons enlever? (1-2-3)";
          cin>>enleve;
          battons=battons-enleve;
          if(battons<=0)
               {
               cout<<"perdu";
               getch();
               goto debut;
               }
          battons=battons-combine[battons][0];
          if(battons<=0)
               {
               cout<<"gagne";
               getch();
               goto debut;
               }
          }

     }
system("cls");
for(int z=1;z<=temp;z++)
{

       //fixe les codes des "fils" avec 1% de chance de decalage.
for(int y=1;y<=5;y++)
        {
        for(int x=1;x<=13;x++)
                {                                                     
                if(rand()%20==1)
                        {
                        if(rand()%10<=5)
                               {
                               combine[x][y]=combine[x][0]+1;
                               }
                               else
                               {
                               combine[x][y]=combine[x][0]-1;
                               }
                        if(combine[x][y]==0)
                             {combine[x][y]=1;}
                        if(combine[x][y]==4)
                             {combine[x][y]=3;}
                        }
                        else
                        combine[x][y]=combine[x][0];

                }
        }
      //affiche les codes du "pere" et des 5 "fils"
for(int y=0;y<=5;y++)
      {
      for(int x=1;x<=13;x++)
             {
             gotoxy(x+1,y+2);
             cout<<combine[x][y];
             }
      }

       // reinitialisation de la matrice des scores.
for(int x=0;x<=5;x++)
     {score[x]=0;}
     //deroulement des matchs
score[match(combine,1,2)]++;
score[match(combine,2,1)]++;
score[match(combine,1,3)]++;
score[match(combine,3,1)]++;
score[match(combine,1,4)]++;
score[match(combine,4,1)]++;
score[match(combine,1,5)]++;
score[match(combine,5,1)]++;

score[match(combine,2,3)]++;
score[match(combine,3,2)]++;
score[match(combine,2,4)]++;
score[match(combine,4,2)]++;
score[match(combine,2,5)]++;
score[match(combine,5,2)]++;

score[match(combine,3,4)]++;
score[match(combine,4,3)]++;
score[match(combine,3,5)]++;
score[match(combine,5,3)]++;

score[match(combine,4,5)]++;
score[match(combine,5,4)]++;

         //affichage des scores.
for(int x=1;x<=5;x++)
{
gotoxy(16,x+2);
cout<<score[x];
}

for(int x=1,y=0;x<=5;x++)
     {
     if(score[x] >= y)
     {
     meilleur=x;
     y=score[x];
     }
     }

cout<<" "<<meilleur;

for(int x=1;x<=13;x++)
    {
    combine[x][0]=combine[x][meilleur];
    }

}
goto debut;
}

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cmarsc
Messages postés
455
Date d'inscription
mercredi 6 mars 2002
Statut
Membre
Dernière intervention
18 décembre 2003
-
system est dans <stdlib.h> c'est une librairie STANDARD alors il ne posera aucun problème
return ; pour les fonctions de type void et return UNE_VALEUR; pour les autres.
tes goto(s) sont assez délicats un return peut parfois être plus adapté

pour rand()%3+1; il faut mettre des parenthèses pour fixer l'ordre de opération par ex : (rand()%3) +1;
zanidip
Messages postés
76
Date d'inscription
lundi 30 septembre 2002
Statut
Membre
Dernière intervention
25 mars 2007
-
ok ok.par contre,rand()3+1 me donne bien une valeur entre 1 et 3 donc les parenthese ne sont pas necesaires(je pensse)
cmarsc
Messages postés
455
Date d'inscription
mercredi 6 mars 2002
Statut
Membre
Dernière intervention
18 décembre 2003
-
en effet, c'est plus pour la lisibilité du code
cs_pepet
Messages postés
34
Date d'inscription
lundi 11 mars 2002
Statut
Membre
Dernière intervention
21 janvier 2003
-
G l'impression que tu as oublié la reproduction dans ton algo. Je pense kil faudrai creer plusieur parents et les faire ce reproduire entre eux et non creer seulement des mutations dun meme pere. Je croi ke tu aurai de bien meilleur resulatat de cette facon.
Pour choisir qui doit ce reproduire, un petit radom coeficienté ( le plus apte pourra aura plus de chance de se reproduire que le dernier! )
et pour les mutation pareille.
zanidip
Messages postés
76
Date d'inscription
lundi 30 septembre 2002
Statut
Membre
Dernière intervention
25 mars 2007
-
ouais c'est pas con.our les mutation je comprend pas.certain devrais avoir plus de chance de ce reproduire?

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.