quelque lignes directives pour implémenter l'algorithme génétique

Page 1 sur 2 1, 2  Suivant

Voir le sujet précédent Voir le sujet suivant Aller en bas

quelque lignes directives pour implémenter l'algorithme génétique

Message  nouveau-programmeur le Jeu 26 Mar 2009 - 0:39

Bonjour,

Au cours du cours de l'optimisation. Nous avons vu l'algorithme génétique comme méthode pour résoudre quelque problèmes NPdifficile.Je voudrais implémenter cet l'algorithme en c pour résoudre l'exemple suivant :
Code:
Max A=2x+3y
sous contrainte: 5x+y<=12

pourriez vous me donner quelques directives? comment je peux démarrer?
L'algorithme génétique est le suivant :
Code:
{
Initialisation(population)

    // C'est la génération d'un ensemble de solutions
    // -> création de chaine de bits au hasard

Faire pour un certain nombre de générations

    Evaluation (population ou solution)

        // pour chaque individu
        // -> appel de decode - > donne un p-uplet
        // -> appel de valuation -> donne un réel

    Creation (population vide)

        // juste une population sans individu

    Faire pour le nombre d'individus / 2 de la population

          1. Choisir en fonction de l'adaptation (fonction objectif) deux individus parents.
          2. Choisir au hasard un niveau de crossover(probabilité de croisement =0.7), mélanger et croiser les génomes pour obtenir deux enfants.
          3. Muter les deux individus enfants au hasard en changeant un petit nombre de bits(probabilité de mutation=0.2).
          4. Ajouter ces individus à la nouvelle population.

    Fin pour

Fin pour
}

Merci pour votre aide

nouveau-programmeur
Bavard
Bavard

Messages : 30
Date d'inscription : 23/02/2009

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: quelque lignes directives pour implémenter l'algorithme génétique

Message  nouveau-programmeur le Sam 28 Mar 2009 - 22:19

Il n ' y a pas quelqu'un pour m'aider?

nouveau-programmeur
Bavard
Bavard

Messages : 30
Date d'inscription : 23/02/2009

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: quelque lignes directives pour implémenter l'algorithme génétique

Message  -ed- le Lun 30 Mar 2009 - 13:16

nouveau-programmeur a écrit:Il n ' y a pas quelqu'un pour m'aider?
Tu en connais certainement plus que moi sur les 'algorithmes génétiques' ...

L'algo à l'air assez clair. Quels sont les points sur lesquels tu bloques ?

Pour faire un tirage pseudo-aléatoire :

http://mapage.noos.fr/emdel/notes.htm#rand

_________________
C is a sharp tool !

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: quelque lignes directives pour implémenter l'algorithme génétique

Message  nouveau-programmeur le Lun 30 Mar 2009 - 14:06

-ed- a écrit:
nouveau-programmeur a écrit:Il n ' y a pas quelqu'un pour m'aider?
Tu en connais certainement plus que moi sur les 'algorithmes génétiques' ...

L'algo à l'air assez clair. Quels sont les points sur lesquels tu bloques ?

Pour faire un tirage pseudo-aléatoire :

http://mapage.noos.fr/emdel/notes.htm#rand

En fait, je n'ai pas compris comment générer la population initiale? quelle fonction utiliser pour créer les chromosomes et les coder?
Merci

nouveau-programmeur
Bavard
Bavard

Messages : 30
Date d'inscription : 23/02/2009

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: quelque lignes directives pour implémenter l'algorithme génétique

Message  -ed- le Lun 30 Mar 2009 - 19:28

nouveau-programmeur a écrit:En fait, je n'ai pas compris comment générer la population initiale? quelle fonction utiliser pour créer les chromosomes et les coder?
C'est ça :
création de chaine de bits au hasard
qui te pose problème ?

Un tableau de char ou d'int composés d'éléments valant 0 ou 1.

Il faut en déterminer la taille (c'est toi qui le sais).

Ensuite, on rempli ce tableau avec une suite de 0 et de 1 tirés au 'hasard' selon la méthode indiquée dans l'article pré-cité. Fait de ton mieux et poste ton code.

_________________
C is a sharp tool !

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

incompréhension de code

Message  potter le Mar 9 Juin 2009 - 20:29

bonjour,

Je remonte ce post car je voudrais m'entrainer à implémenter l'algorithme génétique que j'aurais utilisé dans mon pfe.
J'ai trouvé le code de cet algorithme en c. Mon souci que je n'ai pas compris ce code et je pose une tas de questions: peut-on éviter les variables globales, si oui comment ? Je ne vois pas ni fonction ni autre dans le programme ! Est ce qu'on peut optimiser le programme et le rendre plus clair et donc facile à comprendre ?
Toute aide sera appréciée.
Merci

P.S. Je compte sur vous -ed- surtout que votre méthode d'apprentissage me parait très pertinente.


Dernière édition par -ed- le Mar 9 Juin 2009 - 20:33, édité 1 fois (Raison : typos, mise en page...)

potter
Bavard
Bavard

Messages : 18
Date d'inscription : 24/11/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: quelque lignes directives pour implémenter l'algorithme génétique

Message  -ed- le Mar 9 Juin 2009 - 20:43

potter a écrit:je voudrais m'entrainer à implémenter l'algorithme génétique que j'aurais utilisé dans mon pfe.
J'ai trouvé le code de cet algorithme en c.
Horrible :
Code:


-------------- Build: Debug in hello ---------------

Compiling: main.c
Linking console executable: bin\\Debug\\hello.exe
C:\\dev\\hello\\main.c:46:1: warning: "INFINITY" redefined
In file included from C:\\dev\\hello\\main.c:43:
C:/Program Files/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/math.h:295:1: warning: this is the location of the previous definition
C:\\dev\\hello\\main.c:80: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c:81: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c:82: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c:83: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c:84: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c:85: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c:86: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c:140: warning: return type defaults to `int'
C:\\dev\\hello\\main.c:140: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c: In function `input_parameters':
C:\\dev\\hello\\main.c:160: warning: implicit declaration of function `ignore_comment'
C:\\dev\\hello\\main.c:169: warning: implicit declaration of function `exit'
C:\\dev\\hello\\main.c:297: warning: implicit declaration of function `input_app_parameters'
C:\\dev\\hello\\main.c:298: warning: control reaches end of non-void function
C:\\dev\\hello\\main.c: At top level:
C:\\dev\\hello\\main.c:303: warning: return type defaults to `int'
C:\\dev\\hello\\main.c:303: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c: In function `ignore_comment':
C:\\dev\\hello\\main.c:304: warning: `return' with no value, in function returning non-void
C:\\dev\\hello\\main.c:309: warning: control reaches end of non-void function
C:\\dev\\hello\\main.c: At top level:
C:\\dev\\hello\\main.c:314: warning: return type defaults to `int'
C:\\dev\\hello\\main.c:314: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c: In function `initialize':
C:\\dev\\hello\\main.c:320: warning: implicit declaration of function `randomize'
C:\\dev\\hello\\main.c:321: warning: implicit declaration of function `app_initialize'
C:\\dev\\hello\\main.c:322: warning: implicit declaration of function `malloc'
C:\\dev\\hello\\main.c:324: warning: implicit declaration of function `nomemory'
C:\\dev\\hello\\main.c:359: warning: implicit declaration of function `flip'
C:\\dev\\hello\\main.c:366: warning: implicit declaration of function `copy_individual'
C:\\dev\\hello\\main.c:367: warning: implicit declaration of function `decode_string'
C:\\dev\\hello\\main.c:316: warning: unused variable `i'
C:\\dev\\hello\\main.c:317: warning: unused variable `temp'
C:\\dev\\hello\\main.c:317: warning: unused variable `coef'
C:\\dev\\hello\\main.c:370: warning: control reaches end of non-void function
C:\\dev\\hello\\main.c: At top level:
C:\\dev\\hello\\main.c:377: warning: return type defaults to `int'
C:\\dev\\hello\\main.c:377: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c: In function `decode_string':
C:\\dev\\hello\\main.c:382: warning: implicit declaration of function `error_ptr_null'
C:\\dev\\hello\\main.c:387: warning: implicit declaration of function `decodevalue'
C:\\dev\\hello\\main.c:394: warning: implicit declaration of function `free'
C:\\dev\\hello\\main.c:396: warning: control reaches end of non-void function
C:\\dev\\hello\\main.c: At top level:
C:\\dev\\hello\\main.c:401: warning: return type defaults to `int'
C:\\dev\\hello\\main.c:401: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c:411: warning: return type defaults to `int'
C:\\dev\\hello\\main.c:411: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c:421: warning: return type defaults to `int'
C:\\dev\\hello\\main.c:421: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c: In function `copy_individual':
C:\\dev\\hello\\main.c:436: warning: control reaches end of non-void function
C:\\dev\\hello\\main.c: At top level:
C:\\dev\\hello\\main.c:441: warning: return type defaults to `int'
C:\\dev\\hello\\main.c:441: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c: In function `statistics':
C:\\dev\\hello\\main.c:446: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c:489: warning: implicit declaration of function `app_statistics'
C:\\dev\\hello\\main.c:445: warning: unused variable `f'
C:\\dev\\hello\\main.c:446: warning: unused variable `bitpow'
C:\\dev\\hello\\main.c:446: warning: unused variable `coef'
C:\\dev\\hello\\main.c:446: warning: unused variable `temp'
C:\\dev\\hello\\main.c:490: warning: control reaches end of non-void function
C:\\dev\\hello\\main.c: At top level:
C:\\dev\\hello\\main.c:497: warning: return type defaults to `int'
C:\\dev\\hello\\main.c:497: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c: In function `decodevalue':
C:\\dev\\hello\\main.c:501: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c:503: warning: `return' with no value, in function returning non-void
C:\\dev\\hello\\main.c:527: warning: control reaches end of non-void function
C:\\dev\\hello\\main.c: At top level:
C:\\dev\\hello\\main.c:532: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c:557: warning: return type defaults to `int'
C:\\dev\\hello\\main.c:557: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c: In function `generate_new_pop':
C:\\dev\\hello\\main.c:560: warning: implicit declaration of function `app_computation'
C:\\dev\\hello\\main.c:563: warning: implicit declaration of function `preselect_tour'
C:\\dev\\hello\\main.c:564: warning: implicit declaration of function `preselect_rw'
C:\\dev\\hello\\main.c:565: warning: implicit declaration of function `preselect_sr'
C:\\dev\\hello\\main.c:571: warning: implicit declaration of function `tour_select'
C:\\dev\\hello\\main.c:572: warning: implicit declaration of function `rw_select'
C:\\dev\\hello\\main.c:573: warning: implicit declaration of function `sr_select'
C:\\dev\\hello\\main.c:577: warning: implicit declaration of function `cross_over_1_site'
C:\\dev\\hello\\main.c:578: warning: implicit declaration of function `cross_over_unif'
C:\\dev\\hello\\main.c:579: warning: implicit declaration of function `cross_over_line'
C:\\dev\\hello\\main.c:581: warning: implicit declaration of function `mutation'
C:\\dev\\hello\\main.c:586: warning: control reaches end of non-void function
C:\\dev\\hello\\main.c:558: warning: 'mate1' might be used uninitialized in this function
C:\\dev\\hello\\main.c:558: warning: 'mate2' might be used uninitialized in this function
C:\\dev\\hello\\main.c: At top level:
C:\\dev\\hello\\main.c:592: warning: return type defaults to `int'
C:\\dev\\hello\\main.c:592: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c: In function `binary_xover':
C:\\dev\\hello\\main.c:598: warning: `return' with no value, in function returning non-void
C:\\dev\\hello\\main.c:604: warning: implicit declaration of function `rnd'
C:\\dev\\hello\\main.c:607: warning: comparison between signed and unsigned
C:\\dev\\hello\\main.c:612: warning: comparison between signed and unsigned
C:\\dev\\hello\\main.c:612: warning: comparison between signed and unsigned
C:\\dev\\hello\\main.c:615: warning: comparison between signed and unsigned
C:\\dev\\hello\\main.c:630: warning: control reaches end of non-void function
C:\\dev\\hello\\main.c: At top level:
C:\\dev\\hello\\main.c:637: warning: return type defaults to `int'
C:\\dev\\hello\\main.c:637: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c: In function `create_children':
C:\\dev\\hello\\main.c:640: warning: unused variable `u'
C:\\dev\\hello\\main.c:665: warning: control reaches end of non-void function
C:\\dev\\hello\\main.c: At top level:
C:\\dev\\hello\\main.c:673: warning: return type defaults to `int'
C:\\dev\\hello\\main.c:673: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c: In function `cross_over_1_site':
C:\\dev\\hello\\main.c:719: warning: control reaches end of non-void function
C:\\dev\\hello\\main.c: At top level:
C:\\dev\\hello\\main.c:727: warning: return type defaults to `int'
C:\\dev\\hello\\main.c:727: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c: In function `cross_over_unif':
C:\\dev\\hello\\main.c:729: warning: unused variable `difference'
C:\\dev\\hello\\main.c:729: warning: unused variable `x_mean'
C:\\dev\\hello\\main.c:729: warning: unused variable `beta'
C:\\dev\\hello\\main.c:773: warning: control reaches end of non-void function
C:\\dev\\hello\\main.c: At top level:
C:\\dev\\hello\\main.c:781: warning: return type defaults to `int'
C:\\dev\\hello\\main.c:781: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c: In function `cross_over_line':
C:\\dev\\hello\\main.c:847: warning: control reaches end of non-void function
C:\\dev\\hello\\main.c: At top level:
C:\\dev\\hello\\main.c:856: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c:873: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c:893: warning: return type defaults to `int'
C:\\dev\\hello\\main.c:893: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c: In function `binmutation':
C:\\dev\\hello\\main.c:899: warning: `return' with no value, in function returning non-void
C:\\dev\\hello\\main.c:917: warning: control reaches end of non-void function
C:\\dev\\hello\\main.c: At top level:
C:\\dev\\hello\\main.c:925: warning: return type defaults to `int'
C:\\dev\\hello\\main.c:925: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c: In function `mutation':
C:\\dev\\hello\\main.c:935: warning: `return' with no value, in function returning non-void
C:\\dev\\hello\\main.c:928: warning: unused variable `k'
C:\\dev\\hello\\main.c:959: warning: control reaches end of non-void function
C:\\dev\\hello\\main.c: At top level:
C:\\dev\\hello\\main.c:965: warning: return type defaults to `int'
C:\\dev\\hello\\main.c:965: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c: In function `initreport':
C:\\dev\\hello\\main.c:989: warning: conversion lacks type at end of format
C:\\dev\\hello\\main.c:1023: warning: implicit declaration of function `app_initreport'
C:\\dev\\hello\\main.c:1024: warning: control reaches end of non-void function
C:\\dev\\hello\\main.c: At top level:
C:\\dev\\hello\\main.c:1031: warning: return type defaults to `int'
C:\\dev\\hello\\main.c:1031: warning: function declaration isn't a prototype
C:\\dev\\hello\\main.c: In function `writechrom':
C:\\dev\\hello\\main.c:1038: warning: `return' with no value, in function returning non-void
C:\\dev\\hello\\main.c:1061: warning: control reaches end of non-void function
<...>
Output size is 62.98 KB
Process terminated with status 0 (0 minutes, 5 seconds)
0 errors, 233 warnings
233 warnings !

Le mieux à faire est d'écrire son code, et non de pomper le code des autres, surtout si il est si mal codé...

Mon souci que je n'ai pas compris ce code et je pose une tas de
questions: peut-on éviter les variables globales,
Oui.
si oui comment ?
Par exemple, en les définissant 'locales' (ou automatiques) et en utilisant des structures, des pointeurs ....
Je
ne vois pas ni fonction ni autre dans le programme !
Oui, c'est du code C ancien (pré-ANSI) avec une manière bien horrible de coder les fonctions ...
Est ce qu'on peut
optimiser le programme et le rendre plus clair et donc facile à
comprendre ?
Optimiser est autre chose qui n'a rien à voir ici. Réorganiser, oui, sans doute, mais c'est un travail long et difficile. Il faut être certain d'avoir compris de quoi il s'agit. En général, une fois qu'on a compris, on préfère refaire de 0...

Ce que je devrais pouvoir faire rapidement, c'est éliminer les 235 warnings proprement...

Avec ceci :

http://www.bien-programmer.fr/forum/potter/

Il reste
Code:


-------------- Build: Debug in hello ---------------

Compiling: random.c
Compiling: main.c
Linking console executable: bin\Debug\hello.exe
C:\dev\hello\main.c: In function `binary_xover':
C:\dev\hello\main.c:978: warning: comparison between signed and unsigned
C:\dev\hello\main.c:983: warning: comparison between signed and unsigned
C:\dev\hello\main.c:983: warning: comparison between signed and unsigned
C:\dev\hello\main.c:986: warning: comparison between signed and unsigned
C:\dev\hello\main.c: In function `create_children':
C:\dev\hello\main.c:1073: warning: will never be executed
C:\dev\hello\main.c: In function `cross_over_line':
C:\dev\hello\main.c:1262: warning: will never be executed
C:\dev\hello\main.c: In function `generate_new_pop':
C:\dev\hello\main.c:1399: warning: 'mate1' might be used uninitialized in this function
C:\dev\hello\main.c:1399: warning: 'mate2' might be used uninitialized in this function
Output size is 63.08 KB
Process terminated with status 0 (0 minutes, 1 seconds)
0 errors, 8 warnings

_________________
C is a sharp tool !

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: quelque lignes directives pour implémenter l'algorithme génétique

Message  potter le Mer 10 Juin 2009 - 13:42

Bonjour,

Merci beaucoup -ed- pour votre réponse.
Justement, je trouve ce code bizarre.
Je vais essayer d'écrire un code personnel.
Je compte sur votre aide.
Je reviendrai pour poster mon code.
A+

potter
Bavard
Bavard

Messages : 18
Date d'inscription : 24/11/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: quelque lignes directives pour implémenter l'algorithme génétique

Message  potter le Dim 14 Juin 2009 - 20:20

Salut,
voilà Je suis de retour.
Bon, j'ai commencé à coder l'algorithme génétique pour maximiser la fonction y= - ( x^ 2 ) +5

Première étape, codage des chromosomes(solutions) en binaire. Par exemple pour x=10, code en binaire 1010.
J'ai opté de facon que le chromosome est composé de 6 cases et une autre case pour la valeur fitness(on a besoin après pour évaluer le meilleur chromosome).J'ai déclaré l'identificateur chromosome comme étant le nom d'un type de structure composé de deux membres, dont le premier est un tableau de 20 entiers nommé bit et le second est un entier nommé fitness.

Voilà le code :
Code:

typedef struct Chromosome           
  {
    short int bit[6];
      int fitness;
  }chromosome; 

on suppose que la population initiale est composée de 4 chromosomes. Ensuite, remplissage du champ bit par des valeurs aléatoires entre 0 et 1.
Code:
                     

struct chromosome pop_initial[4];
{
 int i,j;
  int random;
for(j=0;j<4;j++)
  {
        for(i=0;i<6;i++)

        {
            random=rand();
            random=(random%2);
            pop_initial[j].bit[i]=random;

        printf("\n%d",j,pop_initial[j].bit[5],pop_initial[j].bit[4],pop_initial[j].bit[3],pop_initial[j].bit[2],pop_initial[j].bit[1],pop_initial[j].bit[0],value,pop_initial[j].fit);

      }

}
Pourriez vous corriger mes erreurs SVP?
Merci d'avance.
A+

potter
Bavard
Bavard

Messages : 18
Date d'inscription : 24/11/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: quelque lignes directives pour implémenter l'algorithme génétique

Message  -ed- le Dim 14 Juin 2009 - 20:31

potter a écrit:Salut,
Code:
                     
struct chromosome pop_initial[4];
{
 
Ceci n'est pas du C. Tu cherches à faire quoi exactement ?
ceci ?

Code:
                     
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NB_BIT 6

typedef struct
{
  short int bit[6];
  int fitness;
}
chromosome;

void affichage (chromosome const tab[4], int n)
{
  int i;
  for (i = 0; i < n; i  )
  {
      int j;
      for (j = 0; j < NB_BIT; j  )
      {
        printf ("M", tab[i].bit[j]);
      }
      printf ("\n");
  }
}

void pop_initial (chromosome tab[4], int n)
{
  int i;
  for (i = 0; i < n; i  )
  {
      int j;
      for (j = 0; j < NB_BIT; j  )
      {
        tab[i].bit[j] = rand () % 2;
      }
  }
}

int main (void)
{
  chromosome tab[4];
  srand ((unsigned) time (NULL));

  pop_initial (tab, 4);
  affichage (tab, 4);

  return 0;
}
ce qui donne, par exemple
Code:

  0  0  1  1  0  1
  1  0  0  0  1  1
  1  0  1  0  1  1
  1  1  1  0  0  0

Process returned 0 (0x0)  execution time : 0.047 s
Press any key to continue.


Dernière édition par -ed- le Lun 15 Juin 2009 - 15:32, édité 2 fois

_________________
C is a sharp tool !

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: quelque lignes directives pour implémenter l'algorithme génétique

Message  potter le Dim 14 Juin 2009 - 22:28

Bonsoir,
Merci pour cette réponse.

-ed- a écrit:
potter a écrit:Salut,
Code:
                     
struct chromosome pop_initial[4];
{
 
Ceci n'est pas du C. Tu cherches à faire quoi exactement ?
ceci ?
Je veux dire par ça population_initial représente un ''objet'' de
type "tableau de 4 éléments du type chromosome".
-ed- a écrit:

Code:
                     
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NB_BIT 6

typedef struct
{
  short int bit[6];
  int fitness;
}
chromosome;

void affichage (chromosome const tab[4], int n)
{
  int i;
  for (i = 0; i < n; i++)
  {
      int j;
      for (j = 0; j < NB_BIT; j++)
      {
        printf ("%4d", tab[i].bit[j]);
      }
      printf ("\n");
  }
}

void pop_initial (chromosome tab[4], int n)
{
  int i;
  for (i = 0; i < n; i++)
  {
      int j;
      for (j = 0; j < NB_BIT; j++)
      {
        tab[i].bit[j] = rand () % 2;
      }
  }
}

int main (void)
{
  chromosome tab[4];
  srand ((unsigned) time (NULL));

  pop_initial (tab, 4);
  affichage (tab, 4);

  return 0;
}
ce qui donne, par exemple
Code:

  0  0  1  1  0  1
  1  0  0  0  1  1
  1  0  1  0  1  1
  1  1  1  0  0  0

Process returned 0 (0x0)  execution time : 0.047 s
Press any key to continue.
ça m'a paru intéressant. Je ne l'ai pas pensé à ça..
Merci -ed- pour votre aide
Dans l'attente de poster mon prochain code.
A+


Dernière édition par -ed- le Lun 15 Juin 2009 - 15:50, édité 2 fois (Raison : 'postuler' ? évitons le charabia...)

potter
Bavard
Bavard

Messages : 18
Date d'inscription : 24/11/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: quelque lignes directives pour implémenter l'algorithme génétique

Message  potter le Lun 15 Juin 2009 - 14:54

Bonjour,

Voici le code des fonctions : la première retourne la valeur réel de x(solution binaire) et la deuxième calcule la valeur de la fonction objectif(y=-(x*x)+5) pour chaque x(chromosome).
Je ne suis pas sûr de la deuxième fonction. J'aimerais que vous m'aidez à faire.
Merci d'avance.

Code:

int x(chromosome tab[4])
{
int z;
for(i=0;i<4;i++)
z=1*(tab[i].bit[0])+2*(tab[i].bit[1])+4*(tab[i].bit[2])+8*(tab[i].bit[3])+16*(tab[i]).bit[4]);
}
return z;
2 fonction:
Code:

int y(int x, chromosome tab[4])
{
y=-(x*x)+5;
printf("la valeur de la fonction objectif est :%d",y);
for(i=0;i<4;i++)
tab[i].fitness=y;
}
return(tab[i].fitness);/* retourner le champ fitness dans le modèle chromosome*/

}
programme principal
Code:

int main()
{
int value, f;
value=x(chromosome tab[4]);
f=y(int x, chromosome tab[4]);
printf("%d",value);
printf("%d",f);
}

potter
Bavard
Bavard

Messages : 18
Date d'inscription : 24/11/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: quelque lignes directives pour implémenter l'algorithme génétique

Message  -ed- le Lun 15 Juin 2009 - 15:13

potter a écrit:Voici le code des fonctions : la première retourne la valeur réel de x(solution binaire) et la deuxième calcule la valeur de la fonction objectif(y=-(x*x)+5) pour chaque x(chromosome).
Je ne suis pas sûr de la deuxième fonction. J'aimerais que vous m'aidez à faire.
Ce serait bien que le code posté soit compilable... (manque des '{' '}', des variables locales .., une ')' en trop etc.)
Code:

int y (int x, chromosome tab[4])
{
  y = -(x * x) + 5;
Exclamation En C, le nom de la fonction n'est pas la 'variable de retour', comme en Pascal. Il faut différencier les usages. D'une part, on a une fonction :
Code:

int fonction (int x, chromosome tab[4])
{
ensuite, on a une variable locale 'y' :
Code:
int y = y = -(x * x) + 5;
dont on peu éventuellement retourner la valeur :
Code:

  return y;
}
ceci compile :
Code:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NB_BIT 6

typedef struct
{
  short int bit[6];
  int fitness;
}
chromosome;

int chro_x (chromosome tab[], int n)
{
  int z = 0;
  int i;                      /* -ed- */
  for (i = 0; i < n; i++)
  {                            /* -ed- */
      z = 1 * (tab[i].bit[0]) + 2 * (tab[i].bit[1]) + 4 * (tab[i].bit[2]) +
        8 * (tab[i].bit[3]) + 16 * (tab[i] /*  ) -ed- */ .bit[4]);
  }
  return z;
}                              /* -ed- */

int chro_y (int x, chromosome tab[], int n) /* -ed- */
{
  int y = -(x * x) + 5;        /* -ed- */
  int i;                      /* -ed- */
  printf ("la valeur de la fonction objectif est :%d\n", y); /* -ed- */
  for (i = 0; i < n; i++)
  {                            /* -ed- */
      tab[i].fitness = y;
  }
  return tab[i].fitness;      /* retourner le champ fitness dans le modèle chromosome */
}

void affichage (chromosome const tab[], int n)
{
  int i;
  for (i = 0; i < n; i++)
  {
      int j;
      for (j = 0; j < NB_BIT; j++)
      {
        printf ("%4d", tab[i].bit[j]);
      }
      printf ("\n");
  }
}

void pop_initial (chromosome tab[], int n)
{
  int i;
  for (i = 0; i < n; i++)
  {
      int j;
      for (j = 0; j < NB_BIT; j++)
      {
        tab[i].bit[j] = rand () % 2;
      }
  }
}

int main (void)                /* -ed- */
{
  chromosome tab[4];

  srand ((unsigned) time (NULL));

  pop_initial (tab, 4);
  affichage (tab, 4);

  {
      int x = chro_x (tab, 4);
      int y = chro_y (x, tab, 4);
      printf ("X = %d\n", x);
      printf ("Y = %d\n", y);
  }
  return 0;
}
La fonction chro_x() est étrange. Tu combines les 6 bits en une variable. OK. Mais tu écrases cette variable à chaque tour. En définitive, seule la dernière valeur est retournée. Les autres sont perdues...

Que veux-tu faire exactement ? En absence de spécifications, je ne peux détecter que les erreurs de codage...

_________________
C is a sharp tool !

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: quelque lignes directives pour implémenter l'algorithme génétique

Message  potter le Lun 15 Juin 2009 - 18:21

resalut,
Voilà un exemple :
supposons que : la population initiale est composée de 4 chromosomes (généré aléatoirement) où chaque chromosome correspond à une chaine de 5 bits
-codage des solutions:
chromosomescontenu
110: 01011
213: 11100
320: 01010
422: 00010
-calcul de fitness
chromosomescontenufitness
110: 01011-95
213: 11100-164
320: 01010-395
422: 00010-479
En fait, je cherche à faire une fonction qui permet d'évaluer chaque chromosome(z=1*(tab[i].bit[0])+2*(tab[i].bit[1])+4*(tab[i].bit[2])+8*(tab[i].bit[3])+16*(tab[i]).bit[4]);), une autre pour convertir les valeurs de x (codées en binaires) à des entiers pour pouvoir calculer leurs fitness(fonction chro_y).puis le mettre dans le champ correspondant(tab[i].fitness). Avez vous une idée pour ça ? Merci

raison de modification : précision

potter
Bavard
Bavard

Messages : 18
Date d'inscription : 24/11/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: quelque lignes directives pour implémenter l'algorithme génétique

Message  potter le Mar 16 Juin 2009 - 13:17

En faite, je suis débutant en la matière si quelqu'un est intéressé peut m'aider!
Où êtes vous -ed-?
J'attends votre aide Crying or Very sad

potter
Bavard
Bavard

Messages : 18
Date d'inscription : 24/11/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: quelque lignes directives pour implémenter l'algorithme génétique

Message  -ed- le Mar 16 Juin 2009 - 15:04

potter a écrit:En faite, je suis débutant en la matière si quelqu'un est intéressé peut m'aider!
Où êtes vous -ed-?
J'attends votre aide Crying or Very sad
Je ne suis pas disponible 100% du temps, désolé...

_________________
C is a sharp tool !

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: quelque lignes directives pour implémenter l'algorithme génétique

Message  -ed- le Mar 16 Juin 2009 - 15:14

potter a écrit:resalut,
Voilà un exemple :
supposons que : la population initiale est composée de 4 chromosomes (généré aléatoirement) où chaque chromosome correspond à une chaine de 5 bits
Si il y a 5 bits, pourquoi un tableau de 6 éléments ? Quel est le bit de poids fort ? Et pourquoi des bits ? Un tirage aléatoire d'une valeur comprise entre 0 (0x00 ou 00000) et 31 (0x1F ou 11111) aurait suffit, non ?

_________________
C is a sharp tool !

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: quelque lignes directives pour implémenter l'algorithme génétique

Message  potter le Mar 16 Juin 2009 - 15:18

-ed- a écrit:
potter a écrit:En faite, je suis débutant en la matière si quelqu'un est intéressé peut m'aider!
Où êtes vous -ed-?
J'attends votre aide Crying or Very sad
Je ne suis pas disponible 100% du temps, désolé...

Je vois...
Mais votre aide est précieuse.

potter
Bavard
Bavard

Messages : 18
Date d'inscription : 24/11/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: quelque lignes directives pour implémenter l'algorithme génétique

Message  potter le Mar 16 Juin 2009 - 15:30

-ed- a écrit:
potter a écrit:resalut,
Voilà un exemple :
supposons que : la population initiale est composée de 4 chromosomes (généré aléatoirement) où chaque chromosome correspond à une chaine de 5 bits
Si il y a 5 bits, pourquoi un tableau de 6 éléments ? Quel est le bit de poids fort ? Et pourquoi des bits ? Un tirage aléatoire d'une valeur comprise entre 0 (0x00 ou 00000) et 31 (0x1F ou 11111) aurait suffit, non ?

Pour votre 1 ère interrogation :
dans la 6 ème case, il sera stocké la fitness.
Quel est le bit de poids fort ?
pour convertir les vateurs binaires en entiers.
Et pourquoi des bits ? Un tirage aléatoire d'une valeur comprise entre 0 (0x00 ou 00000) et 31 (0x1F ou 11111) aurait suffit, non ??
Dans les algorithmes génétiques, on commence avec une population de base qui se compose le plus souvent de chaînes de caractères correspondant chacune à un chromosome.

Le contenu de cette population initiale est généré aléatoirement.Pour les algorithmes génétiques, un des facteurs les plus importants est la façon dont sont codées les solutions (ce que l'on a nommé ici les chromosomes), c'est-à-dire les structures de données qui coderont les gènes.

Codage binaire est certainement le plus utilisé car il présente plusieurs avantages. Son principe est de coder la solution selon une chaîne de bits (qui peuvent prendre les valeurs 0 ou 1).

potter
Bavard
Bavard

Messages : 18
Date d'inscription : 24/11/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: quelque lignes directives pour implémenter l'algorithme génétique

Message  -ed- le Mar 16 Juin 2009 - 15:45

potter a écrit:
-ed- a écrit:
potter a écrit:resalut,
Voilà un exemple :
supposons que : la population initiale est composée de 4 chromosomes (généré aléatoirement) où chaque chromosome correspond à une chaine de 5 bits
Si il y a 5 bits, pourquoi un tableau de 6 éléments ? Quel est le bit de poids fort ? Et pourquoi des bits ? Un tirage aléatoire d'une valeur comprise entre 0 (0x00 ou 00000) et 31 (0x1F ou 11111) aurait suffit, non ?

Pour votre 1 ère interrogation :
dans la 6 ème case, il sera stocké la fitness.
'fitness', dans le sens de 'compatibilité', c'est ça ?

Pourquoi pas un champ fitness dans la structure ?
D'ailleurs, si j'en crois le code précédent, c'est ce qui est prévu :

Code:
typedef struct
{
  short int bit[6];
  int fitness;
}
chromosome;

Quel est le bit de poids fort ?
pour convertir les vateurs binaires en entiers.
Et pourquoi des bits ? Un tirage aléatoire d'une valeur comprise entre 0 (0x00 ou 00000) et 31 (0x1F ou 11111) aurait suffit, non ??
Dans les algorithmes génétiques, on commence avec une population de base qui se compose le plus souvent de chaînes de caractères correspondant chacune à un chromosome.

Le contenu de cette population initiale est généré aléatoirement.Pour les algorithmes génétiques, un des facteurs les plus importants est la façon dont sont codées les solutions (ce que l'on a nommé ici les chromosomes), c'est-à-dire les structures de données qui coderont les gènes.

Codage binaire est certainement le plus utilisé car il présente plusieurs avantages. Son principe est de coder la solution selon une chaîne de bits (qui peuvent prendre les valeurs 0 ou 1).
Mais une valeur numérique est une chaine de bits (la représentation interne est binaire). La seule difficulté est la représentation textuelle au format binaire, car il n'y a pas de formateur 'binaire' pour printf().

Mais c'est pas bien difficile...
Code:

void print_bin5(unsigned x)
{
  unsigned m = 1 << 5;
  while (m != 0)
  {
      putchar ('0' + !! (m & x));
      m >>= 1;
  }
}
http://www.bien-programmer.fr/bits.htm

Bref, cette structure devrait suffire :
Code:

typedef struct
{
  unsigned bit;
  int fitness;
}
chromosome;
Comme ça, par exemple :
Code:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NB_BIT 5

typedef struct
{
  unsigned bit;
}
chromosome;

void print_bin5 (unsigned x)
{
  unsigned m = 1 << NB_BIT;
  while (m != 0)
  {
      putchar ('0' + !!(m & x));
      m >>= 1;
  }
}

int chro_x (chromosome tab[], int n)
{
  int x = 0;
  int i;
  for (i = 0; i < n; i++)
  {
      x += tab[i].bit;
  }

  return x;
}

int chro_y (int x)
{
  int y = -(x * x) + 5;

  return y;
}

void affichage (chromosome const tab[], int n)
{
  int i;
  for (i = 0; i < n; i++)
  {
      print_bin5 (tab[i].bit);
      printf ("\n");
  }
}

void pop_initial (chromosome tab[], int n)
{
  int i;
  for (i = 0; i < n; i++)
  {
      int j;
      for (j = 0; j < NB_BIT; j++)
      {
        tab[i].bit = rand () % (1 << (NB_BIT + 1));
      }
  }
}

int main (void)                /* -ed- */
{
  chromosome tab[4];

  srand ((unsigned) time (NULL));

  pop_initial (tab, 4);
  affichage (tab, 4);

  {
      int x = chro_x (tab, 4);
      int y = chro_y (x);
      printf ("X = %d\n", x);
      printf ("Y = %d\n", y);
  }
  return 0;
}

_________________
C is a sharp tool !

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: quelque lignes directives pour implémenter l'algorithme génétique

Message  potter le Mar 16 Juin 2009 - 17:09

Merci pour cette réponse.

J'ai fait ceci et je souhaiterais que vous m'aider à corriger mes erreurs.
Merci d'avance.
Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NB_BIT 5
typedef struct
{
  short int bit;
  int fitness;
}
chromosome;

void affichage (chromosome const tab[], int n)
{
  int i;
  for (i = 0; i < n; i++)
  {
      printf ("%d",tab[i].bit);
      printf ("\n");
  }
}

void pop_initial (chromosome tab[], int n)
{
  int i, value;
  for (i = 0; i < n; i++)
  {
      int j;
      for (j = 0; j < NB_BIT; j++)
      {
        tab[i].bit = rand () % 2;

    value=chro_x(tab[i]);
    tab[i].fitness=chro_y(chro_x(tab[i]));
    printf("%d", tab[i].bit[5],tab[i].bit[4],tab[i].bit[3],tab[j].bit[2],tab[j].bit[1],tab[i].bit[0],value,tab[j].fit);   
  }
}
int chro_x(chromosome tab)
{
 int x, i;

  x=(1*tab.bit[0])+(2*tab.bit[1])+(4*tab.bit[2])+(8*tab.bit[3])+(16*tab.bit[4]);


return x;


}

int chro_y (int chro_x)
{
  int x;
 
  int y = -(x * x) + 5;
  return y;
}


int main (void)                /* -ed- */
{
  int x, y;
chromosome tab[4];
  pop_initial (tab, 4);
  affichage (tab, 4);
  int x = chro_x (chromosome tab);
  int y = chro_y ( chro_x);
     
  }
  return 0;
}

potter
Bavard
Bavard

Messages : 18
Date d'inscription : 24/11/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: quelque lignes directives pour implémenter l'algorithme génétique

Message  -ed- le Mar 16 Juin 2009 - 18:07

potter a écrit:Merci pour cette réponse.

J'ai fait ceci et je souhaiterais que vous m'aider à corriger mes erreurs.
Encore une fois tant que je ne sais pas ce que tu veux faire, je me contente de rendre le code compilable. Mais pour moi, il n'a aucun sens...

Je ne sais pas ce qu'est un 'algorithme génétique'...
Code:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NB_BIT 5
typedef struct
{
  short int bit[NB_BIT];
  int fitness;
}
chromosome;

void affichage (chromosome const tab[], int n)
{
  int i;
  for (i = 0; i < n; i++)
  {
      int j;
      for (j = 0; j < NB_BIT; j++)
      {
        printf ("%d", tab[i].bit[NB_BIT - 1 - j]);
      }
      printf ("%8d\n", tab[i].fitness);
  }
}

int chro_x (chromosome * p)
{
  int x;

  x = (1 * p->bit[0])
      + (2 * p->bit[1])
      + (4 * p->bit[2]) + (8 * p->bit[3]) + (16 * p->bit[4]);

  return x;

}

int chro_y (int x)
{
  int y = -(x * x) + 5;
  return y;
}

void pop_initial (chromosome tab[], int n)
{
  int i, value;
  for (i = 0; i < n; i++)
  {
      int j;
      for (j = 0; j < NB_BIT; j++)
      {
        tab[i].bit[j] = rand () % 2;

        value = chro_x (tab + i);
        tab[i].fitness = chro_y (chro_x (tab + i));
      }
  }
}                              /* -ed- */

int main (void)                /* -ed- */
{
  chromosome tab[4];

  srand ((unsigned) time (NULL));
  pop_initial (tab, 4);
  affichage (tab, 4);

  return 0;
}
Il faut absolument préciser ta pensée, c'est à dire définir clairement ce que tu veux faire et cesser de coder au hasard... Tu as 99.99999999999999999999999999999999999999999999999999999999% de chances de tomber à coté...

Un code n'apparait pas spontanément par magie en partant de rien. C'est le résultat d'une démarche qui comprend au moins 2 étapes :
1 - La définition du but à atteindre et du comportement attendu (spécifications).
2 - la recherche des moyens d'atteindre ce but (conception).

Ce n'est qu'une fois que ces deux étapes ont été parfaitement documentées, que l'on peut passer au codage. Pas avant...


Dernière édition par -ed- le Mar 16 Juin 2009 - 18:12, édité 1 fois (Raison : complément)

_________________
C is a sharp tool !

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: quelque lignes directives pour implémenter l'algorithme génétique

Message  potter le Mar 16 Juin 2009 - 19:21

Merci -ed- pour le temps que vous consacrez pour m'aider.
Un grand merci pour vous.

Bah ca à l'air de marcher le dernier code.
Normalement, si tout fonctionne, je dois avoir ça
D'où l'erreur provient-elle?
P.S.Je m'excuse pour mes erreurs et mon ignorance.


Dernière édition par potter le Ven 19 Juin 2009 - 0:38, édité 1 fois

potter
Bavard
Bavard

Messages : 18
Date d'inscription : 24/11/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: quelque lignes directives pour implémenter l'algorithme génétique

Message  -ed- le Mer 17 Juin 2009 - 12:36

potter a écrit:Merci -ed- pour le temps que vous consacrez pour m'aider.
Un grand merci pour vous.

Bah ca à l'air de marcher le dernier code.
Normalement, si tout fonctionne, je dois avoir ça
D'où l'erreur provient-elle?
P.S.Je m'excuse pour mes erreurs et mon ignorance.
Il ne suffit pas montrer ce qu'on veut obtenir. Il faut être capable de le formuler par un texte descriptif (spécification ou définition). Une machine ne fait que ce qu'on lui dit de faire, encore faut-il pouvoir exprimer clairement ses intentions.

Je te demande donc une nouvelle fois d'expliquer ce que tu veux faire (et pour le moment, je ne veux pas savoir comment).
.
J'ai compris qu'il fallait commencer par créer une sequence de 4 'gènes' composés de 5 bits tirés au hasard. OK

Par contre, je n'ai pas compris ce qu'était 'fitness', x, y, ni les calculs qui doivent être faits (à qui, pourquoi ....)

_________________
C is a sharp tool !

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: quelque lignes directives pour implémenter l'algorithme génétique

Message  potter le Mer 17 Juin 2009 - 14:07

Bonjour,

Je vous remercie pour le temps que vous me consacrez pour m'aider.

Le problème d'optimisation est la minimisation de y=- ( x^ 2 ) +5).
Le premier pas dans l'implantation des algorithmes génétiques est de créer aléatoirement une population d'individus initiaux(les chromosomes, les x ici). Par analogie avec la biologie, chaque individu de la population est codé par un chromosome ou génotype . Une population est donc un ensemble de chromosomes. Chaque chromosome code un point de l'espace de recherche.
chaque entier xi est codéiçi à l'aide de 5 bits (00000). Par exemple, la chaîne:

01111( de valeur 16) 11111(de valeur 10) 00001(de valeur 11) 11110(de valeur 5)

La fonction fitness (Y=-x²+5) est une fonction qui permet d'évaluer chaque chromosome. Pour calculer le fitness d'un individu, il faut décoder la chaîne de bits(la fonction chro_x) afin d'y retrouver la solution potentielle.
code les valeurs x0 = 16, x1 = 10, x2 = 11, x3 = 5.

potter
Bavard
Bavard

Messages : 18
Date d'inscription : 24/11/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: quelque lignes directives pour implémenter l'algorithme génétique

Message  Contenu sponsorisé Aujourd'hui à 15:26


Contenu sponsorisé


Revenir en haut Aller en bas

Page 1 sur 2 1, 2  Suivant

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum