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 :

Algorithme pour trouver efficacement le matching complet (appairement) optimal ?


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3
    Par défaut Algorithme pour trouver efficacement le matching complet (appairement) optimal ?
    Bonjour,

    Je cherche un algorithme qui permettrait de trouver efficacement un matching optimal. Plus précisément, voici mon problème:

    On dispose de 2*n éléments que l'on souhaite regrouper en n paires. À chaque paire d'éléments (i, j) (i != j) est associé un coût c_ij, et on souhaite minimiser la somme des coûts des paires choisies. (toutes les paires (i, j) sont possibles)

    Ce problème peut également être vu comme un problème de graphe où les éléments sont les noeuds et les paires sont les arrêtes. Sous cette forme on recherche donc un matching complet (chaque élément appartient à un arc du matching) optimal (la somme des arcs choisis est minimum).

    Évidemment il est très facile de trouver un algo en O(n!) mais j'ai besoin de quelque chose de beaucoup plus efficace, alors je voudrais savoir s'il y a un algorithme connu pour le faire ? Idéalement un algo en complexité temporelle polynomiale... (je prie donc pour que ce ne soit pas un problème NP-Complet...)

    Ce qui m'intéresse c'est surtout de connaître la valeur de la fonction objectif à l'optimum, mais avoir une borne inférieure (assez proche quand même évidemment ) serait déjà pas mal :-)

  2. #2
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 78
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    Soit f(n) le nombre de paires possibles:
    f(n)= (2n)*(2n+1)/2
    donc f(n) est en n*n.
    Trier le tableau des coûts correspondants par Quicksort
    l'algo est donc en f(n)*log(f(n)).
    On reste en n*n*log(n).
    Puis on prend le plus petit élément du tableau trié et la paire correspondante, et on élimine du tableau trié tous les coûts correspondant à des paires référencant un des éléments de la première paire choisie.et ainsi de suite jusqu'à épuisement.
    Les test seront donc au maximum en :
    f(n)+(f(n)-1)+(f(n)-2) + ..... + 2 + 1
    soit en f(n)*(f(n)+1)/2
    donc en n puissance 4
    comme n*n*log(n) est négligeable devant n*n*n*n
    On doit rester en n puissance 4.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 488
    Par défaut
    Bonjour,

    Est-ce que chaque élément d'une paire appartient à un ensemble différent (graphe bipartite complet) ?

  4. #4
    Membre chevronné
    Profil pro
    Directeur Scientifique
    Inscrit en
    Avril 2005
    Messages
    419
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur Scientifique

    Informations forums :
    Inscription : Avril 2005
    Messages : 419
    Par défaut
    C'est polynomial.

    Pour un graphe général, il y a l'algorithme de Gabow:
    http://elib.zib.de/pub/Packages/math...hing/weighted/

    Vu que tu sélectionne n paires, les problèmes de minimisation et maximisation sont équivalents.

    Je ne pense pas qu'on puisse tirer parti du fait que ton graphe ait l'air complet (puisqu'on peut rendre un graphe non complet en un gaphe complet avec des arêtes de coût très grand).

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3
    Par défaut
    Merci beaucoup pour vos réponses, je pense que je suis sur la bonne voie.

    Zavonen: oui, j'avais aussi pensé à un algorithme similaire mais je me suis vite rendu compte qu'il n'était pas optimal:
    suppose que tu as 4 noeuds A, B, C et D avec les coûts suivants:
    A-B = 0
    A-C = B-D = 1
    C-D = 4
    (les autres coûts sont supposés infinis)
    ton algo choisit A-B et C-D pour un coût total de 4, alors qu'il existe une meilleure solution avec A-C et B-D pour un coût de 2.

    sovitec: non il n'est pas biparti (je pensais que c'était évident d'après ma description)

    Francis: merci pour ta réponse, cela semble être ce que je cherchais. Le site que tu donnes fournit une implémentation en C qui ne me paraît pas des plus claires, et comme c'est à utiliser dans un programme java ça ne me conviendra pas... Enfin cela m'a bien aidé à orienter ma recherche, même si dans la plupart des cas je suis tombé sur des articles de chercheurs généralement pas piqués des vers (en gros faut se farcir toute la théorie et ça j'en ai pas vraiment besoin...)

    Pour ceux que cela intéresse, voici le fruit de mes recherches sur le net:


    Je vais marquer ce sujet comme résolu mais si d'autres ont déjà eu une expérience avec ce problème, cela me ferait plaisir d'avoir encore des réponses

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Par défaut
    Bonjour

    Ton problème est équivalent à un problème d'affectation avec des coûts infinis sur la diagonale. C'est un problème polynomial résolu en O(n^3)
    http://en.wikipedia.org/wiki/Assignment_problem "The assignment problem is finding a maximum weight matching in a weighted bipartite graph."

  7. #7
    Membre chevronné
    Profil pro
    Directeur Scientifique
    Inscrit en
    Avril 2005
    Messages
    419
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur Scientifique

    Informations forums :
    Inscription : Avril 2005
    Messages : 419
    Par défaut
    Citation Envoyé par CedricMocquillon
    Bonjour

    Ton problème est équivalent à un problème d'affectation avec des coûts infinis sur la diagonale. C'est un problème polynomial résolu en O(n^3)
    http://en.wikipedia.org/wiki/Assignment_problem "The assignment problem is finding a maximum weight matching in a weighted bipartite graph."
    Justement, là, le graphe n'est pas biparti... mais le problème est également résolu en O(n^3) avec les algorithmes cités ci-dessus. La principale différence, c'est que dans le cas du graphe biparti, il suffit de trouver des chemins augmentants alors que dans les graphes généraux, on a besoin de "blossoms" (circuit de longueur impaire)

  8. #8
    Membre chevronné
    Profil pro
    Directeur Scientifique
    Inscrit en
    Avril 2005
    Messages
    419
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur Scientifique

    Informations forums :
    Inscription : Avril 2005
    Messages : 419
    Par défaut
    Denis Lapoire vient de mettre en ligne un excellent cours sur la théorie des graphes qui traite de ce problème dans le chapitre 11.
    http://lapoire.developpez.com/algorithmique/graphes/

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

Discussions similaires

  1. Algorithme pour trouver les racines
    Par Bob123 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 23/09/2010, 09h42
  2. quel algorithme pour trouver le plus grand sous arbres commun à des arbres?
    Par iwky911 dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 20/05/2009, 21h08
  3. problème d'algorithme pour trouver les circuit d'un graphe
    Par marc_dd dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 21/08/2006, 16h36
  4. algorithme pour trouver la mediane ?
    Par Battosaiii dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 04/07/2006, 10h22
  5. Algorithme pour trouver i entier tel que n + i² est un carré
    Par duchere dans le forum Algorithmes et structures de données
    Réponses: 16
    Dernier message: 22/04/2006, 08h24

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