Télécharger le zip
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.
ok j'en tiendrais compte pour la suite.J'avoue que c'est pas terrible "algog,n,tique.cpp"
Chez moi il ne se passe rien :S
ah ? c'est pas mal :) rien du tout comment ça ?
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 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 liena++
[wiaeke, va dans la liste des auteurs pour ça]
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 :)
pour wiaeke : va ici :http://www.cppfrance.com/catamembres.aspx?lettre=Nsinon 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 lolL'IA j'aime vraiment ça c'est clair ... faut que je vois et revois les reseaux neuronaux
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.
Idem que Kirua, si tu as de la doc.. spécialement pour le perceptron en fait ;)
a oui moi aussi cela m'interresse ;-)
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.htmlhttp://patrice.dargenton.free.fr/ia/ialab/perceptron.htmlwww.cmla.ens-cachan.fr/Utilisateurs/lacaille/papiers.html#Courswww.cmla.ens-cachan.fr/Utilisateurs/lacaille/papiers/rn.ps.gzVoilà...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.
j'ai fait moi aussi des test avec ton progil me semble que devcpp ne reconaissait pas come correct le fait d'utiliser apres une boucle for la variable de condition de la bouclej'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 ;-)
oui voilà si vous rendez la cible plus compliquée à trouver, augmentez le nombre de tentatives sinon c'est pas la peine :)
"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)
Comment ça utiliser la variable de condition de boucle ?Genre ça ?int i;int j=20;for(i=0 ; i<j ; i++){ j--;}
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
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 ensembleechange(population, buffer);}// PAS DE SOLUTIONif ( i >= PRGM_MAXESSAIS)...
if ( variablealacon >= PRGM_MAXESSAIS)variablealacon doit pas être initialisée à -1, mais plutôt à PRGM_MAXESSAIS ou plus non ?
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.
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++
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!!
réseaux neuronaux en français et neural nets en anglais, ne mélangeons pas ^^.Merci pr l'url!
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
#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 POPULATIONvoid 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);}// FITNESSvoid 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; }}// TRIbool 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);}// ELITISMEvoid 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; }}// MUTATIONvoid 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);}// JOINDREvoid 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 FITNESSvoid 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-0void 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
Se souvenir du profil
Mot de passe oublié ? / Activation de compteCréer un compte
1 872 876 membres 33 nouveaux aujourd'hui 16 151 membres club