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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 22
    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 : 46
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    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 averti
    Inscrit en
    Novembre 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 22
    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 944
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 944
    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 averti
    Inscrit en
    Novembre 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 22
    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 944
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 944
    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 944
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 944
    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 expérimenté
    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
    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.

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 944
    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

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, 21h26
  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, 13h36
  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, 01h32
  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, 15h40
  5. Réponses: 2
    Dernier message: 21/03/2004, 19h57

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