Je ne suis pas un théoricien de l'informatique, mais je pense que ce problème du monde réel appartient ici.
Le problème
Mon entreprise possède plusieurs unités à travers le pays.
Nous avons offert aux employés la possibilité de travailler sur une autre unité. Mais il y a une condition: le nombre total de travailleurs dans une unité ne peut pas changer.
Cela signifie: nous autoriserons un employé à quitter son unité si quelqu'un veut sa place.
Exemple de données de demande (fictives):
Name Origin Destination
Maria 1 -> 2
Marcos 2 -> 3
Jones 3 -> 4
Terry 4 -> 5
Joe 5 -> 6
Rodrigo 6 -> 1
Barbara 6 -> 1
Marylin 1 -> 4
Brown 4 -> 6
Benjamin 1 -> 3
Lucas 4 -> 1
Ce qui précède, tracé:
Voyez comment nous devons choisir entre les options rouge, bleu ou noir?
Le vrai problème est un peu plus complexe, car nous avons 27 unités et 751 demandes. Veuillez jeter un œil à la visualisation
Le but
Après avoir collecté toutes les demandes, comment satisfaire la plupart d'entre elles?
Application de la théorie (?)
Ayant le graphe , soit chaque unité soit un sommet V et une requête un bord dirigé E , un échange réussi prendra la forme d'un cyle dirigé.
Chaque cycle ne doit utiliser qu'une seule fois ( un travailleur ne peut pas quitter son unité deux fois ), mais peut visiter V plusieurs fois ( une unité peut avoir de nombreux travailleurs qui souhaitent quitter ).
La question
Si ce problème est exprimé comme
"Comment trouver les cycles qui, ensemble, impliquent le plus grand nombre d'arêtes non partagées dans un graphe orienté"?
Allons-nous satisfaire la plupart des demandeurs?
Cela étant vrai, il existe un algorithme pour trouver cet ensemble optimal de cycles?
Cette approche greddy résoudra-t-elle le problème?
- Trouvez le plus grand cycle dirigé sur ;
- Retirez ses bords de ;
- Répétez 1 jusqu'à ce qu'il n'y ait pas de cycle dirigé sur ;
Pouvez-vous m'aider?
Connaissez-vous une autre façon de décrire le problème d'origine (rendre la plupart des demandeurs heureux)?
Edit : changé de département en unité, pour mieux décrire le problème.
Réponses:
OK, j'ai lu le code de TradeMaximizer et je crois qu'il résout le problème plus général suivant.
Pour résoudre la question posée ici, faites des sommets des employés et tracez un arc de coût unitaire lorsque x aimerait le travail de y . Notez que les employés sont désormais des sommets plutôt que des arêtes. Ce qui est bien, c'est qu'un employé peut dire "Je veux vraiment le travail de y , mais celui de z le ferait aussi".x→y x y y z
Solution:
Construisez un graphique bipartite comme suit: Pour chaque sommet dans le graphique d'origine, introduisez un sommet gauche x L , un sommet droit x R et un arc x L → x R dont le coût est énorme (supérieur à la somme des coûts dans l'original graphique). Pour chaque arc x → y dans le graphe d'origine, introduisez un arc x L → y R dans le graphe biparti.x xL xR xL→xR x→y xL→yR
Trouvez une correspondance parfaite de coût minimum dans le graphique bipartite.
Il existe également un prétraitement du graphique d'origine: supprimez les arcs entre les SCC, puis traitez tous les SCC de taille comme indiqué ci-dessus.>1
(En fait, TradeMaximizer itère sur toutes les solutions optimales, selon les deux critères ci-dessus, afin d'optimiser heuristiquement d'autres choses, telles que la longueur du plus grand cycle. Les gros cycles augmentent les chances qu'un «deal» ne passe pas par personne change d'avis.)
PS: L'auteur, Chris Okasaki, a confirmé que c'est ce que fait le code, de retour sur le blog .
la source
Il s'agit d'un problème de circulation à coût minimum standard. Donnez à chaque bord dirigé la capacité et le coût - 11 −1 . Une circulation réalisable est alors une somme (c.-à-d., Union) de cycles dirigés disjoints, et le coût de la circulation est la négation du nombre de bords.
Parce que tous les coûts et capacités sont limités par des constantes, un simple algorithme d'annulation de cycle trouvera la circulation requise en temps polynomial. C'est presque la même chose que l'algorithme gourmand évident:
Ce n'est pas l'algorithme le plus rapide connu.
la source
Cette approche gourmande ne donnera pas toujours la meilleure solution.
la source
il y a probablement une méthode / formulation de théorie des graphes pour résoudre ce problème, mais ce problème ressemble plus à un problème de permutation pour moi où certaines de toutes les permutations sont rejetées et d'autres sont valides. les permutations sont des employés et les postes sont des "postes" dans l'entreprise. une permutation est rejetée si elle ne correspond pas aux exigences de "la personne [x] veut la position [y]". la distinction des limites unités / départements / organisation est apparemment quelque peu superflue dans ce cas.
ce type de problème de permutation avec contraintes peut être facilement converti en une instance de problème SAT (satisfiabilité). les affectations de variables booléennes représentent les employés et les clauses de contrainte représentent les contraintes "personne [x] veut position [y]". il y a des exemples classiques à proximité de cela, l'un généralement appelé le problème de la "table de dîner" où vous avez des places assises et des invités et tous les invités ne veulent pas s'asseoir côte à côte (ou de manière très similaire certains invités veulent s'asseoir à côté d'autres invités).
et bien sûr, il existe des solveurs SAT sophistiqués pour des instances assez importantes impliquant jusqu'à des centaines de variables et de clauses, sur PC, et si le problème n'est pas "difficile", par milliers.
voir par exemple [1] pour une référence professionnelle et [2] pour un exercice en classe. il y a aussi une certaine similitude structurelle avec ce que l'on appelle des "problèmes de pigeonniers" qui sont bien étudiés dans les cercles SAT où les pigeons sont affectés à des pigeonniers et où vous avez plus ou moins de trous que les pigeons. dans ce cas, cependant, les pigeons sont généralement considérés comme interchangeables. en d'autres termes, le problème de la table du dîner est comme le problème des pigeonniers avec des contraintes plus fortes et les invités / pigeons ont des préférences requises.
notez bien sûr / gardez à l'esprit que pour ces types de problèmes, en fonction des contraintes, la réponse peut être "aucune solution contrainte de ce type n'existe".
[1] l'algorithme de table de dîner, par crato
[2] CS402 princeton HW SAT
[3] Problème de satisfaction, wikipedia
la source