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

Algorithmes et structures de données Discussion :

« le plus court chemin » sous contraintes


Sujet :

Algorithmes et structures de données

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 22
    Points : 14
    Points
    14
    Par défaut « le plus court chemin » sous contraintes
    Bonjour tout le monde,

    J'ai un problème que j'ai essayé d'assimiler au problème du « plus court chemin » sous contraintes :



    On doit passer obligatoirement par chaque ensemble et, dans chaque ensemble, on doit passer seulement par une ellipse.

    les contraintes peuvent être (à titre d'exemple) :

    • passer par les ellipses rouges au maximum 2 fois ;
    • passer par les ellipses vertes au maximum 3 fois ;
    • passer par les ellipses bleues au maximum 2 fois ;
    • passer par les ellipses jaunes au maximum 2 fois.


    Ma question est de trouver l'algorithme pour déterminer le plus court chemin.
    Merci d'avance.

  2. #2
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    tu peux utiliser un dijkstra avec les contraintes, mais pour cela il te faut ajouter des informations lorsque tu es dans chaque noeud afin de vérifier si le chemin est valide (ne viole pas tes contraintes).
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    bonjour
    Merci ToTo13 pour l'idée

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    J'entends contraintes, aussitôt je dégaine Prolog et CLP(FD).

    Voilà un exemple de programme :

    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
    :- use_module(library(clpfd)).
     
    parcours :-
    	Etapes= [[(rouge, 10), (vert, 15), bleu(20)],
    		 [(vert,12), (rouge,12), (bleu, 15), (jaune, 17)],
    		 [(vert, 12), (rouge, 14)],
    		 [(bleu, 17), (jaune, 10), (vert, 8)]],
     
    	length(Etapes, L),
    	length(Poids, L),
    	% on donne une limite aux poids    
    	Poids ins 0..100,
     
    	maplist(etudie, Etapes, Couleur, Poids),
    	[NB, NJ, NR, NV] ins 0..4,
     
    	% on totalise les couleurs
    	total(Couleur, 0, 0, 0, 0, NB, NJ, NR, NV),
     
    	% on calcule la longueur du parcours
    	sum(Poids, #=, Len),
     
    	% on veut deux bleux
    	NB #= 2,
     
    	% on ne veut pas de vert
    	NV #= 0,
     
    	% on calcule pour minimiser le parcours
    	labeling([min(Len)], [NB, NJ, NR, NV]),
     
    	maplist(affiche, Couleur),
    	nl,
    	writeln(Len).
     
     
    etudie(Etape, R, N) :-
    	member((C, N), Etape),
    	test(C, R).
     
    test(C, R) :-
    	C = bleu,  R = [1,0,0,0];
    	C = jaune, R = [0,1,0,0];
    	C = rouge, R = [0,0,1,0];
    	C = vert,  R = [0,0,0,1].
     
    total([], B, J, R, V, B, J, R, V).
     
    total([[NB, NJ, NR, NV]|T], B1, J1, R1, V1, B, J, R, V) :-
    	B2 #= B1 + NB,
    	J2 #= J1 + NJ,
    	R2 #= R1 + NR,
    	V2 #= V1 + NV,
    	total(T, B2, J2, R2, V2, B, J, R, V).
     
     
    affiche([1,0,0,0]) :-
           write('bleu ').
     
    affiche([0,1,0,0]) :-
           write('jaune ').
     
    affiche([0,0,1,0]) :-
           write('rouge ').
     
    affiche([0,0,0,1]) :-
           write('vert ').
    Sorties possibles
    On demande 2 bleux
    ?- parcours.
    rouge bleu vert bleu
    54
    true
    On demande deux bleux et pas de vert
    ?- parcours.
    rouge bleu rouge bleu
    56
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    merci infiniment Trap D
    je vais essayer de généraliser cet algorithme

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par sarmad354 Voir le message
    merci infiniment Trap D
    je vais essayer de généraliser cet algorithme
    Attention, je viens de voir qu'il est incorrect.
    Je suis en train d'essayer de le corriger, mais l'idée y est !!.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Bon, je crois que c'est bon.
    Le programme est en SWI-Prolog.
    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
    :- use_module(library(clpfd)).
     
     
    % Bleu -> 0
    % Jaune -> 1
    % Rouge -> 2
    % Vert -> 4
    parcours :-
    	Etapes= [[(4, 15),(0, 20), (2, 10) ],
    		 [(0, 15), (1, 17), (2,12), (4,12) ],
    		 [(2, 14), (4, 12)],
    		 [(4, 8), (0, 17), (1, 10) ]],
     
    	% on poste les contraintes
    	contraintes_parcours(Etapes, [NB, NJ, NR, NV], Couleurs, Longueur, Liste),
     
    	% on impose les contraintes de couleurs
    	% on veut deux bleux
    	NB #= 2,
    	% mais pas de vert
    	NV #= 0,
     
    	% on veut 3 rouges
    	% NR #= 3,
     
    	% on effectue le calcul
    	labeling([min(Longueur)], Liste),
     
    	format('Couleurs ~w ~n', [Couleurs]),
     
    	maplist(affiche, Couleurs),
    	nl,
    	writeln(Longueur).
     
     
    contraintes_parcours(Etapes, [NB, NJ, NR, NV], Couleurs, Longueur, Liste) :-
     
    	etudie_etapes(Etapes, Couleurs, Distances, Portes),
     
    	% on totalise les couleurs
    	total(Couleurs, NB, NJ, NR, NV),
     
    	% on calcule la longueur du parcours
    	sum(Distances, #=, Longueur),
     
    	% on calcule pour minimiser le parcours
    	flatten(Portes, Liste).
     
     
    % etude de chéque étape,
    % on parcours la liste des portes
    etudie_etapes([], [], [], []).
     
    etudie_etapes([Etape | Etapes],
    	      [Couleur | Couleurs],
    	      [Distance | Distances],
    	      [Porte | Portes]) :-
    	etudie_etapes(Etapes, Couleurs, Distances, Portes),
    	etudie(Etape, Couleur, Distance, Porte),
    	% il n'y a qu'une seule porte à chaque fois
    	sum(Porte, #=, 1).
     
    % on calcule la couleur et le poids correspondant
    etudie([], 0, 0, []).
     
    etudie([(C, N) | T], TC1, TN1, [A | TE]) :-
    	etudie(T, TC, TN, TE),
    	% la porte est choisie ou pas
    	A in 0..1,
    	TC1 #= A * C + TC,
    	TN1 #= A * N + TN.
     
    total([], 0, 0, 0, 0).
     
    total([C|T], B1, J1, R1, V1) :-
    	total(T, B, J, R, V),
    	% les couleurs sont présentes ou absentes
    	[NB, NJ, NR, NV] ins 0..1,
    	% il n'y en a qu'une
    	sum([NB, NJ, NR, NV], #=, 1),
    	C #= NB * 0  + NJ * 1 +  NR * 2 + NV * 4,
    	B1 #= B + NB,
    	J1 #= J + NJ,
    	R1 #= R + NR,
    	V1 #= V + NV.
     
     
    affiche(0) :-
           write('bleu ').
     
    affiche(1) :-
           write('jaune ').
     
    affiche(2) :-
           write('rouge ').
     
    affiche(4) :-
           write('vert ').
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  8. #8
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Dans le cas que tu presente, le graph est asser simple et tster toutes les combinaisons est tout a faisable

    Par contre le traitement des contraintes telles que tu les donnes me semble tout a fait impraticable avec du dijkstra dans un contexte généralisé

    Car il est possible a tout moment que tu n'ai pas d'autre solution que d'enfreindre une contrainte
    Dans ce cas tu est obligé de revenir en arriérre et tu risque de tomber dans une complexité O(n!)


    passer par les ellipses rouges au maximum 2 fois ;
    passer par les ellipses vertes au maximum 3 fois ;
    passer par les ellipses bleues au maximum 2 fois ;
    passer par les ellipses jaunes au maximum 2 fois.
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  9. #9
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par olibara Voir le message
    Dans le cas que tu presente, le graph est asser simple et tster toutes les combinaisons est tout a faisable

    Par contre le traitement des contraintes telles que tu les donnes me semble tout a fait impraticable avec du dijkstra dans un contexte généralisé

    Car il est possible a tout moment que tu n'ai pas d'autre solution que d'enfreindre une contrainte
    Dans ce cas tu est obligé de revenir en arriérre et tu risque de tomber dans une complexité O(n!)
    Je ne sais pas trop à qui tu t'adresses, mais il est évident que ma méthode ne peut être applicable pour un grand nombre d'étapes et d'ellipses différentes.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  10. #10
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut Trap_D

    Je m'adresse à l'intéressé évidement : sarmad354 , il est le seul a pouvoir evaluer le domaine de pertinence de son traitement

    Je n'ai honetement pas etudié ton algorithme mais je voulais aussi faire remarquer que la resolution de ce parcours avec les contraintes énoncées s'écartait a mon avis asser fort d'un Dijkstra classique

    Mais j'avoue aussi que c'était ma perception intuitive en y reflechissant bien je n'en suis plus si sur ..

    Si l'on applique diijkstra en remplacant le poids d'un noeud par le nombre de liberté par rapport au contraintes ca pourait peut etre le faire mais je n'ai pas joué a essayer
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  11. #11
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    merci Trap_D , olibara et ToTo13
    à titre d'information
    le nombre des ellipses peut dépasser 100 types (couleur)
    le nombres des ensemble peut aussi dépasser 10

    Citation Envoyé par olibara Voir le message
    Salut Trap_D
    Si l'on applique diijkstra en remplaçant le poids d'un nœud par le nombre de liberté par rapport au contraintes ca pourrait peut être le faire mais je n'ai pas joué a essayer
    plus d'explication SVP

    et merci pour tous le monde

  12. #12
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut

    Le principe de Dijkstra en gros c'est que sur chaque noeud tu inspecte le poids du parcours pour atteindre les noeud adjacent

    Le poids du noeud adjacent sera le poids cumulé du noeud courrant plus le poids pour l'atteindre

    Ces poids sont stockés dans une file d'attente et a chaque itération on prends dans la file le noeud du poids le plus faible (dont on a conservé le parent) qui disparait de la liste et que l'on ne va plus retraverser

    Quand on arrive a destination on refait le parcours a l'envers et l'on obtient le meilleur parcours selon la contrainte d'evaluation de poids

    Dans ton cas j'entrevois d'evaluer le poids selon le nombre de contraintes "consommées" pour chaque type de noeud
    Si une limite est dépassée le poids devient infini
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  13. #13
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par sarmad354 Voir le message
    à titre d'information
    le nombre des ellipses peut dépasser 100 types (couleur)
    le nombres des ensemble peut aussi dépasser 10
    Alors tu oublies ma méthode hélas
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  14. #14
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par olibara Voir le message
    Dans ton cas j'entrevois d'evaluer le poids selon le nombre de contraintes "consommées" pour chaque type de noeud
    Si une limite est dépassée le poids devient infini
    "Si une limite est dépassée le poids devient infini"
    est ce que vous parlez du poids du nœud visité

  15. #15
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Je ne me suis pas amusé a faire l'exercice
    Mais je dirais que si l'on inspecte un noeud qui va enfreindre une contrainte on ne le met pas dans la file d'attente et son poids devient infini via le parent actuel

    Pour le reste c'est un exercice Dijkstra a mettre en musique, a toi d'essayer
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  16. #16
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par olibara Voir le message
    Je ne me suis pas amusé a faire l'exercice
    Mais je dirais que si l'on inspecte un noeud qui va enfreindre une contrainte on ne le met pas dans la file d'attente et son poids devient infini via le parent actuel

    Pour le reste c'est un exercice Dijkstra a mettre en musique, a toi d'essayer
    je pense que ce truc est valable si la contrainte est de passer par la même couleur une seule fois
    mais pour plus???????

  17. #17
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Citation Envoyé par sarmad354 Voir le message
    je pense que ce truc est valable si la contrainte est de passer par la même couleur une seule fois
    mais pour plus???????
    Ben non pourquoi ?
    Si tu a un compteur de poids par couleur et par noeud et une methode d'aggregation qui evalue l'indice de liberté, je ne vois pas encore ce qui peut bloquer ?
    Mais c'est vrai que cent compteurs par noeud ca peut faire un peu lourd
    C'est en plus toi qui proposait Dijkstra ... Tu a déja fait des parcours de graph avec Dijkstra ?

    Mais j'espere avoir bien compris qu'on ne peut passer qu'une seule fois par le meme noeud !!
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

Discussions similaires

  1. Calcul de plus court chemin dans un graphe
    Par Elmilouse dans le forum Prolog
    Réponses: 6
    Dernier message: 21/03/2010, 20h26
  2. Plus court chemin dans un graphe avec contraintes
    Par tomjr dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 30/12/2009, 12h36
  3. N plus courts chemin dans un graphe
    Par MLK jr dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 13/03/2006, 00h32
  4. [algo] plus courts chemins (au pluriel !!)
    Par ADSL[fx] dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 18/01/2006, 14h40
  5. Réponses: 2
    Dernier message: 21/03/2004, 18h57

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