IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Implémentation algorithme colonie de fourmis


Sujet :

C++

  1. #1
    Candidat au Club Avatar de midotunez
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Implémentation algorithme colonie de fourmis
    j'ai trouvé le tutoriel de Pierre Schwartz, http://khayyam.developpez.com/articl...es-de-fourmis/, concernant l'algorithme de colonie de fourmis. Après avoir compris comment il fonctionnait j'ai décidé de télécharger le code source accessible en fin de tutoriel et je n'arrive pas à le compiler.

    J'ai ces erreurs détectées par mon compilateur :
    \main.o:main.cpp|| undefined reference to `problem::problem(int, float, float, float)'|
    main.o:main.cpp|| undefined reference to `antSystem::antSystem(int, problem&)'|


    je travaille avec Code::Blocks 16.01 sous windows 7.
    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Ca, ce n'est pas une erreur du compilateur, mais bien une erreur de ... l'éditeur de liens.

    En gros, le compilateur va générer le code binaire exécutable par le processeur pour chaque fichier *.cpp que tu vas lui donner. Une fois qu'il aura fini ce travail, un autre outil -- appelé éditeur de liens -- va prendre le relais et regrouper tous les fichier générés par le compilateur (que l'on appelle "fichiers objet") en un seul exécutable final.

    Son but sera de faire correspondre les différents appels qui sont faits aux différentes fonctions aux adresses auxquelles se trouvent effectivement les fonctions en question dans l'exécutable.

    Evidemment, pour que cela puisse marcher, il faut qu'il ... dispose du code binaire exécutable correspondant à chaque fonction qui est appelé. S'il rencontre l'appel à une fonction pour laquelle il ne dispose pas du code binaire exécutable, il n'aura pas d'autre choix que de s'arrêter sur une erreur de type "undefined reference to <nom de la fonction> ".

    Ici, l'éditeur de liens se plaint de ne pas trouver le code binaire exécutable correspondant à au moins deux fonctions (le constructeur de la classe problem et le constructeur de la classe antSystem).

    La raison principale pour laquelle il se trouve dans cette situation est que, pour une raison ou une autre, le compilateur n'a pas pu générer le fichier objet qui contient ce code binaire exécutable. Et cette raison peut arriver dans deux situation:

    La première est que les fichiers cpp qui contiennent l'implémentation de cette fonction contenaient une erreur qui a empêché le compilateur de faire son travail. Mais, a priori, il ne semble pas que ce soit le cas, autrement, c'est carrément le compilateur qui t'aurait engueulé.

    La deuxième raison est que le compilateur ne savait tout simplement pas qu'il devait aussi compiler les fichier ant_system.cpp et problem.cpp Et, généralement, ca, c'est un problème au niveau de la configuration de ton projet, et donc, un problème spécifique à ton EDI (Environnement de Développement Intégré, c'est à dire Code::Blocks, vu que tu nous l'as si gentiment donné ) .

    Tu pourras d'ailleurs t'en rendre compte en allant du coté du menu Project->properties et en sélectionnant l'onglet Build Targets dans la fenêtre qui s'ouvrira : En bas de la fenêtre tu trouveras une liste de fichiers dont le titre est Build target files: ... Si tu y fais un tout petit peu attention, je suis près à parier que le fichier ant_system.cpp et problem.cpp ne font pas partie de la liste. Me trompés-je?

    Pour résoudre ce problème, tu dois aller dans le menu project (encore une fois) -> Add files ... sélectionner les fichiers qui te manquent ( ant_system.cpp et problem.cpp, dans ton cas) et cliquer (bien évidemment) sur Open.

    Cela ouvrira une autre fenêtre dans laquelle tu verra sur la gauche une liste dont le titre est "Select the targets this file should belong to:" et tu verras au minimum les choix "Debug" et "Release". Tu dois veiller à ce que les ces deux cibles soient cochées (pour ton cas particulier). Tu peux, si ce n'est pas le cas, cliquer sur "Select All". Une fois que les deux cibles sont cochées, "yapluka" cliquer sur OK.

    Une fois cela fait, tu pourras relancer la compilation et tout devrait se passer beaucoup mieux
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Candidat au Club Avatar de midotunez
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 4
    Points
    4
    Par défaut suivi
    bonjour,
    koala01 vous avez totalement raison,bon j ai avancer un peu dans la compilation maintenant j ai un erreur
    D:\implementation\problem.cpp|14|error: no matching function for call to 'std::vector<std::vector<int> >::assign(int&, int)'|
    Avez vous idée d ou vient cet erreur?
    Images attachées Images attachées  

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Pourrais-tu utiliser les balises codes pour afficher du code ? Une grosse image est de loin le pire moyen...
    Ton code n'a aucun sens, tu veux assigner nbCities fois 0 à un vecteur de vecteur. Forcément la fonction n'existe pas.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    oui, j'ai essayé de compiler les sources, et j'ai du faire quelque corrections:
    1. inclure le fichier <cstdlib> (pour disposer de rand) dans problem.cpp
    2. modifier la ligne distances.assign(nbCities, 0); en distances.assign(nbCities, std::vector<int>{});
    3. modifier la ligne pheromones.assign(nbCities, 0); en pheromones.assign(nbCities, std::vector<float>{});
    4. activer le support de C++14 (menu Project->build Options : dans l'onglet "Compiler flags, cocher la case "Have Gcc to follow the C++14 ISO C++ language standard")
    5. inclure le fichier <string> dans main.cpp au départ, je voulais utiliser std::stoi apparu en C++11...
    6. inclure <cstdlib> dans main.cpp


    Note que l'article date de 2006. L'article en lui-même est excellent, mais le code est... ancien
    Citation Envoyé par bousk
    Ton code n'a aucun sens, tu veux assigner nbCities fois 0 à un vecteur de vecteur. Forcément la fonction n'existe pas.
    A sa décharge, c'est le code de khayyam, tel que récupéré avec l'archive qui accompagne l'article
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    L'archive vient d'être mise à jour, le code devrait maintenant compiler quelle que soit la norme .

  7. #7
    Candidat au Club Avatar de midotunez
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Un grand merci

    Citation Envoyé par koala01 Voir le message
    oui, j'ai essayé de compiler les sources, et j'ai du faire quelque corrections:
    1. inclure le fichier <cstdlib> (pour disposer de rand) dans problem.cpp
    2. modifier la ligne distances.assign(nbCities, 0); en distances.assign(nbCities, std::vector<int>{});
    3. modifier la ligne pheromones.assign(nbCities, 0); en pheromones.assign(nbCities, std::vector<float>{});
    4. activer le support de C++14 (menu Project->build Options : dans l'onglet "Compiler flags, cocher la case "Have Gcc to follow the C++14 ISO C++ language standard")
    5. inclure le fichier <string> dans main.cpp
    6. inclure <cstdlib> dans main.cpp


    Note que l'article date de 2006. L'article en lui-même est excellent, mais le code est... ancien

    A sa décharge, c'est le code de khayyam, tel que récupéré avec l'archive qui accompagne l'article
    merci KOALA , un effort de votre part en décrivant soigneusement les étapes nécessaires pour fonctionner le code:

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Note que l'article date de 2006. L'article en lui-même est excellent, mais le code est... ancien

    A sa décharge, c'est le code de khayyam, tel que récupéré avec l'archive qui accompagne l'article
    Le std::vector à l'époque n'avait pas son constructeur explicite, ce qui permettrait une telle syntaxe ?
    Ici on serait en présence d'un resize donc.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  9. #9
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Le std::vector à l'époque n'avait pas son constructeur explicite, ce qui permettrait une telle syntaxe ?
    Ici on serait en présence d'un resize donc.
    Va savoir quel compilateur il a utilisé à l'époque...

    Si ca se trouve, il utilisait Vc++6 ou un autre, et la syntaxe utilisée faisait partie des extensions que son compilateur proposait
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Implémentation algorithme colonie de fourmis
    Par yannou63360 dans le forum C++
    Réponses: 10
    Dernier message: 17/06/2015, 19h46
  2. Algorithme colonie de fourmis API
    Par Aymanito dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 10/05/2011, 23h21
  3. Réponses: 2
    Dernier message: 05/07/2010, 10h37
  4. Algorithme colonies de fourmis .Le plus court chemin
    Par momento85 dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 03/04/2010, 21h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo