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 :

voyageur de commerce par recuit simul�


Sujet :

C

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    8
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8
    Par d�faut voyageur de commerce par recuit simul�
    Bon apres avoir passer qq heures dessus je viens demander de l'aide

    Je tente de r�soudre le voyageur de comemrce par la m�thode du recuit simul�.
    Pour ce faire je cr� d'abord un premier chemin en choisissant systematiquement la ville voisine la plus proche puis je tente, en faisant des permutations de 2 segments a la fois de maniere al�atoire d'optimiser mon trajet. Cependant, outre le fait que ca ne marche pas , que le code est tres mal optimis� (au dessus de 50 villes ca devient lent) et bien j'ai l'impression que l'algorithme tourne en rond. Si quelqun pouvais m'eclaircir^^

    Seule la fonction rech_locale semble ne pas donner les r�sultats attendu.
    Ah et le tableau ville_dep est global.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    double distance(double ville1[][2], double ville2[][2], short i, short j)
    {
    double calcX,calcY,calc;
     
    calcX = ville1[i][0]-ville2[j][0]; 			//distance entre les abscisses/ordonnées des points
    calcY = ville1[i][1]-ville2[j][1];
    calc = sqrt((pow(calcX,2) + pow(calcY,2))); //distance total entre 2 points
    return calc;
    }
     
     
     
    void rech_loc(double ville[][2])
    {
    double II1, JJ1, IJ, I1J1, val, taille=0, best, essai, essai_faire, temp=8000, temp_min=5, dE;
    short i, I=0, I1, J=0, J1, flag=0;			 //vecteur I et J
     
    essai = pow((VILLE/2),2);
     
    for(i=0;i<VILLE;i++)					 //save de lancien parcour
           {
            ville_dep[i][0]=ville[i][0];
            ville_dep[i][1]=ville[i][1];
            }
     
    while(temp > temp_min)
            {
            for(essai_faire=0;essai_faire < essai;essai_faire++)
                    {
                    best=energie(ville);
     
                    while(!flag)
                            {
                            I=rand() %VILLE-1;
                            J=rand() %VILLE-1;
     
                            if (I!=J)
                                    flag=1;
                            }
     
                            I1=I+1;
                            J1=J+1;
     
                    val = ville[I1][0];							//maj du tableau des points
                    ville[I1][0] = ville[J][0];
                    ville[J][0] = val;
     
                    val = ville[I1][1];
                    ville[I1][1] = ville[J][1];
                    ville[J][1] = val;
     
                    taille=energie(ville);
     
                    dE=taille-best;							   //delta de l'"energie" finale apres modification
     
                    if(dE<0 || recuit(dE, temp))
                            {
                            CanvasClear (VCOM, VCOM_CANVAS, VAL_ENTIRE_OBJECT);
                            for(i=0;i<VILLE-1;i++)		  //retrace le nouveau chemin
                                    {
     
    				//Sleep(500);
     
                                    CanvasDrawLine (VCOM, VCOM_CANVAS,
                                            MakePoint(ville[i][0], ville[i][1]),
                                            MakePoint(ville[i+1][0], ville[i+1][1]));
     
                                    CanvasDrawRect (VCOM, VCOM_CANVAS,
                                            MakeRect (ville[i][1],ville[i][0],3,3),
                                            VAL_DRAW_INTERIOR);
     
                                    }
                            for(i=0;i<VILLE;i++)					 //save du nouveau parcour
                                    {
                                    ville_dep[i][0]=ville[i][0];
                                    ville_dep[i][1]=ville[i][1];
                                    }
     
                            }
                        else
    			{
                            for(i=0;i<VILLE;i++)
                                    {
                                    ville[i][0]=ville_dep[i][0];		  //chargement de l'ancien parcour
                                    ville[i][1]=ville_dep[i][1];
                                    }
                             }
     
     
                    SetCtrlVal (VCOM, VCOM_DISTANCE, best);
                    }
            temp = temp * 0.999;
            SetCtrlVal (VCOM, VCOM_TEMP, temp);	
            }
     
    }
     
     
    double energie(double ville[][2])
    {
    int i;
    double energie=0;
    for(i=0;i<VILLE-1;i++)
            energie=energie + distance(ville,ville,i,i+1);
    energie = energie + distance(ville, ville, VILLE-1, 0);
    return energie;
    }
     
     
    double recuit(double dE, double temp)
    {
    double aleat;
     
    aleat = (rand()%1000)*0.001;
    if(aleat <= exp(-dE/temp))
            return 1;
    else
            return 0;
    }
    voila voila^^ (je ne sais aps si c'est tres lisible )
    Fichiers attach�s Fichiers attach�s
    • Type de fichier : c main.c (5,8 Ko, 320 affichages)

  2. #2
    Expert confirm�
    Avatar de PRomu@ld
    Homme Profil pro
    Ing�nieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activit� : Ing�nieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par d�faut
    Cependant, outre le fait que ca ne marche pas , que le code est tres mal optimis� (au dessus de 50 villes ca devient lent)
    D�j�, pour le fait que �a ne marche pas, il faut �tudier si c'est ton algorithme ou le code qui ne fonctionne pas. Si c'est le code, tu es peut �tre sur le bon forum, dans ce cas indique nous plus pr�cisement les erreurs.

    Si �a n'est pas le cas, il s'agit sans doute d'un probl�me d'algorithme et tu n'es pas sur le bon forum.

    Pour ce qui est de la rapidit�, le probl�me du voyageur de commerce est un probl�me NP-Complet et c'est donc normal.

  3. #3
    Membre confirm�
    Inscrit en
    D�cembre 2005
    Messages
    95
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2005
    Messages : 95
    Par d�faut
    Citation Envoy� par PRomu@ld

    Pour ce qui est de la rapidit�, le probl�me du voyageur de commerce est un probl�me NP-Complet et c'est donc normal.

    Non ce n'est pas normal. Le recuit est un(e?) heuristique. Sa complexit� doit etre en n carr�..

    il doit pouvoir fonctionner "rapidement" sur au moins 2000 villes..

  4. #4
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Citation Envoy� par lechewal
    Non ce n'est pas normal. Le recuit est un(e?) heuristique. Sa complexit� doit etre en n carr�..

    il doit pouvoir fonctionner "rapidement" sur au moins 2000 villes..
    Heu... Je tiens quand meme � signaler que, si tu as une complexit� de n carr�, tu obtiens, quand meme, pour 50 villes, 2500 it�ration � effectuer... Ce qui fait quand meme pas mal

    En plus, es tu sur que le recuit simul� soit, r�ellement, l'algorithme le plus adapt� � ce que tu veux

    Que penserais-tu, par exemple, de t'orienter vers l'algorithme de Dijkstra qui *pourrait* s'av�rer plus ad�quat
    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

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    8
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8
    Par d�faut
    En th�orie il me semble avoir r�alis� les �tapes n�cessaire de l'algorthme mais je ne suis pas sur de la maniere dont j'ai encod� la modification du trajet : comme je l'ai dit j'ai l'impression qu'il ne me test aps toute les possibilit�es meme pour une temp�rature plus �lev�. Ensuite pour ce qui est du choix de l'algorithme j'avais compris que l'algorithme de Dijkstra "repassait" par ses anciennes positions ? Et puis le recuit simul� me semblait plus int�ressant car plus g�n�ral et suffisament robuste (c'est mon premier probleme d'optimisation combinatoire donc si je pouvais tester un algo qui marche pour presque tout ^^)

  6. #6
    Expert confirm�
    Avatar de PRomu@ld
    Homme Profil pro
    Ing�nieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activit� : Ing�nieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    while(temp > temp_min)
    ...
    temp = temp * 0.999;
    Ici, avant de passer de 8000 � 5, �a risque �tre long.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    calc = sqrt((pow(calcX,2) + pow(calcY,2)));
    Si tu veux gagner un peu en rapidit�, au lieu de calculer un carr� avec pow, fait le � la main. (ie : calcX * calcX ).

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     I=rand() %VILLE-1;
    J=rand() %VILLE-1;
     
    if (I!=J)
       flag=1;
    Ici tu fais une comparaison de flotant, ceci est interdit ! En effet, la comparaison des flotants est incorrecte. Il y a de forte chances que �a boucle.

    Heu... Je tiens quand meme � signaler que, si tu as une complexit� de n carr�, tu obtiens, quand meme, pour 50 villes, 2500 it�ration � effectuer... Ce qui fait quand meme pas mal
    2500 pour un ordi, c'est d�risoire ... . J'avais mal lu et ne connaissant pas le recuit simul� j'�tait parti du principe que �a restait dans une forte complexit�.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Probl�me du voyageur de commerce par recuit simul� sur R.
    Par Lelebouzios dans le forum Langages
    R�ponses: 0
    Dernier message: 12/12/2014, 19h07
  2. Optimisation d'une fonction par recuit simul�
    Par jeanmichB dans le forum Algorithmes et structures de donn�es
    R�ponses: 22
    Dernier message: 08/08/2012, 16h46
  3. optimisation par recuit simul�
    Par el-bey2 dans le forum Math�matiques
    R�ponses: 10
    Dernier message: 04/02/2011, 21h20
  4. Probleme Voyageur de Commerce - Recuit Simul�
    Par dinver dans le forum Algorithmes et structures de donn�es
    R�ponses: 4
    Dernier message: 21/06/2009, 22h26
  5. Voyageur de commerce par essaims particulaires
    Par Demju dans le forum Intelligence artificielle
    R�ponses: 4
    Dernier message: 23/01/2009, 19h53

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