IA ALGORITHME GÉNÉTIQUE SIMPLE [VISUAL C++ 6.0]

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 20 févr. 2005 à 23:54
 mmanou - 4 mai 2015 à 12:54
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/29672-ia-algorithme-genetique-simple-visual-c-6-0

Merci pour vous ça m'aide trop à comprendre bcp plus mieux comment ça fonctionne un algo génétique , le problème est que j'arrive pas à adapter ceci au problème que j'en suis demandée de faire , vous pouvez m'aider s''il vous plait ??
cs_SARAHSISI Messages postés 1 Date d'inscription vendredi 13 avril 2012 Statut Membre Dernière intervention 13 avril 2012
13 avril 2012 à 18:34
SALUT tt le monde a ce que qlq peut m'aider pour mon pfe je travail sur les algorithme génétique (traitement d'image) j'ai deja programé ma fitness mé ché pa comment je vé faire après pour l'initialisation de la population et de l'individu je travail ac c++ merci de m'aidé
Saros Messages postés 921 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 23 septembre 2010
4 juin 2005 à 14:55
#pragma warning (disable:4005) // empêche les erreurs warnings (futile)

#include
#include <windows.h>
#include <math.h>
#include <string>
#include <vector>
#include
#include <time.h>

// TAILLE DE LA POPULATION

#define PRGM_TAILLEPOPULATION 8192 // logiquement, plus il y a de membres, plus il y a de chances d'en trouver un de bon

// MAXIMUM DE POSSIBILITES (OU D'ESSAIS)
// -> il se peut qu'aucune solution ne soit trouvée alors pas la peine d'attendre

#define PRGM_MAXESSAIS 1250

// TAUX DE MUTATION

#define PRGM_TAUXMUTATION 4 // plus c'est grand, plus il y aura de chance d'avoir de "bons" membres dans chaque génération
#define PRGM_MUTATION RAND_MAX * PRGM_TAUXMUTATION

// TAUX D'ELITISME

#define PRGM_TAUXELITISME 0.10 // voir définition de "élitisme" -> le fait de ne s'occuper QUE des meilleurs : plus le chiffre
// est bas, et moins il y aura de "meilleurs" affichés (0.10 = un seul)

// LA CIBLE : la chaîne de caractère "Vive l'IA !" parmis la population (le nom d'un membre par exemple)


using namespace std;

struct prgm_structure
{
string nom;
unsigned int fitness;
// -> A chaque génération, les individus dont le fitness est le plus élevé seront sélectionnés afin de transmettre
// leur caractère génétique à leurs descendants (plus le fitness est élévé, plus les gènes correspondants sont pertinents)
};

typedef vector prgm_vecteur;

string prgm_cible;

// INITIALISATION DE LA POPULATION

void initialisation_population(prgm_vecteur &population, prgm_vecteur &buffer)
{
int taillecible = prgm_cible.size();

for (int i = 0; i < PRGM_TAILLEPOPULATION; i++)
{
prgm_structure individu;
individu.fitness = 0;
individu.nom.erase();

for (int j = 0; j < taillecible; j++)
{
individu.nom += (rand() % 90) + 32;
}

population.push_back(individu);
}

buffer.resize(PRGM_TAILLEPOPULATION);
}

// FITNESS

void calcul_fitness(prgm_vecteur &population)
{
string cible = prgm_cible;
int taillecible = cible.size();
unsigned int fitness;

for (int i = 0; i < PRGM_TAILLEPOPULATION; i++)
{
fitness = 0;
for (int j = 0; j < taillecible; j++)
{
fitness += abs(int(population[i].nom[j] - cible[j]));
}

population[i].fitness = fitness;
}
}

// TRI

bool trier_fitness(prgm_structure x, prgm_structure y)
{
return (x.fitness < y.fitness);
}

void trier_par_fitness(prgm_vecteur &population)
{
sort(population.begin(), population.end(), trier_fitness);
}

// ELITISME

void elitisme( prgm_vecteur &population, prgm_vecteur &buffer, int tailleelitisme )
{
for (int i = 0; i < tailleelitisme; i++)
{
buffer[i].nom = population[i].nom;
buffer[i].fitness = population[i].fitness;
}
}

// MUTATION

void mutation(prgm_structure &membre)
{
int taillecible = prgm_cible.size();
int c = rand() % taillecible;
int d = (rand() % 90) + 32;

membre.nom[c] = ((membre.nom[c] + d) % 122);
}

// JOINDRE

void joindre(prgm_vecteur &population, prgm_vecteur &buffer)
{
int tailleelitisme = PRGM_TAILLEPOPULATION * PRGM_TAUXELITISME;
int taillecible = prgm_cible.size(), e, iun, ideux;

elitisme(population, buffer, tailleelitisme);

for (int i = tailleelitisme; i < PRGM_TAILLEPOPULATION; i++)
{
iun = rand() % (PRGM_TAILLEPOPULATION / 2);
ideux = rand() % (PRGM_TAILLEPOPULATION / 2);
e = rand() % taillecible;

buffer[i].nom = population[iun].nom.substr(0, e) + population[ideux].nom.substr(e, tailleelitisme - e);

if (rand() < PRGM_MUTATION) mutation(buffer[i]);
}
}

// AFFICHAGE DU MEILLEUR INDIVIDU : SON NOM ET SON FITNESS

void affiche_meilleur(prgm_vecteur &vecalgogenetique)
{
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
HANDLE HCmd = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(HCmd, &csbiInfo);
SetConsoleTextAttribute(HCmd, FOREGROUND_BLUE|FOREGROUND_INTENSITY);
cout << "Le meilleur : " << flush;
SetConsoleTextAttribute(HCmd, FOREGROUND_GREEN);
cout << vecalgogenetique[0].nom << flush;
SetConsoleTextAttribute(HCmd, FOREGROUND_RED|FOREGROUND_INTENSITY);
cout << " [" << vecalgogenetique[0].fitness << "]" << endl;
}

// CROSSOVER
// -> Echanger les gènes des individus deux à deux pour créer les enfants
// exemple :
// individu 5 : 1-1-0|-0-1-1-1-0
// individu 1 : 0-1-1|-1-0-0-1-1
//
// va donner :
//
// enfant 1 : 1-1-0|-1-0-0-1-1
// enfant 2 : 0-1-1|-0-1-1-1-0

void echange(prgm_vecteur *&population, prgm_vecteur *&buffer)
{
prgm_vecteur *temp population; population buffer; buffer = temp;
}

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

char strTmp[256];

scanf("%s",&strTmp);

prgm_cible = strTmp;

prgm_vecteur population_a, population_b;
prgm_vecteur *population, *buffer;

initialisation_population(population_a, population_b);
population = &population_a;
buffer = &population_b;

for (int i = 0; i < PRGM_MAXESSAIS; i++)// de 0 à 125 :
{
calcul_fitness(*population);
trier_par_fitness(*population);
affiche_meilleur(*population);

if ((*population)[0].fitness == 0) break;// si le fitness d'un membre = 0, c'est qu'il n'y a pas de meilleur individu et
// donc, que c'est la cible

joindre(*population, *buffer);// joindre la population ensemble
echange(population, buffer);
}

// PAS DE SOLUTION

if ( i >= PRGM_MAXESSAIS)
{
HANDLE HCmd = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(HCmd, FOREGROUND_RED|FOREGROUND_INTENSITY);
cout << "Aucune solution trouv\202e, maximum d'essais d\202pass\202 ..." << endl;
SetConsoleTextAttribute(HCmd, FOREGROUND_GREEN);
system("pause");
return 0;
}

// SOLUTION TROUVEE !

HANDLE HCmd = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(HCmd, FOREGROUND_GREEN|FOREGROUND_INTENSITY);
cout << "Cible trouv\202e !" << endl;
SetConsoleTextAttribute(HCmd, FOREGROUND_GREEN);
system("pause");
return 0;
}



Sauf que ça ne prend que le premier mot (ça s'arrête au premier signe espace ' ').... Je sais pas trop comment fonctionne la classe string
MacKhdo Messages postés 4 Date d'inscription dimanche 24 avril 2005 Statut Membre Dernière intervention 3 juin 2005
3 juin 2005 à 10:17
ok c vrai mais g trouver plus de docs avec "réseaux neural" que reseau neuronaux. sinon si quelqu'un pourrait me donner la modif a faire au prog de neo pour saisir la chaine de caracteres a trouver pendant l'execution cela m'interesse...merci d'avance
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
1 juin 2005 à 14:15
réseaux neuronaux en français et neural nets en anglais, ne mélangeons pas ^^.
Merci pr l'url!
MacKhdo Messages postés 4 Date d'inscription dimanche 24 avril 2005 Statut Membre Dernière intervention 3 juin 2005
1 juin 2005 à 12:00
pour la documentation sur les reseaux neurals et des source c++ d'un perceptron multicouche allez ici http://www.sylbarth.com/
c franchement un super site pour comprendre, les RN c'est trop puissant!!
wiaeke Messages postés 38 Date d'inscription mercredi 14 janvier 2004 Statut Membre Dernière intervention 9 avril 2005
2 mars 2005 à 20:13
Merci mais j'ai pas encore visiteer
salut kirua tu peut aller consulter mon jeu de devinette que j'avais fait .je l'ai compiler avec dev-cpp et ca marche et c'est tres bien il gere les blemes de plantages entrée une lettre au lieu de variables et tous ca c'est tres bien fait et j'en suis fier tu vois il ya meme un jeu que j'ai fait avec allegro lui c'est pas tres bon pour la sante
c'est pas difficile de consulter mes codes sources tu viens tu clique sur wiaeke
a++
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
1 mars 2005 à 16:26
mais de tte façon ça ne sert à rien de la déclarer cette variable, avec i ça suffit, faut juste changer sa portée, comme dans le code que je propose.
Saros Messages postés 921 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 23 septembre 2010
1 mars 2005 à 07:11
if ( variablealacon >= PRGM_MAXESSAIS)
variablealacon doit pas être initialisée à -1, mais plutôt à PRGM_MAXESSAIS ou plus non ?
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
28 févr. 2005 à 20:18
tu dois initialiser ta variable à la con (-1 par exemple).

en fait, j'aurais fait comme ça:

for (int i = 0; i < PRGM_MAXESSAIS; i++)// de 0 à 125 :
{
//...
if ((*population)->fitness == 0)
break;

joindre(*population, *buffer);// joindre la population ensemble
echange(population, buffer);
}

// PAS DE SOLUTION

if ( i >= PRGM_MAXESSAIS)
...
cs_erazor Messages postés 85 Date d'inscription jeudi 7 février 2002 Statut Membre Dernière intervention 8 février 2007
28 févr. 2005 à 19:21
voila mes modifs:

int variablealacon;
for (int i = 0; i < PRGM_MAXESSAIS; i++)// de 0 à 125 :
{
calcul_fitness(*population);
trier_par_fitness(*population);
affiche_meilleur(*population);

if ((*population)[0].fitness == 0){variablealacon=i; break;}// si le fitness d'un membre = 0, c'est qu'il n'y a pas de meilleur individu et
// donc, que c'est la cible

joindre(*population, *buffer);// joindre la population ensemble
echange(population, buffer);
}

// PAS DE SOLUTION

if ( variablealacon >= PRGM_MAXESSAIS)
{
HANDLE HCmd = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(HCmd, FOREGROUND_RED|FOREGROUND_INTENSITY);
cout << "Aucune solution trouv\202e, maximum d'essais d\202pass\202 ..." << endl;
SetConsoleTextAttribute(HCmd, FOREGROUND_GREEN);
system("pause");
return 0;
}

avant le prog testai la variable definie dans la boucle for, ce qui n'est pas ansi me semble t'il
Saros Messages postés 921 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 23 septembre 2010
28 févr. 2005 à 18:16
Comment ça utiliser la variable de condition de boucle ?
Genre ça ?
int i;
int j=20;
for(i=0 ; i<j ; i++){
j--;
}
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
27 févr. 2005 à 13:45
"il me semble que devcpp ne reconaissait pas come correct le fait d'utiliser apres une boucle for la variable de condition de la boucle"

Ben normal, c'est VC6 qui est pas standard! GCC applique la norme, tout simplement (et c'est heureux)
neo_00110010101 Messages postés 360 Date d'inscription samedi 27 septembre 2003 Statut Membre Dernière intervention 30 mai 2006
27 févr. 2005 à 12:07
oui voilà si vous rendez la cible plus compliquée à trouver, augmentez le nombre de tentatives sinon c'est pas la peine :)
cs_erazor Messages postés 85 Date d'inscription jeudi 7 février 2002 Statut Membre Dernière intervention 8 février 2007
27 févr. 2005 à 12:02
j'ai fait moi aussi des test avec ton prog
il me semble que devcpp ne reconaissait pas come correct le fait d'utiliser apres une boucle for la variable de condition de la boucle

j'ai fait des tests en augmentant le nombre d'entites au depart a 65536 et le nombre d'essai a 65536 et il m'a trouvé la reponse a tout les coups ;-)
Saros Messages postés 921 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 23 septembre 2010
26 févr. 2005 à 21:30
Quelqu'un a fait un programme assez interressant sur le perceptron en Visual Basic. Dans les commentaires, il y a tout plein de liens.
http://patrice.dargenton.free.fr/ia/ialab/rnautoconfigurant.html
http://patrice.dargenton.free.fr/ia/ialab/perceptron.html
www.cmla.ens-cachan.fr/Utilisateurs/lacaille/papiers.html#Cours
www.cmla.ens-cachan.fr/Utilisateurs/lacaille/papiers/rn.ps.gz
Voilà...
Finalement il marche chez moi ton prog, j'ai tenté avec une chaîne un peu longue genre 100 caractères, le rendement est pas génial, j'ai jamais réussi à atteindre la cible :) ça bloque pas très loin du résultat.
cs_erazor Messages postés 85 Date d'inscription jeudi 7 février 2002 Statut Membre Dernière intervention 8 février 2007
23 févr. 2005 à 12:11
a oui moi aussi cela m'interresse ;-)
SpEeDy_Fire Messages postés 25 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 16 avril 2008
22 févr. 2005 à 23:13
Idem que Kirua, si tu as de la doc.. spécialement pour le perceptron en fait ;)
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
22 févr. 2005 à 16:25
Si tu as de la doc potable sur les réseaux neuronaux (je veux dire: accessibles et directement applicables) en français ou en anglais, ça m'intéresse bcp! J'ai vu et lu qq codes, lu des articles etc: mais ça suffit pas, j'ai pas eu de document vrmnt convainquant / utile.
neo_00110010101 Messages postés 360 Date d'inscription samedi 27 septembre 2003 Statut Membre Dernière intervention 30 mai 2006
21 févr. 2005 à 22:15
pour wiaeke : va ici :
http://www.cppfrance.com/catamembres.aspx?lettre=N

sinon fais aussi une recherche de casse-briques tu trouveras peut-être la source recherchée.
Mon frère ne programme pas lol :)

pour kirua : ouf ! ça faisait longtemps que j'avais pas posté et que je t'avais pas vu puisque je venais rarement ici ... je vais voir ce que tu m'as dit plus tard lol

L'IA j'aime vraiment ça c'est clair ... faut que je vois et revois les reseaux neuronaux
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
21 févr. 2005 à 18:48
Dans l'initialisation:

for (int j = 0; j < taillecible; j++)
{
individu.nom += (rand() % 90) + 32;
}

C'est très lent ça! Il vaut mieux allouer directement une tableau de char de la taille de la cible et modifier ses caractères via l'opérateur []. Ensuite, tu affectes ce tableau à la string: c'est bcp plus rapide.

bool trier_fitness(prgm_structure x, prgm_structure y)
{
return (x.fitness < y.fitness);
}

utilise des références constantes, ça t'évite la copie des éléments à chaque appel: bcp plus rapide.

#define PRGM_CIBLE string("Vive l'IA !")

chaque fois que tu utilises PRGM_CIBLE, tu reconstruis l'objet Vive l'IA ! ce qui est inutilement lent. préfère ceci:

const string PRGM_CIBLE = "Vive l'IA !";

qui crée une fois pour toutes un objet statique constant.

Autre chose: en C++, on inclut:

<ctime>
<cmath>

et pas

<time.h>
<math.h>

parce que ces en-têtes ont été réécrits pour le langage C++.


Voilà voilà, à part ça: merci pour cette source, c'est agréable de voir des algos d'IA :)
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
21 févr. 2005 à 18:37
[wiaeke, va dans la liste des auteurs pour ça]
wiaeke Messages postés 38 Date d'inscription mercredi 14 janvier 2004 Statut Membre Dernière intervention 9 avril 2005
21 févr. 2005 à 18:05
neo je crois qu'i existe quelqu'un qui s'appelle encore neo sur cppfrance on drait ton frere ou est il passe sinon j'ai besoin de son casse bique en c++ ou si qqun
pouvait me donner le lien
a++
wiaeke Messages postés 38 Date d'inscription mercredi 14 janvier 2004 Statut Membre Dernière intervention 9 avril 2005
21 févr. 2005 à 18:05
neo je crois qu'i existe quelqu'un qui s'appelle encore neo sur cppfrance on drait ton frere ou est il passe sinon j'ai besoin de son casse bique en c++ ou si qqun
pouvait me donner le lien
a++
Saros Messages postés 921 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 23 septembre 2010
21 févr. 2005 à 16:37
Bah je lance le programme, et il n'y a rien qui se passe :) comme si je devais entrer une chaîne, sauf que si je le fais, j'obtiens une erreur Windows (le programme doit fermer bla bla)
neo_00110010101 Messages postés 360 Date d'inscription samedi 27 septembre 2003 Statut Membre Dernière intervention 30 mai 2006
21 févr. 2005 à 15:21
ah ? c'est pas mal :) rien du tout comment ça ?
Saros Messages postés 921 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 23 septembre 2010
21 févr. 2005 à 15:03
Chez moi il ne se passe rien :S
neo_00110010101 Messages postés 360 Date d'inscription samedi 27 septembre 2003 Statut Membre Dernière intervention 30 mai 2006
21 févr. 2005 à 10:41
ok j'en tiendrais compte pour la suite.
J'avoue que c'est pas terrible "algog,n,tique.cpp"
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 févr. 2005 à 23:54
Salut,

si tu pouvais éviter les caractères accentués la prochaine fois dans les noms de fichiers, ça nous permettrait de visualiser le contenu sans par force télécharger le zip,
merci.
Rejoignez-nous