Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1826 connectés 

  FORUM HardWare.fr
  Programmation
  Algo

  algo glouton

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

algo glouton

n°470081
nabrouska
Posté le 28-07-2003 à 18:08:37  profilanswer
 

salut j'ai un algo a faire dont voici l'énoncé:
 
 
Vous désirez vous rendre en automobile de Montréal à Vancouver. Le réservoir de votre voiture vous permet de parcourir une distance D lorsqu?il est plein. Au cours du voyage vous rencontrerez k postes d?essences où vous pourriez faire le plein.  
 
Soient :
? di la distance pour aller du poste i?1 au poste i,  
? d1 la distance de Montréal au poste 1, et  
? dVancouver  la distance du poste k à Vancouver (on suppose di <= D et dVancouver <= D). (Donc il n?est pas possible de manquer d?essence)
? C = { c1, c2, ..., ck} l?ensemble des postes d?essence.
 
On désire faire le moins d?arrêts possibles.
 
1. Écrire un algorithme glouton qui détermine les postes où on devrait arrêter.  
 
2.  Si votre voiture a une autonomie de 600 km (D = 600km)
 
Soit  10 postes d?essences C1 à C10.
 
En appliquant l?algorithme que vous avez écrit, pour voyager du point A au point B, indiquer les postes d?essences où vous arrêterez. (Nombre de poste d?essence  
minimal).  
 
je sais pas trop par où commencé... alors si vous avez une idée

mood
Publicité
Posté le 28-07-2003 à 18:08:37  profilanswer
 

n°470144
jagstang
Pa Capona ಠ_ಠ
Posté le 28-07-2003 à 18:51:50  profilanswer
 

Va voir du côté du voyageur de commerce. Tu dois pouvir résoudre ça en utilisant le backtracking il me semble


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°470150
jagstang
Pa Capona ಠ_ಠ
Posté le 28-07-2003 à 18:56:39  profilanswer
 

Oh non c'est pas si simple. Il y a surement plusieurs routes possibles pour aller de A vers B
 
Sinon, pas besoin d'un algo pour faire ça.
 
Les distances sont sous quelles formes ? une matrice ?
 
 
EDIT : Merci à SirJeannot d'avoir effacé son message. Comme ça plus personne comprend le topic


Message édité par jagstang le 28-07-2003 à 19:00:46

---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°470151
jagstang
Pa Capona ಠ_ಠ
Posté le 28-07-2003 à 18:57:59  profilanswer
 

Si ça peut t'aider, un algo que j'ai fait il y a quelques temps. C'est avec une matrive de distances
 

Code :
  1. void voyageur(int **distance, int nbVilles)
  2.     {
  3.     // vecteur contenant l'ordre des villes
  4.     int *ordre = (int *) malloc((nbVilles+1) * sizeof(int)) ;
  5.     // vecteur de contrôle, pour savoir si on est déjà allé à cette ville
  6.     int *vc = (int *) malloc(nbVilles * sizeof(int)) ;
  7.     for (int i=0 ; i< nbVilles ; i++)
  8.         vc[i] = 1 ;
  9.     ordre[0] = 0 ; // ville de départ, 0
  10.     int distMin = 0xFFFFFFF ; // initialisé à grand, pour que le premier
  11.                               // résultat trouvé soit meilleur
  12.     _voyageur(distance, ordre, 1, 0, &distMin, nbVilles, vc) ;
  13.     }
  14. void _voyageur(int **distance, int *parcours, int index, int km, int *kmMin, int n, int *vc)
  15.     {
  16.     // optimisation, si on est déjà plu grand que le meilleur résultat, on sort
  17.     if (km >= *kmMin)
  18.         return ;
  19.     // on arrive à la dernière ville, il faut encore revenir au départ
  20.     if (index == n)
  21.         {
  22.         parcours[index] = 0 ;  // va à 0 ;
  23.         _voyageur(distance, parcours, index+1,
  24.                   km+distance[0][parcours[index-1]], kmMin, n, vc) ;
  25.         return ;
  26.         }
  27.     // fin, solution trouvée
  28.     if (index == n+1)
  29.         {
  30.         *kmMin = km ;               // on enregistre le nouveau meilleur résultat
  31.         cout << endl ;
  32.         cout << "solution : " ;
  33.         for (int i=0 ; i<n ; i++)
  34.             cout << parcours[i] << " " ;
  35.         cout << " --> km : " << km ;
  36.         return ;
  37.         }
  38.     for (int i=1 ; i<n ; i++)
  39.         {
  40.         parcours[index] = i ;   // on essaie d'aller à cette ville
  41.         if (vc[i])   // pas encore allé (vecteur de contrôle), si on peut
  42.             {
  43.             vc[i] = 0 ;
  44.             _voyageur(distance, parcours, index+1,
  45.                       km+distance[i][parcours[index-1]], kmMin, n, vc) ;
  46.             vc[i] = 1 ;  // backtracking ! on enlève le 0 !
  47.             }
  48.         }
  49.     }



---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°470172
nabrouska
Posté le 28-07-2003 à 19:39:16  profilanswer
 

JagStang a écrit :

Oh non c'est pas si simple. Il y a surement plusieurs routes possibles pour aller de A vers B
 
Sinon, pas besoin d'un algo pour faire ça.
 
Les distances sont sous quelles formes ? une matrice ?
 
 
EDIT : Merci à SirJeannot d'avoir effacé son message. Comme ça plus personne comprend le topic


 
en effet c une matrice...
 

Code :
  1. A C1 550
  2. C1 C2 100
  3. C2 C3 225
  4. C3 C4 300
  5. C4 C5 100
  6. C5 C6 50
  7. C6 C7 75
  8. C7 C8 100
  9. C8 C9 300
  10. C9 C10 175
  11. C10 B 400


 
voici mon algo:

Code :
  1. autonomie = 600
  2. ptot =  0
  3. tant i < 11
  4.   si (ptot + di < Auto) et (ptot + di+1 < autonomie)
  5.     Arret[i]= ci
  6.     ptot = ptot+di
  7.   else
  8.     ptot=0
  9.   increment i


 
mais je suis pas certain que c du glouton..


Message édité par nabrouska le 28-07-2003 à 19:47:31
n°470345
Kyle_Katar​n
Posté le 28-07-2003 à 23:42:34  profilanswer
 

J'utilise l'algo Glouton dans Ignition ( http://www.katarncorp.com/?ignition ) mais mon prof d'IA m'a conseillé de regarder CA : http://www.nada.kth.se/~viggo/wwwc [...] de160.html qui à l'air plus intéressant.

n°470369
jagstang
Pa Capona ಠ_ಠ
Posté le 29-07-2003 à 00:31:08  profilanswer
 

>> nabrouska  
 
Donne moi ton mail en privé
 
J'ai un projet que j'ai fait qui utilise 3 méthodes
 
Recherche heuristique par la methode : ville la plus proche
Recherche heuristique par la methode : meilleure insertion
Recherche backtracking (tres long.........)
 
 


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°470519
Profil sup​primé
Posté le 29-07-2003 à 09:42:48  answer
 

contenu de mon message effacé qui était le 3e [:dawa] et qui était une bétise
 
"ben tu vois si ta titine est capable d'aller à la station suivante étant à une station"
mais bon, je n'avais pas vu le pb du backtracking  :cry:  
 
enfin ajouter du backtrackingà ce genre de raisonnement n'est pas très difficile non plus  :whistle:

n°472635
MagicBuzz
Posté le 30-07-2003 à 23:09:45  profilanswer
 

c koi un algo glouton ? :D

n°472637
MagicBuzz
Posté le 30-07-2003 à 23:14:43  profilanswer
 

Euh... Juste un truc... Je vous vois tous partir dans un délire de graph... Seulement, si on lit l'énoncé, il y a une chose capitale que vous n'avez visiblement pas remarqué :
 
Au cours du voyage vous rencontrerez k postes d?essences où vous pourriez faire le plein.
 
Les postes d'essence sont donc pas disséminés géographiquement n'importe comment, ils sont ordonnés sur un trajet déjà calculé. Il s'agit dinc ni plus ni moins d'un tableau à une seule dimension... Pas besoin de partir dans des algos genre le voyageur de commerce... L'algo de nabrouska résoud parfaitement le problème en toute simplicité (il est améliorable niveau perfs - puisque les postes sont répartis à distance constante sur le parcours, on peut calculer le nombre de postes qu'on peut sauter avant d'atteindre D, histoire de ne pas les passer chacun en revue, mais sauter x postes à chaque fois -, mais pas au niveau algo... Enfin... Faut le corriger, parcequ'il est complètement faux, mais l'approche logique est la bonne)
Par contre, c'est trop simple, je doute que ce soit ça un algo glouton... C quoi au juste ce truc ?


Message édité par MagicBuzz le 30-07-2003 à 23:16:03
mood
Publicité
Posté le 30-07-2003 à 23:14:43  profilanswer
 

n°472643
MagicBuzz
Posté le 30-07-2003 à 23:26:29  profilanswer
 

Perso, je ferais : (pseudo code VB)
 
saut = int(D / di)
numPoste = 0
nbArret = 0
 
// On vérifie que D < d1 + d[1..k] + dVancouver, çe serait con de s'arrêter pour rien ;)
if D < d1 + 10 * di + dVancouver
 
  // Premier tronçon : on prends en compte d1, la distance initiale
  numPoste = int((D - d1) / di)
  dist = d1 + numPoste * di
 
  // Ensuite : saut de poste en poste
  do while dist < (d1 + 10 * di + dVancouver) - D
     numPoste = numPoste + saut
     dist = dist + di * saut
     nbArret = nbArret + 1
  loop
 
End if
 
// Maintenant, nbArret contient le nombre d'arrêts, on peut sauvegarder les numPoste si on veut la liste des postes où on s'est arrêté.
 
PS: attention, dans mon cas, les postes sont nommés de 0 à k - 1
 
Mais bon, de toute façon, ça doit pas être un glouton :D
 
Par contre, je doute qu'on puisse faire plus optimisé... Doit y avoir quand même moyen de se passer du while, mais je vois pas trop comment... mais certainement tout à fait faisable... C'est la seule optimisation possible.


Message édité par MagicBuzz le 30-07-2003 à 23:36:25
n°472652
MagicBuzz
Posté le 30-07-2003 à 23:40:43  profilanswer
 

Tout compte fait, si on veut conserver la liste des postes d'arrêt, il faut inévitablement une boucle :)
 
Mais pour connaître le nombre d'arrêt, ça se fait les doigts dans le nez avec un seul if en fait, plus celui qui vérifie que D < la distance totale :D
 
 
Nombre d'arrêts : (je vous défie de trouver plus concis :D)
 

Code :
  1. if (D < d1 + 10 * di + dVancouver)
  2. {
  3.    // On va devoir s'arrêter
  4.    if (D < dVancouver + di * (10 - int((D - d1) / di)))
  5.    {
  6.       // Une fois arrêté une première fois, on va devoir s'arrêter dans un autre poste
  7.       nbA = 1 + int(di * (10 - int((D - d1) / di)) / D);
  8.       if (D < (dVancouver + di * (10 - int((D - d1) / di))) - (int(di * (10 - int((D - d1) / di)) / D) * di))
  9.       {
  10.          // Pas de pot, le dernier arrêt était trop loin de Vancouver, on va devoir s'arrêter une dernière fois, au dernier poste par exemple
  11.          nbA++;
  12.       }
  13.    }
  14.    else
  15.    {
  16.       // On ne fait qu'un arrêt
  17.       nbA = 1;
  18.    }
  19. }
  20. else
  21. {
  22.    // Ben on n'a pas besoin de s'arrêter...
  23.    nbArrets = 0;
  24. }


 
 
C trop facile comme problème :D Tout compte fait, il fallait tout de même 3 if :)
Pour rajouter les numéros des postes où on s'arrête, c'est pas très compliqué, il faut rajouter le pemier arrêt et le dernier (s'il existe) et faire un petit for pour ceux du parcours poste à poste.
 
 
M'enfin c'est tout faut, chais pas ce qu'est un algo glouton et tout le monde pionce :o


Message édité par MagicBuzz le 31-07-2003 à 00:04:53
n°472715
jagstang
Pa Capona ಠ_ಠ
Posté le 31-07-2003 à 02:10:11  profilanswer
 

Je t'ai envoyé mon prog.
 
Pour ceux que ça intéresse, message privé svp pour me donner le mail


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°473196
jagstang
Pa Capona ಠ_ಠ
Posté le 31-07-2003 à 14:39:19  profilanswer
 

Code :
  1. void voyageur(float **distance, int nbVilles)
  2.     {
  3.     // vecteur contenant l'ordre des villes
  4.     int *ordre = (int *) malloc((nbVilles+1) * sizeof(int)) ;
  5.     // vecteur de contrôle, pour savoir si on est déjà allé à cette ville
  6.     int *vc = (int *) malloc(nbVilles * sizeof(int)) ;
  7.     for (int i=0 ; i< nbVilles ; i++)
  8.         vc[i] = 1 ;
  9.     ordre[0] = 0 ; // ville de départ, 0
  10.     int distMin = 0xFFFFFFF ; // initialisé à grand, pour que le premier
  11.                               // résultat trouvé soit meilleur
  12.     _voyageur(distance, ordre, 1, 0, &distMin, nbVilles, vc) ;
  13.     }
  14. void _voyageur(float **distance, int *parcours, int index, int km, int *kmMin, int n, int *vc)
  15.     {
  16.     // optimisation, si on est déjà plu grand que le meilleur résultat, on sort
  17.     if (km >= *kmMin)
  18.         return ;
  19.     // on arrive à la dernière ville, il faut encore revenir au départ
  20.     if (index == n)
  21.         {
  22.         parcours[index] = 0 ;  // va à 0 ;
  23.         _voyageur(distance, parcours, index+1,
  24.                   km+distance[0][parcours[index-1]], kmMin, n, vc) ;
  25.         return ;
  26.         }
  27.     // fin, solution trouvée
  28.     if (index == n+1)
  29.         {
  30.         *kmMin = km ;               // on enregistre le nouveau meilleur résultat
  31.         cout << endl ;
  32.         cout << "solution : " ;
  33.         for (int i=0 ; i<n ; i++)
  34.             cout << parcours[i] << " " ;
  35.         cout << " --> km : " << km ;
  36.         return ;
  37.         }
  38.     for (int i=1 ; i<n ; i++)
  39.         {
  40.         parcours[index] = i ;   // on essaie d'aller à cette ville
  41.         if (vc[i])   // pas encore allé (vecteur de contrôle), si on peut
  42.             {
  43.             vc[i] = 0 ;
  44.             _voyageur(distance, parcours, index+1,
  45.                       km+distance[i][parcours[index-1]], kmMin, n, vc) ;
  46.             vc[i] = 1 ;  // backtracking ! on enlève le 0 !
  47.             }
  48.         }
  49.     }


 


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°473422
MagicBuzz
Posté le 31-07-2003 à 15:49:55  profilanswer
 

JagStang a écrit :

Je t'ai envoyé mon prog.
 
Pour ceux que ça intéresse, message privé svp pour me donner le mail


Je vois toujours pas le rapport entre ton prog et l'énnoncé...

n°473658
jagstang
Pa Capona ಠ_ಠ
Posté le 31-07-2003 à 17:51:03  profilanswer
 

:D


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°473711
MagicBuzz
Posté le 31-07-2003 à 20:02:10  profilanswer
 

:p ;)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Algo

  algo glouton

 

Sujets relatifs
Question methode c++ (algo)[ASP/Algo] Nombre en Français
[RESOLU][ALGO]Comment fonctionne le tracking par mail ?Algo de Hashage/Signature
changer un entier en double ? ou bien mon algo est mauvais ...helpalgo de graph
Compilation et debogage de module linux, aux pros de l'algo et systeme[VBA] [ALGO] Découper une chaine de charactères d'après séparateur
Algo de génération de dégrade [RESOLU][Java/Algo] Reconnaitre un disque dans un image
Plus de sujets relatifs à : algo glouton


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR