Ich bin kein Theoretiker der Informatik, aber denke, dass dieses Problem der realen Welt hierher gehört.
Das Problem
Meine Firma hat mehrere Einheiten im ganzen Land.
Wir haben den Mitarbeitern die Möglichkeit geboten, an einer anderen Einheit zu arbeiten. Aber es gibt eine Bedingung: Die Gesamtzahl der Arbeiter in einer Einheit kann sich nicht ändern.
Das heißt: Wir erlauben einem Mitarbeiter, seine Einheit zu verlassen, wenn jemand seinen Platz will.
Beispiel (fiktive) Anforderungsdaten:
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
Das oben Gezeichnete:
Sehen Sie, wie wir zwischen den Optionen Rot, Blau oder Schwarz wählen müssen?
Das eigentliche Problem ist etwas komplexer, da wir 27 Einheiten und 751 Anfragen haben. Bitte schauen Sie sich die Visualisierung an
Das Ziel
Wenn Sie alle Anfragen gesammelt haben, wie können Sie die meisten davon befriedigen?
Theorie (?) Anwendung
Mit Graph sei jede Einheit ein Vertex und eine Anfrage eine gerichtete Kante , ein erfolgreicher Austausch wird die Form eines gerichteten Cylus annehmen.
Jeder Zyklus darf nur einmal verwenden ( ein Arbeiter kann seine Einheit nicht zweimal verlassen ), sondern kann mehrmals besuchen ( eine Einheit kann viele Arbeiter haben, die gehen wollen ).V
Die Frage
Wenn dieses Problem ausgedrückt wird als
"Wie finde ich die Zyklen, die zusammen die meisten nicht gemeinsam genutzten Kanten in einem gerichteten Graphen enthalten?"
Werden wir die meisten Anfragenden zufrieden stellen?
Wenn das stimmt, gibt es einen Algorithmus, um diese optimale Menge von Zyklen zu finden?
Wird dieser greddy Ansatz das Problem lösen?
- Finde den größten gerichteten Zyklus auf ;
- Entferne die Kanten von ;
- Wiederholen Sie 1, bis auf kein gerichteter Zyklus mehr vorliegt .
Können Sie mir helfen?
Kennen Sie einen anderen Weg, um das ursprüngliche Problem zu beschreiben (was die meisten Anfragenden glücklich macht)?
Bearbeiten : Abteilung in Einheit geändert, um das Problem besser zu beschreiben.
Antworten:
OK, ich habe den Code von TradeMaximizer gelesen und glaube, er löst das folgende, allgemeinere Problem.
Um die hier gestellte Frage zu lösen, machen Sie die Eckpunkte zu Mitarbeitern und zeichnen Sie einen Bogen der Stückkosten, wenn x den Job von y haben möchte . Beachten Sie, dass Mitarbeiter jetzt eher Eckpunkte als Kanten sind. Das Schöne ist, dass ein Mitarbeiter sagen kann: "Ich möchte wirklich den Job von y , aber der von z würde es auch tun."x→y x y y z
Lösung:
Erstellen Sie ein zweigliedriges Diagramm wie folgt: Fügen Sie für jeden Scheitelpunkt im Originaldiagramm einen linken Scheitelpunkt x L , einen rechten Scheitelpunkt x R und einen Bogen x L → x R ein, dessen Kosten sehr hoch sind (größer als die Summe der Kosten im Original) Graph). Fügen Sie für jeden Bogen x → y im Originaldiagramm einen Bogen x L → y R in das zweigeteilte Diagramm ein.x xL xR xL→xR x→y xL→yR
Finden Sie im zweigliedrigen Diagramm eine perfekte Übereinstimmung zu den Mindestkosten.
Es gibt auch eine gewisse Vorverarbeitung des Originaldiagramms: Entfernen Sie Bögen zwischen SCCs und verarbeiten Sie dann alle SCCs der Größe wie oben angegeben.>1
(Tatsächlich durchläuft TradeMaximizer alle optimalen Lösungen gemäß den beiden oben genannten Kriterien, um andere Dinge wie die Länge des größten Zyklus heuristisch zu optimieren. Große Zyklen erhöhen die Wahrscheinlichkeit, dass ein "Deal" nicht durchläuft, weil einer Person ändert ihre Meinung.)
PS: Der Autor, Chris Okasaki, bestätigte, dass dies der Code ist, zurück im Blog-Post .
quelle
Dies ist ein Standardproblem bei der Minimalkostenauflage. Geben jeweils gerichtete Kante Kapazität und die Kosten - 1 . Dann ist eine mögliche Zirkulation eine Summe (dh Vereinigung) von kantengetrennten gerichteten Zyklen, und die Kosten der Zirkulation sind die Negation der Anzahl von Kanten.1 −1
Da alle Kosten und Kapazitäten durch Konstanten begrenzt sind, findet ein einfacher Algorithmus zum Löschen von Zyklen die erforderliche Zirkulation in Polynomzeit. Dies ist fast dasselbe wie der offensichtliche Greedy-Algorithmus:
Dies ist nicht der schnellste bekannte Algorithmus.
quelle
Dieser gierige Ansatz bietet nicht immer die beste Lösung.
Nebenbei: Anstatt im obigen Beispiel zwei Zyklen hinzuzufügen, können Sie auch hinzufügen⌊n2⌋
quelle
Es gibt wahrscheinlich eine graphentheoretische Methode / Formulierung, um dies zu lösen, aber dieses Problem klingt für mich eher nach einem Permutationsproblem, bei dem einige aller Permutationen abgelehnt werden und andere gültig sind. Die Permutationen sind Mitarbeiter und die Positionen sind "Positionen" im Unternehmen. Eine Permutation wird abgelehnt, wenn sie nicht den Anforderungen von "Person [x] will Position [y]" entspricht. Die Unterscheidung von Einheiten / Abteilungen / Organisationsgrenzen ist in diesem Fall anscheinend etwas überflüssig.
Diese Art von Permutationsproblem mit Einschränkungen kann leicht in ein SAT-Problem (Erfüllbarkeitsproblem) umgewandelt werden. Die booleschen Variablenzuweisungen stellen Mitarbeiter dar, und die Einschränkungsklauseln stellen die Einschränkungen "Person [x] möchte Position [y]" dar. Es gibt in der Nähe klassische Beispiele dafür, eines, das üblicherweise als "Esstisch" -Problem bezeichnet wird, bei dem Sie Sitzpositionen und Gäste haben und nicht alle Gäste nebeneinander sitzen möchten (oder in ähnlicher Weise einige Gäste neben anderen Gästen sitzen möchten).
und natürlich gibt es hochentwickelte SAT-Löser für relativ große Instanzen, die ungefähr Hunderte von Variablen und Klauseln auf dem PC beinhalten, und wenn das Problem nicht "schwer" ist, zu Tausenden.
Siehe zB [1] für eine professionelle Referenz und [2] für eine Klassenübung. Es gibt auch eine gewisse strukturelle Ähnlichkeit mit sogenannten "Taubenlochproblemen", die in SAT-Kreisen gut untersucht werden, in denen Tauben einem Taubenloch zugeordnet sind und Sie mehr oder weniger Löcher als Tauben haben. in diesem Fall werden die Tauben jedoch allgemein als austauschbar angesehen. Mit anderen Worten, das Tischproblem ist wie das Taubenlochproblem mit den stärkeren Einschränkungen, und die Gäste / Tauben haben Präferenzen gefordert.
Beachten Sie natürlich, dass für diese Art von Problemen in Abhängigkeit von den Einschränkungen die Antwort "Es gibt keine solche eingeschränkte Lösung" sein kann.
[1] der dinner table algorithm von crato
[2] CS402 Princeton HW SAT
[3] Zufriedenheitsproblem, Wikipedia
quelle