Wie finde ich die Zyklen, die zusammen die meisten nicht gemeinsam genutzten Kanten in einem gerichteten Graphen beinhalten?


26

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: Visualisierung der obigen Daten

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.G(V,E)VE

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 ).VEV

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?

  1. Finde den größten gerichteten Zyklus auf ;G
  2. Entferne die Kanten von ;G
  3. Wiederholen Sie 1, bis auf kein gerichteter Zyklus mehr vorliegt .G

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.


3
Sind Sie sicher, dass Sie vermeiden möchten, dieselbe Kante mehr als einmal zu verwenden? Aus Ihrer Beschreibung der Anwendung geht hervor, dass Sie vermeiden sollten, denselben Scheitelpunkt mehr als einmal zu verwenden, was eine stärkere Bedingung darstellt.
Tsuyoshi Ito

3
@ TsuyoshiIto: Wie ich aus der Beschreibung verstehe, ist die Bedingung, dass an jedem Scheitelpunkt der Grad gleich dem Außengrad sein sollte. Vertex-Disjointness ist also nicht erforderlich.
Yoshio Okamoto

7
Nach meinem Verständnis sollte das Problem übrigens in polynomialer Zeit mittels Netzwerkfluss lösbar sein. Wenn wir also eine Profiteinheit für eine Flusseinheit entlang einer Kante angeben und wir geben an jeder Kante eine Einheitskapazität an, besteht das Problem darin, eine Zirkulation mit maximalem Profit zu finden.
Yoshio Okamoto

3
In diesem Beitrag wird eine Verallgemeinerung Ihres Problems erläutert .
Radu GRIGore

4
Eine tolle Frage, die uns das Gefühl gibt, dass wir das, was wir tun, wirklich im wirklichen Leben anwenden können :).
Gopi

Antworten:


9

OK, ich habe den Code von TradeMaximizer gelesen und glaube, er löst das folgende, allgemeinere Problem.

PROBLEM: Gegeben ist ein gerichteter Graph, dessen Bögen Kosten verursachen. Suchen Sie eine Reihe von vertex-disjunkten Zyklen, die zuerst die Anzahl der verdeckten Vertices maximieren und dann die Gesamtkosten minimieren.

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."xyxyyz

Lösung:

  1. 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 Lx 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 Ly R in das zweigeteilte Diagramm ein.xxLxRxLxRxyxLyR

  2. 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 .


Ich habe mit TradeMaximizer eine Lösung für das ursprüngliche Problem gefunden. Ich werde morgen Detais posten.
Motobói

@ motobói, aber alles, was Sie tun müssen, ist, was ich im zweiten Absatz schrieb ...
Radu GRIGore

Ich fand diese Erklärung zum Algorithmus: boardgamegeek.com/wiki/page/TradeMaximizer
motobói

Können Sie erklären oder auf eine Erklärung verweisen, warum das Entfernen von Lichtbögen zwischen Strong Comnected Components erforderlich ist?
Motobói

@ motobói, Es ist eine Optimierung (für den durchschnittlichen Fall). Die Schritte (1) und (2) sollten ausreichend sein.
Radu GRIGore

22

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.11

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:

while G has any negative-cost directed cycles
    γ = arbitrary negative-cost directed cycle
    reverse every edge in γ
    negate the cost of every edge in γ
return the subgraph of reversed edges

O(VE)0EEO(VE2)

Dies ist nicht der schnellste bekannte Algorithmus.


denke, das funktioniert, solange eine Person nicht in mehr als einer "Einheit" arbeiten will, oder? mit Phrasierung der ursprünglichen Frage. aber wenn Leute in mehr als einer Einheit arbeiten möchten, vermuten Sie, dass diese Abstraktion zusammenbricht. OP stellte das Problem in Bezug auf nur eine Einheit dar, aber dies scheint mir eher künstlich einschränkend zu sein. [
Welcher

1
Was ist eine "Person" und eine "Einheit"? Dies ist eine Frage zu Grafiken.
Jeffs

Ich bin verwirrt: Ist mein Beispiel kein Gegenbeispiel für diesen Algorithmus? Nach Auswahl von C sind die Zyklen C_1 und C_2 keine Zyklen mehr (da jeder Zyklus eine Umkehrflanke hat); C wird nicht mehr verwendet, da es nach dem Umkehren der Kanten positive Kosten verursacht und keine neuen Zyklen eingeführt werden. Sprechen wir über das gleiche Problem? Würde gerne eine mathematische Formulierung des Problems haben.
16.

3
CCC1C2CCC1C2C=C1+C2C

anscheinend ist eine "einheit" so etwas wie eine "abteilung" und benutzer erfassen anträge für transfer zwischen abteilungen [nicht genau bestimmte positionen in den abteilungen]? Das FIBs-Diagramm scheint Einheiten als Eckpunkte und Kanten als EMPL-Anforderungen zwischen Einheiten zu haben. FiB-- "würde gerne eine mathematische Formulierung des Problems haben" .. es liegt wirklich an Ihnen, eine genaue Formulierung bereitzustellen .. Sie scheinen auf halbem Weg da zu sein ..
vzn

4

Dieser gierige Ansatz bietet nicht immer die beste Lösung.

Cn{(v1,v2),,(vn,v1)}C1C2n1C

CnC1C2

C1C22(n1)=2n2

Nebenbei: Anstatt im obigen Beispiel zwei Zyklen hinzuzufügen, können Sie auch hinzufügenn2


-3

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


Ich habe versucht, die Permutation mit trademaximizer. Stellen Sie einen Mitarbeiter als Benutzer ein, der seine Einheit X gegen Einheit Y tauschen möchte . Die Software erlaubt jedoch nicht, dass mehr als ein Benutzer denselben Gegenstand (seine Einheit) handelt. Jeder Artikel muss einzigartig sein. Um dem entgegenzukommen, hätte ich sagen müssen [(Jones) möchte Unit-C-James gegen Unit-D-Laura oder Unit-D-Sergio oder Unit-D-Mary
tauschen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.