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 :

Recherche de chemins satisfaisant plusieurs critères : algorithme de Dijkstra, métaheuristique, ... ?


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2011
    Messages : 68
    Par défaut Recherche de chemins satisfaisant plusieurs critères : algorithme de Dijkstra, métaheuristique, ... ?
    Bonjour tout le monde,

    J'ai une problématique par rapport aux liaisons téléphoniques.

    Existe-t-il un algorithme qui permet de trouver plusieurs chemins (2 ou 3) selon deux critères :
    • les chemins les moins encombrés entre 2 sites,
    • les chemins ayant une capacité maximale entre 2 sites en même temps.


    Ainsi, l'algorithme proposera plusieurs solutions, étant donné qu'il effectue une recherche multicritère.

    L'algorithme de Dijkstra permet de trouver un seul chemin le plus court donc une seule solution, les algorithmes métaheuristiques permettent ce genre de recherche ? Ou un mélange entre Dijkstra et un algo métaheuristique ?

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Pourquoi ne pas simplement refaire un recherche par Dijkstra, en supprimant le chemin trouvé précédemment (i.e. mettre un poids infini aux arcs utilisés) ?
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Membre Expert
    Avatar de Franck Dernoncourt
    Homme Profil pro
    PhD student in AI @ MIT
    Inscrit en
    Avril 2010
    Messages
    894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PhD student in AI @ MIT
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 894
    Par défaut Algorithme évolutionniste
    La difficulté est d'introduire plusieurs objectifs : supprimer le chemin trouvé précédemment permet juste d'avoir plusieurs solutions.

    Je ne vois pas d'algorithme classique permettant de trouver les chemins satisfaisant plusieurs critères. Personnellement j'essaierai avec un algorithme évolutionniste multi-objectif mais je ne l'ai jamais appliqué pour de la recherche de chemin sur un graphe, je ne sais pas à quel point cela serait efficace. Une bonne idée serait probablement de mettre dans la population initiale des solutions trouvées par Dijkstra selon chacun des critères. L'algorithme évolutionniste te donnera ainsi un front de Pareto de solutions.



    Voici un exemple d'implémentation d'un algorithme évolutionniste pour de la recherche de chemin, en l'occurence le problème du voyageur de commerce : http://khayyam.developpez.com/articl...rce/genetique/

    Tu peux également chercher sur Google "path finding multi-criteria" ou quelque chose du genre si tu ne l'as pas déjà fait, en complément des idées proposées dans ce thread.
    Images attachées Images attachées  

  4. #4
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2011
    Messages : 68
    Par défaut
    Citation Envoyé par Franck Dernoncourt Voir le message
    La difficulté est d'introduire plusieurs objectifs : supprimer le chemin trouvé précédemment permet juste d'avoir plusieurs solutions.

    Je ne vois pas d'algorithme classique permettant de trouver les chemins satisfaisant plusieurs critères. Personnellement j'essaierai avec un algorithme évolutionniste multi-objectif mais je ne l'ai jamais appliqué pour de la recherche de chemin sur un graphe, je ne sais pas à quel point cela serait efficace. Une bonne idée serait probablement de mettre dans la population initiale des solutions trouvées par Dijkstra selon chacun des critères. L'algorithme évolutionniste te donnera ainsi un front de Pareto de solutions.



    Voici un exemple d'implémentation d'un algorithme évolutionniste pour de la recherche de chemin, en l'occurence le problème du voyageur de commerce : http://khayyam.developpez.com/articl...rce/genetique/

    Tu peux également chercher sur Google "path finding multi-criteria" ou quelque chose du genre si tu ne l'as pas déjà fait, en complément des idées proposées dans ce thread.
    j'ai essayé de voir comme vous m'avez conseillé pour l’optimisation multicritère et j'ai pensé à regrouper toutes les critères en une seule fonctions avec plusieurs variables par exemple

    Maintenant reste à trouver un algorithme pour trouver une multitudes de solutions optimales sans avoir à supprimer les trajets.

  5. #5
    Membre Expert
    Avatar de Franck Dernoncourt
    Homme Profil pro
    PhD student in AI @ MIT
    Inscrit en
    Avril 2010
    Messages
    894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PhD student in AI @ MIT
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 894
    Par défaut
    Regrouper tous les critères en une seule fonctions avec plusieurs variables par exemple est souvent sous-optimal :



    Néanmoins effectivement cela te permettra d'utiliser directement l'algorithme de Dijkstra, ce qui sera probablement beaucoup plus simple pour toi.
    Images attachées Images attachées  

  6. #6
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2011
    Messages : 68
    Par défaut
    Citation Envoyé par Franck Dernoncourt Voir le message
    Regrouper tous les critères en une seule fonctions avec plusieurs variables par exemple est souvent sous-optimal :



    Néanmoins effectivement cela te permettra d'utiliser directement l'algorithme de Dijkstra, ce qui sera probablement beaucoup plus simple pour toi.

    Je ne pense pas que ça va être sous optimal , la fonction dont je parle me permettra juste de mettre un poids sur les segments et c’est à moi de définir comment ce poids sera calculé .

    mais après quelque soit le poids des segments la recherche des chemins est la même

    Je ne pense pas que ça va être plus simple puisque Dijkstra ne permet pas de trouver plusieurs solutions optimales

  7. #7
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2011
    Messages : 68
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Pourquoi ne pas simplement refaire un recherche par Dijkstra, en supprimant le chemin trouvé précédemment (i.e. mettre un poids infini aux arcs utilisés) ?
    Merci pseudocode pour votre réponse

    La solution que vous avez proposé n'est pas optimale parceque si on supprime le chemin completement la autres alternative ne réutiliseront aucun des segments supprimés . Cependant si le chemin avait 6 segments par exemple il se peut q'un bon chemin alternatif en reutilise 1 ou 2

  8. #8
    Membre régulier
    Homme Profil pro
    Doctorant
    Inscrit en
    Juin 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2008
    Messages : 12
    Par défaut Algo de labelling
    Citation Envoyé par camelia136 Voir le message
    Bonjour tout le monde,

    J'ai une problématique par rapport aux liaisons téléphoniques.

    Existe-t-il un algorithme qui permet de trouver plusieurs chemins (2 ou 3) selon deux critères :
    • les chemins les moins encombrés entre 2 sites,
    • les chemins ayant une capacité maximale entre 2 sites en même temps.


    Ainsi, l'algorithme proposera plusieurs solutions, étant donné qu'il effectue une recherche multicritère.

    L'algorithme de Dijkstra permet de trouver un seul chemin le plus court donc une seule solution, les algorithmes métaheuristiques permettent ce genre de recherche ? Ou un mélange entre Dijkstra et un algo métaheuristique ?
    Il existe (sauf erreur de ma part ) un moyen pour résoudre ce problème de manière exacte à l'aide d'un algorithme de labelling :

    Un label va définir un chemin partiel. Un label est composé de différent éléments :
    -un pointeur vers le noeud ou ce chemin partiel fini : $N$
    -un pointeur vers le label représentant ce chemin partiel finissant sur le noeud précédent du chemin partiel : $Lp$
    -une variable $c_i$ qui va stocker le cout de ce chemin partiel pour chacun de tes critères $i$

    On va définir le concept de domination, un label L domine un label L' si n'importe quel chemin issue de L' aura un cout supérieur ou égale pour chaque critère au(x) meilleur(s) chemin issues de L une fois arrivé au noeud puits. Dans ce cas si tu considère que le parcours d'un arc à un coût positif ou nul tu peux dire que L domine L' si :
    L et L' représentent un chemin partiel finissant sur le même noeud et le coût de chaque critère pour L est inférieur ou égale à celui de L' avec au moins une de ces égalité étant stricte.

    Du coup ton algo va se dérouler de la manière suivante :
    Initiallement tu part avec un seul Label étant sur ton noeuds source et ayant un coût de 0 pour chacun des critères.

    A chaque pas tu étant tout les labels non dominés, n'ayant pas encore été étendu, à tout leur voisins n'appartenant pas déjà au chemin partiel représenté par le Label non dominé que tu étend.
    Pour tout les label créés tu va les comparer à tous les label non dominé. Si tu détecte des label dominé tu peux les retirer.
    Ton algorithme est terminé quand tu ne peux plus étendre aucun label non dominé. A ce moment tout les Label représentant un chemin terminant sur le noeud puit non dominé représentent ton front Pareto.

    Bon, je suis pas sur d'avoir été clair, ni que cette approche soit la plus efficace pour trouver le front pareto pour ce problème...

    Bon courage

  9. #9
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2011
    Messages : 68
    Par défaut
    Citation Envoyé par Branch Voir le message
    Il existe (sauf erreur de ma part ) un moyen pour résoudre ce problème de manière exacte à l'aide d'un algorithme de labelling :

    Un label va définir un chemin partiel. Un label est composé de différent éléments :
    -un pointeur vers le noeud ou ce chemin partiel fini : $N$
    -un pointeur vers le label représentant ce chemin partiel finissant sur le noeud précédent du chemin partiel : $Lp$
    -une variable $c_i$ qui va stocker le cout de ce chemin partiel pour chacun de tes critères $i$

    On va définir le concept de domination, un label L domine un label L' si n'importe quel chemin issue de L' aura un cout supérieur ou égale pour chaque critère au(x) meilleur(s) chemin issues de L une fois arrivé au noeud puits. Dans ce cas si tu considère que le parcours d'un arc à un coût positif ou nul tu peux dire que L domine L' si :
    L et L' représentent un chemin partiel finissant sur le même noeud et le coût de chaque critère pour L est inférieur ou égale à celui de L' avec au moins une de ces égalité étant stricte.

    Du coup ton algo va se dérouler de la manière suivante :
    Initiallement tu part avec un seul Label étant sur ton noeuds source et ayant un coût de 0 pour chacun des critères.

    A chaque pas tu étant tout les labels non dominés, n'ayant pas encore été étendu, à tout leur voisins n'appartenant pas déjà au chemin partiel représenté par le Label non dominé que tu étend.
    Pour tout les label créés tu va les comparer à tous les label non dominé. Si tu détecte des label dominé tu peux les retirer.
    Ton algorithme est terminé quand tu ne peux plus étendre aucun label non dominé. A ce moment tout les Label représentant un chemin terminant sur le noeud puit non dominé représentent ton front Pareto.

    Bon, je suis pas sur d'avoir été clair, ni que cette approche soit la plus efficace pour trouver le front pareto pour ce problème...

    Bon courage

    Merci Branch pour ta réponse

    En fait j'ai décidé de reduire mes 2 critères en une seule fonction les rassemblant toutes les 2 avec des pourcentages que l'utilisateur va definir ,
    ta methode que je n'ai pas tres bien compris permet-elle de trouver de multiples solutions ?

  10. #10
    Membre régulier
    Homme Profil pro
    Doctorant
    Inscrit en
    Juin 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2008
    Messages : 12
    Par défaut
    Citation Envoyé par camelia136 Voir le message
    Merci Branch pour ta réponse

    En fait j'ai décidé de reduire mes 2 critères en une seule fonction les rassemblant toutes les 2 avec des pourcentages que l'utilisateur va definir ,
    ta methode que je n'ai pas tres bien compris permet-elle de trouver de multiples solutions ?
    Oui, en fait cette méthode te permet de trouver l'ensemble des solutions non dominées de ton problème (une solution est non dominé s'il n'existe aucune autre solution meilleure ou équivalente sur tout les critères).

    Après si ton graphe comporte un grand nombre de noeuds/arcs cette approche risque d'être très consommatrice en temps comme en mémoire. Cependant tu peux accélérer son execution (au prix de la garantie d'optimalité de la solution) en ne considérant pas certains arcs (parce que tu considère qu'ils ont a priori un coup trop important pour appartenir à une solution non dominé).

  11. #11
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2011
    Messages : 68
    Par défaut
    Citation Envoyé par Branch Voir le message
    Oui, en fait cette méthode te permet de trouver l'ensemble des solutions non dominées de ton problème (une solution est non dominé s'il n'existe aucune autre solution meilleure ou équivalente sur tout les critères).

    Après si ton graphe comporte un grand nombre de noeuds/arcs cette approche risque d'être très consommatrice en temps comme en mémoire. Cependant tu peux accélérer son execution (au prix de la garantie d'optimalité de la solution) en ne considérant pas certains arcs (parce que tu considère qu'ils ont a priori un coup trop important pour appartenir à une solution non dominé).
    Branch,

    Comment definir un chemin partiel à partir de mon graphe initial ?

    Mon graphe peut comporter 100 noeuds et plus

  12. #12
    Membre régulier
    Homme Profil pro
    Doctorant
    Inscrit en
    Juin 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2008
    Messages : 12
    Par défaut
    Citation Envoyé par camelia136 Voir le message
    Branch,

    Comment definir un chemin partiel à partir de mon graphe initial ?

    Mon graphe peut comporter 100 noeuds et plus

    Bon, voila un exemple simple pour illustrer le fonctionnement de l'algo que je propose. Tu considère le graphe présent sur l'image, pour chaque arc, on considère le cout de son parcourt pour chacun des criteres (cout critere 1, cout critere 2). On va chercher toutes les solutions non dominées de chemins entre le noeud S et le noeud P.

    Nom : exMultiCritere.png
Affichages : 1985
Taille : 12,8 Ko

    Etape 1 on part avec un seul Label :
    L_0 = [S,{},0,0]

    Etape 2, j'étend les Label non dominé non encore étendu (L_0) :

    L_0 -> L_1 = [A, L_0, 1, 4]

    L_1 n'est dominé et ne domine aucun Label

    L_0 -> L_2 = [B, L_0, 4, 1]

    L_2 n'est dominé et ne domine aucun Label.

    j'étend les Label non dominé non encore étendu (L_1, L_2) :

    L_1 -> L_3 = [D, L_1, 2, 5]

    L_3 n'est dominé et ne domine aucun Label.

    L_1 -> L_4 = [C, L_1, 2, 5]

    L_4 n'est dominé et ne domine aucun Label.

    L_2 -> L_5 = [C, L_2, 5, 2]

    L_5 n'est dominé et ne domine aucun Label.

    L_2 -> L_6 = [D, L_2, 14, 11]

    L_6 est dominé par L_3 car ces deux chemins partiels finissent sur le même noeud et que L_6 a un cout supérieur à celui de L_3 pour tout les critères.

    j'étend les Label non dominé non encore étendu (L_3, L_4, L_5) :

    L_3 -> L_7 = [P, L_3, 2, 7]

    L_7 n'est dominé et ne domine aucun Label.

    L_4 -> L_8 = [P, L_4, 3, 6]

    L_8 n'est dominé et ne domine aucun Label.

    L_5 -> L_9 = [P, L_5, 6, 3]

    L_9 n'est dominé et ne domine aucun Label.

    Aucun Label non dominé ne peut être étendu. Les 3 chemins non dominés sont ceux représenté par les Label L_7, L_8 et L_9.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Recherche de plusieurs critères dans un recordset
    Par Mariboo dans le forum Access
    Réponses: 13
    Dernier message: 21/05/2017, 12h50
  2. Recherche de ligne selon plusieur critères
    Par djo007 dans le forum Excel
    Réponses: 5
    Dernier message: 25/03/2012, 19h15
  3. Recherche se basant sur plusieurs critéres!
    Par rach20032 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 21/09/2007, 00h55
  4. [Conception] soucis avec mon code de recherche par un ou plusieurs critères
    Par jolipepage75 dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 11/06/2006, 02h59
  5. Algorithme de recherche de chemin
    Par amelie gaya dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 09/06/2002, 15h29

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