Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

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


Information sur la source

Description

Cliquez pour voir la capture en taille normale
Catégorie intelligence artificielle, exemple d'un algorithme génétique. Liens utiles à la compréhension dans la source
 

Conclusion

Dès fois le programme ne trouvera pas la cible avant la limite de 125 tentatives mais c'est assez rare.

Merci aux sites qui m'ont aidé.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de BruNews le 20/02/2005 23:54:27 administrateur CS

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.

signaler à un administrateur
Commentaire de neo_00110010101 le 21/02/2005 10:41:38

ok j'en tiendrais compte pour la suite.
J'avoue que c'est pas terrible "algog,n,tique.cpp"

signaler à un administrateur
Commentaire de Saros le 21/02/2005 15:03:18

Chez moi il ne se passe rien :S

signaler à un administrateur
Commentaire de neo_00110010101 le 21/02/2005 15:21:18

ah ? c'est pas mal :) rien du tout comment ça ?

signaler à un administrateur
Commentaire de Saros le 21/02/2005 16:37:12

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)

signaler à un administrateur
Commentaire de wiaeke le 21/02/2005 18:05:23

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++

signaler à un administrateur
Commentaire de wiaeke le 21/02/2005 18:05:36

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++

signaler à un administrateur
Commentaire de Kirua le 21/02/2005 18:37:28

[wiaeke, va dans la liste des auteurs pour ça]

signaler à un administrateur
Commentaire de Kirua le 21/02/2005 18:48:22

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 :)

signaler à un administrateur
Commentaire de neo_00110010101 le 21/02/2005 22:15:52

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

signaler à un administrateur
Commentaire de Kirua le 22/02/2005 16:25:36

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.

signaler à un administrateur
Commentaire de SpEeDy_Fire le 22/02/2005 23:13:30

Idem que Kirua, si tu as de la doc.. spécialement pour le perceptron en fait ;)

signaler à un administrateur
Commentaire de erazor le 23/02/2005 12:11:46

a oui moi aussi cela m'interresse ;-)

signaler à un administrateur
Commentaire de Saros le 26/02/2005 21:30:57

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.

signaler à un administrateur
Commentaire de erazor le 27/02/2005 12:02:20

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 ;-)

signaler à un administrateur
Commentaire de neo_00110010101 le 27/02/2005 12:07:30

oui voilà si vous rendez la cible plus compliquée à trouver, augmentez le nombre de tentatives sinon c'est pas la peine :)

signaler à un administrateur
Commentaire de Kirua le 27/02/2005 13:45:50

"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)

signaler à un administrateur
Commentaire de Saros le 28/02/2005 18:16:24

Comment ça utiliser la variable de condition de boucle ?
Genre ça ?
int i;
int j=20;
for(i=0 ; i<j ; i++){
j--;
}

signaler à un administrateur
Commentaire de erazor le 28/02/2005 19:21:12

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

signaler à un administrateur
Commentaire de Kirua le 28/02/2005 20:18:54

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)
...

signaler à un administrateur
Commentaire de Saros le 01/03/2005 07:11:01

if ( variablealacon >= PRGM_MAXESSAIS)
variablealacon doit pas être initialisée à -1, mais plutôt à PRGM_MAXESSAIS ou plus non ?

signaler à un administrateur
Commentaire de Kirua le 01/03/2005 16:26:13

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.

signaler à un administrateur
Commentaire de wiaeke le 02/03/2005 20:13:48

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++

signaler à un administrateur
Commentaire de MacKhdo le 01/06/2005 12:00:44

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!!

signaler à un administrateur
Commentaire de Kirua le 01/06/2005 14:15:31

réseaux neuronaux en français et neural nets en anglais, ne mélangeons pas ^^.
Merci pr l'url!

signaler à un administrateur
Commentaire de MacKhdo le 03/06/2005 10:17:02

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

signaler à un administrateur
Commentaire de Saros le 04/06/2005 14:55:32

#pragma warning (disable:4005) // empêche les erreurs warnings (futile)

#include <iostream>
#include <windows.h>
#include <math.h>
#include <string>
#include <vector>
#include <algorithm>
#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_structure> 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

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,343 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.