Theorie des graphes/plus long chemin

cs_imanouu Messages postés 9 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 2 mars 2009 - 1 mars 2009 à 15:45
cs_imanouu Messages postés 9 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 2 mars 2009 - 2 mars 2009 à 21:47
Bonjour à tous,
    J'ai un tp à faire sur un labyrinthe apparemment "très classique" mais malgré ça j'ai beauuucoup de mal à le faire.
Mon problème n°1: J'ai méme pas compris cette question:

 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta name="ProgId" content="Word.Document" /><meta name="Generator" content="Microsoft Word 11" /><meta name="Originator" content="Microsoft Word 11" /><link rel="File-List" href="file:///C:%5CUsers%5CIDEL-O%7E1%5CAppData%5CLocal%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:HyphenationZone>21</w:HyphenationZone>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
</w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" LatentStyleCount="156">
</w:LatentStyles>
</xml><![endif]--><style><!--
/* Font Definitions */
@font-face
{font-family:Tahoma;
panose-1:2 11 6 4 3 5 4 4 2 4;
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:-520078593 -1073717157 41 0 66047 0;}
@font-face
{font-family:Times;
panose-1:2 2 6 3 5 4 5 2 3 4;
mso-font-charset:0;
mso-generic-font-family:roman;
mso-font-pitch:variable;
mso-font-signature:-536855825 -1073711039 9 0 511 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:Times;
mso-fareast-font-family:Times;}
@page Section1
{size:612.0pt 792.0pt;
margin:70.85pt 70.85pt 70.85pt 70.85pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
--></style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Tableau Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]-->Inonder
le labyrinthe en parcourant tous les chemins du labyrinthe

mon probléme n°2: Je ne sais pas du tout comment on fait pour trouver le plus long chemin enfin je sais qu'il faut utiliser un

parcours DFS mais j'arrive pas à l'appliquer.

 Merci à tous ceux qui voudront m'aider.

14 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
1 mars 2009 à 18:26
Salut,

Pour innonder ton labyrinthe
il faut que tu fasses un parcours qui a partir de l'entrée de ton labyrinthe passe par toutes les cases atteignables de ton labirynthe.

Un parcours recursif est l'ideal tu parcours chaque chemin tant que tu n'es pas blqoué ou arrive à la fin.

Pour le chemin le plus long
tu retiens le chemin le plus long (0 à l'init)

et dés que tu arrives à la fin tu compares avec la valeur initiale si > alors tu changes la valeur stockée et sinon tu recommence
si tu es en cul de sac tu reprends le chemin suivant dans le parcours
l'algo d'innodation te permettta de parcourir tout le labyrinthe

il suffit de modifier le DFS pour compter le nombre de cases entre le debut et la fin de ton laby

Aide pour le DFS
http://fr.wikipedia.org/wiki/Algorithme_de_parcours_en_profondeur
0
cs_imanouu Messages postés 9 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 2 mars 2009
1 mars 2009 à 18:34
Merci pour la 1ere question j'ai enfin réussi à la faire.Mais pr ce qui est du plus court chemin u encore le plus long je tombe a chaque fois sur un résultat bizarre "DEUX CASES QUI NE SONT PAS VOISINES" ce qui est bien sur archi faux!!! Et je vois pas où est le probléme
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
1 mars 2009 à 18:42
Ton initilisation est-elle correcte?

Regardes avec un labyrinthe plus petit?
Trace les numeros de cases par ou tu passes si c'est possible

Mais je ne peux aider?
0
cs_imanouu Messages postés 9 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 2 mars 2009
1 mars 2009 à 19:38
justement le avec lequel je travaille est déja petit.Je peux si tu veux bien te l' envoyer par mail et y jeter un coup d'oeil stp en plus c'est à rendre aprés demain et j'ai fait tt mon possible je déséspére
 et  Merci beauuuucoup
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
2 mars 2009 à 03:32
salut

envoie ton code ici, ca ira plus vite.


innonder son laby, ce n'est pas qqch de vraiment recursif : il s'agit d'un parcours en profondeur : ca se fait avec une file first in first out.

tu mets la case de depart dans la file.
tant qu'il y a une case dans la file, faire :
si on avait pas deja parcourru cette case, faire :
mettre dans la file les cases qui touchent la case courante.
fin si
fin tant que

en faisant ca, nos goutes d'eau (qui parcourent en meme temps tout les chemins) vont toutes a la meme vitesse.
0
cs_imanouu Messages postés 9 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 2 mars 2009
2 mars 2009 à 19:56
Travail à compléter<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>





voici exactement en quoi ca consiste:
aidez moi s'il vous plait parce que je dois le rendre  demain et je m'en sors pas toute seule j'ai à peine fait la 1ere question!!!




 








Question 2.1







Soit le labyrinthe suivant extrait du fichier minizoo.laby :          
+-+-+-+-+





|I  |   |





+-+ +-+-+





| |   | |





+ + + +-+





| | | | |





+-+ + +-+





|      O|





+-+-+-+-+





Représentez l’
espace d’états
de son graphe non orienté. En déduire toutes ses composantes connexes. Puis donnez la représentation mémoire de sa matrice port.






 








Question 2.2







En vous servant des classes fournies, définissez et implémentez en C++ une méthode dans la classe Chemins qui recherche et affiche toutes les composantes connexes du labyrinthe.






 








Question 2.3







On souhaite faire trois parcours de chemins d’un sommet de départ au sommet de sortie :







1-    


Inonder le labyrinthe en parcourant tous les chemins du labyrinthe,







2-    


Chercher le plus court chemin en parcourant le labyrinthe en largeur (BFS) avec une file d’attente : voir les méthodes enfiler et defiler de la classe ListeNoeuds.







3-    


Chercher le plus long chemin en parcourant le labyrinthe en profondeur (DFS) avec une pile : voir la méthode empiler de la classe ListeNoeuds,
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
2 mars 2009 à 20:07
STOP

On n'est pas la pour faire les programmes en entier ;-)

Voila une source qui peut aider

http://www.cppfrance.com/codes/COMPOSENTE-CONNEXES-GRAPHE_47392.aspx
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
2 mars 2009 à 20:09
salut

on a pas pour habitude de faire les tps des gens a leur place.

si tu nous disait precisement sur quoi tu bloques, que tu nous montrait ton code, et l'erreur qui te pose probleme, on pourrait peut-etre t'aider, mais certainement pas te le faire a ta place.
0
cs_imanouu Messages postés 9 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 2 mars 2009
2 mars 2009 à 20:15
oui je sais!!!!! Mais je demande juste des indications pas plus et en plus j'ai déja essayé de le faire!!!

Mon probléme c'est quand je fais la file et je combine les résultats de l'affichage je trouve un résultat IMPOSSIBLE à moins qu'il saute!!!ce qui n'est pas possible.
Donc si quelqu'un voit où est le probléme je lui serai reconnaissante!!

Merci pour ceux qui voudront bien m'aider.
Une débutante en programmation déséspérée.
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
2 mars 2009 à 20:16
ca fait deux fois que je te demande de nous envoyer ton code... si on ne le voit pas, on ne peut pas voir ce qui ne va pas dans ton code.
0
cs_imanouu Messages postés 9 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 2 mars 2009
2 mars 2009 à 20:21
ok voici mon code: (c'est en C++)

dans ListeNoeuds.cpp

#include "ListeNoeuds.h"




// Implémentation du constructeurListeNoeuds::ListeNoeuds () { tete queue NULL ; taille = 0 ; marque = false ; }


// Implémentation des méthodes
int ListeNoeuds::getTaille () { return taille ; }


Noeud *ListeNoeuds::getTete() { return tete ; }


Noeud *ListeNoeuds::getQueue() { return queue ; }


bool ListeNoeuds::getMarque() { return marque ; }


void ListeNoeuds::setMarque(bool pmarque) { marque = pmarque ; }


bool ListeNoeuds::estVide () { return taille==0 ; }


void ListeNoeuds::empiler(Sommet *ps) {
    Noeud *nouveau = NULL ;
    nouveau = new Noeud(ps); // appel du constructeur de Noeud
    nouveau->setNext(tete);
    tete = nouveau;
    taille++ ;
}


void ListeNoeuds::enfiler (Sommet *ps) {
 Noeud *nouveau = NULL ;
 nouveau = new Noeud (ps) ; // appel du constructeur de Noeud
 if (estVide()==true)  tete queue nouveau ;
 else {
  queue->setNext (nouveau) ;
  queue = nouveau;
 }
 taille++ ;
}


Sommet *ListeNoeuds::defiler () { // on suppose que la file n’est pas vide
 Noeud *temp  = tete ;
 Sommet *s = temp->s ;
 if (tete==queue)  tete queue NULL ;
 else
  tete = tete->getNext () ;
 delete (temp) ; // appel du destructeur de Noeud
 taille-- ;
 return s ;
}

dans ListeNoeuds.h

#ifndef FILENOEUDS
#define FILENOEUDS


#include "Noeud.h"
#include


using namespace std;


class ListeNoeuds
{
private:
 int taille ; // nombre de noeuds
 Noeud *tete, *queue ; // objets dynamiques sur le premier et dernier noeud
 bool marque ; // marquage de l’ancre lors d'un parcours de chemin


public:
      // constructeur par défaut
 ListeNoeuds ();


 // prototypes des méthodes
 int getTaille () ; // accesseur en lecture de taille
 Noeud *getTete(); // accesseur en lecture de tete
 Noeud *getQueue(); // accesseur en lecture de queue
 bool getMarque(); // fonction booléenne qui vérifie si l'ancre est marquée
      void setMarque(bool pmarque);// Procédure qui met à true ou false la marque de l'ancre
      bool estVide (); // fonction booléenne qui vérifie si la liste est vide ou non
 void empiler(Sommet *ps); // empiler un sommet en tete de la liste
 void enfiler (Sommet *ps); // enfiler un sommet en queue de la liste
 Sommet *defiler (); // defiler un sommet de la tete de la liste
};


#endif


merci beauuucoup de bien vouloir m'aider!!
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
2 mars 2009 à 20:30
c'est un code pour une liste chainee ca, ca te fait une pile et une file, mais ca n'a rien a voir avec ton tp...
0
cs_imanouu Messages postés 9 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 2 mars 2009
2 mars 2009 à 21:27
oui mais là je dois faire une file pour déterminer le plus court chemin!!
0
cs_imanouu Messages postés 9 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 2 mars 2009
2 mars 2009 à 21:47
pour trouver le plus court chemin voici l'algorithme que j'utilise:

  1.Mettre le noeus de départ ds la file
  2.retirer le noeud du début de la file pour l'examiner
  3.Mettre tous les voisins non examinés dans la file
  4.Si la file n'est pas vide reprendre l'étape2

J'aimerai s'il vous plait savoir si on a genre deux élements est ce qu'on prend les voisins non encore marqués de tous les autres éléments avant ou seulement ceux de l'élément accessible.

Merci de bien vouloir me répondre.
0
Rejoignez-nous