Dieses Problem ist NP-schwer . Um dies zu zeigen, werde ich dieses (Optimierungs-) Problem zunächst in ein Entscheidungsproblem umformulieren. Dann formuliere ich dieses Problem in ein äquivalentes um, aus dem es ziemlich einfach ist, eine Reduktion aus dem Farbproblem zu erhalten, das für jedes k ≥ 3 NP-schwer ist .kk≥3
Eine kurze Formulierung des Problems lautet wie folgt:
Finden Sie bei Personen und einem Diagramm G , das ihre "Geschenk" -Beziehungen kodiert, die Mindestanzahl der erforderlichen Reisen, damit alle Geschenke gekauft werden können, ohne Überraschungen zu ruinieren.nG
Dies ist jedoch ein Optimierungsproblem. Die Klasse NP wird normalerweise für Entscheidungsprobleme definiert (wobei die Antwort auf jede Instanz entweder JA oder NEIN lautet). Eine Entscheidungsvariante davon ist:
Ist es bei Personen und einem Diagramm G , das ihre "Geschenk" -Relationen und eine ganze Zahl t codiert , höchstens t Reisen ausreichend, um alle Geschenke zu kaufen, ohne irgendwelche Überraschungen zu ruinieren?nGtt
Ich definiere das Problem, eine richtig gerichtete Mehrfachfärbungt eines Graphen als eine Mehrfarbenfunktion c : V → P ( C ), die richtig ist , wobei C eine Menge von t 'Farben' ist ( dh | C | = t ) und P ( C ) ist die Potenzmenge von C (dh die Menge aller Teilmengen von C.G=(V,E) c:V→P(C)Ct|C|=tP(C)CC(u→v)∈Ec(u)⊈c(v)
Ich behaupte, dass das Problem der Einkaufstour dem Problem entspricht, die Existenz einer gerichteten Mehrfachfärbungt desselben Graphen .G
Beweis : Wenn wir eine richtige gerichtet haben -multicoloring für , wo wir die Farben , so dass umbenennen dann betrachten die Folge von stellt , wo ein Scheitelpunkt geht in Reise genau dann einkaufen, wenn . Dann haben wir für jede Kante , dass es eine Reise so dass und , da . Daher sind die Fahrtenc G C = { 1 , … , t } t T 1 , … , T t v T i i ∈ c ( v ) ( u → v ) ∈ E T i u ∈ T i v ∉ T i c ( u ) ⊈ c ( v ) T itcGC={1,…,t}tT1,…,TtvTii∈c(v)(u→v)∈ETiu∈Tiv∉Tic(u)⊈c(v)Ti sind ausreichend, um alle Geschenke zu kaufen.
Wenn wir eine Folge von , konstruieren Sie die Mehrfarbenfunktion auf der so, dass . Dann wird für jede Kante existiert eine Reise so dass und (da ein Geschenk kaufen auf einige Fahrt), was bedeutet , dass und , also . c C = { 1 , … , t } c ( u ) = { i ∈ N | u ∈ T i } ( u → v ) ∈ E T i u ∈ T i v ∉ T i u v i ∈ c ( u ) i ∉ c (T1,…,TtcC={1,…,t}c(u)={i∈N|u∈Ti}(u→v)∈ETiu∈Tiv∉Tiuvi∈c(u)c ( u ) ⊈ c ( v ) ◻i∉c(v)c(u)⊈c(v)□
Das Finden einer richtigen gerichteten Mehrfachfärbung ist im Grunde eine seltsame Neuformulierung eines bestimmten Falles der Färbung. Daher kann ich eine Polynomzeitverkürzung aus dem -Farbproblem zeigen: Wenn ein ungerichteter Graph , transformiere zuerst diesen Graphen in den gerichteter Graph , so dass und genau dann, wenn oder ( Mit anderen Worten, wir ändern ungerichtete Kanten in zwei gerichtete Kanten.ktk(t⌊t/2⌋)G′=(V′,E′)G=(V,E)V=V′(u→v)∈E(u,v)∈E′(v,u)∈E′
Betrachten Sie eine größte Menge , so dass es , kein gibt , so dass . Die Menge aller Teilmengen von der Größe , wobeiist so ein Satz. Daher ist die maximale Größe einer solchen Teilmenge .K⊂P(C)a,b∈Ka≠ba⊂bC⌊t/2⌋t=|C|(t⌊t/2⌋)
Wenn für eine richtige Mehrfachfärbung existiert , gibt es eine richtige Färbung, die nicht mehr als ungleiche Elemente aus (*) verwendet. Dies ist also eine gültige -Farbe für .tG(t⌊t/2⌋)P(C) (t⌊t/2⌋)G′
Wenn für eine richtige -Farbe existiert , dann existiert eine Menge , , so dass und es gibt kein , , so dass . Also, hat ein richtigen gerichtet -multicoloring.(t⌊t/2⌋)G′K⊂P(C)|C|=t|K|≥(t⌊t/2⌋)a,b∈Ka≠ba⊂bGt
Daher ist dies eine gültige Polynomzeitverkürzung von -Farbe auf das gegenwärtige Einkaufsproblem mit Reisen, was bedeutet, dass das gegenwärtige Einkaufsproblem NP-schwer ist. Beachten Sie, dass das derzeitige Einkaufsproblem NP-vollständig ist, da wir leicht überprüfen können, ob eine bestimmte Liste von höchstens Reisen es uns ermöglicht, alle Geschenke zu kaufen, ohne Überraschungen zu ruinieren.(t⌊t/2⌋)tt
(*): Wenn einige Mehrfachfarben mehr Farbsätze verwenden als eine maximale Mehrfachfärbung ohne Untermenge , können wir so umbenennen, dass Es ist eine Obermenge von . bleibt korrekt, da keines der Elemente aus neben einem anderen Element als ein Problem darstellt und keines der Farbsätze in nebeneinander liegt das Original . Ohne Verlust der Allgemeinheit können wir also annehmen .CC∗CC∗CC∗C∗CC∗⊂C
Beachten Sie dann, dass das Umbenennen von in eine beliebige Teilmenge von die Kanten zwischen den Knoten von Farbsätzen nicht ruiniert , da keine Elemente enthält, die eine Teilmenge eines anderen sind. Sie müssen nur noch sicherstellen, dass die Kanten zwischen und die Farbgebung nicht "ruinieren".C∖C∗C∗C∖C∗C∗C∖C∗C∗
Betrachten Sie die folgende Beziehung für die Farbsätze in : Zwei Farbsätze und sind genau dann verbunden, wenn ein Paar von Eckpunkten so dass hat farb gesetzt und Farbsatz und . Diese Beziehung kann durch den ungerichteten Graphen .RC∪C∗ABa,baAbB(a,b)∈EG=(C∪C∗,R)
Erstens können wir 'reduzieren', indem wir jedes Paar, das in keine Kante hat, durch einen einzelnen Farbsatz ersetzen . Die Färbung bleibt korrekt, da das Ändern von zwei Farbsätzen, die überhaupt nicht benachbart sind, in dieselbe Farbe keine ungültigen Kanten einführt. Infolgedessen haben wir auf ein vollständiges Diagramm reduziert .C∖C∗GG
Dies bedeutet, dass wenn weniger oder gleich viele Farbsätze hat wieist die gewünschte Färbung vorhanden. Andernfalls gibt es überhaupt keine richtige Mehrfachfärbung, da eine größte 'Nicht-Teilmenge' ist, sodass wir diese Clique nicht färben können. Daher besteht notwendigerweise die erforderliche Mehrfachfärbung.G|C∗|C∗
Da der vollständige Graph auf Knoten genau dann farbfähig ist, wenn wir mindestens Farben haben, haben wir die Möglichkeit , dass Personen in Reisen genau dann Geschenke für einander einkaufen können, wenn . Dies bedeutet insbesondere, dass bei nur Fahrten ausreichen. Wenn weniger Geschenke zu kaufen sind, werden keine weiteren Reisen benötigt, sodass dies eine allgemeine Obergrenze für jede Lösung ist.nKnnnt(t⌊t/2⌋)≥nn≤1287016
Unten ist meine frühere 'Antwort', die einen heuristischen Algorithmus liefert, der nicht garantiert, dass das Optimum erreicht wird, sondern in Polynomzeit berechnet werden kann.
Eine andere Möglichkeit, dieses Problem zu formulieren, besteht darin, eine Abdeckung von zweigeteilten Graphen auf den Partitionen für einen gerichteten Graphen mit Knoten zu finden , so dass die Anzahl der Partitionen (dh Auslösungen), hier , minimal ist.C={(S1,T1),…,(Sm,Tm)}(Si,Ti)Gnm
Erstens einige Beobachtungen, die teilweise aus anderen Antworten stammen:
- Die gierige Strategie, bei der wir ein mit einem zweigeteilten Graphen auswählen bei dem die Anzahl der mit gemeinsamen Kanten maximal ist, führt nicht zu einer optimalen Lösung (Ein starkes Gegenbeispiel ist der vollständige Graph mit Knoten). wo diese Strategie fehlschlägt, egal welcher maximale zweigliedrige Graph gewählt wird.).(Si,Ti)G6
- Die gierige Strategie ist für beliebige azyklische Graphen nicht optimal. Betrachten Sie den folgenden Graphen:
Sowohl für als auch für der zweigeteilte Graph Kanten, aber nur ist optimal.Si={3,5,6}Si={1,3,6}4{3,5,6}
- Jeder (optimale) Greedy-Algorithmus kann die Größe der ausgewählten Partition nicht der Anzahl der von der Partition "entfernten" Zyklen ( beliebiger Größe) vorziehen . Um dies zu sehen, betrachten Sie das Diagramm mit Knoten, wobei es einen Zyklus von Knoten gibt und jeder Knoten im Zyklus zusätzliche ausgehende Kanten zu zusätzlichen Knoten , die keine ausgehenden Kanten haben (siehe Abbildung unten für ein Beispiel mit ). Eine gierige Wahl, die es vorzieht, die Anzahl der Kanten über Zyklen der Länge zu maximieren, sendet alle Eckpunkte im Zyklus auf der ersten Fahrt. Dies ist nicht optimal, da dadurch keine Kanten des Zyklus entfernt werden und einfach ignoriertn+2n22A,Bn=4nA,BWenn Sie alle Kanten aus dem Zyklus entfernen, werden auch alle Kanten in Richtung . Daher ist jede gierige Wahl, die die Größe der Partition dem Entfernen eines Zyklus vorzieht, nicht optimal.A,B
Basierend auf diesen Beobachtungen schlage ich die folgende gierige Wahl vor: Wählen Sie so, dass die Anzahl der Zyklen, die diese Reise von 'entfernt', maximal ist, und wählen Sie im Fall von Bindungen eine Partition mit maximaler Überlappung mit unter sie (dh schauen Sie sich die Kanten nicht auf Zyklen).(Si,Ti)GG
Da sich dieser Algorithmus nicht von der "grundlegenden" Greedy-Strategie für azyklische Graphen unterscheidet (Entfernen einer maximalen Anzahl von Kanten bei jeder Fahrt), ist dieser Greedy-Algorithmus daher nicht optimal. Die Intuition, Zyklen zu entfernen, ist jedoch immer noch sinnvoll und stellt eine Verbesserung gegenüber der grundlegenden Strategie der Gier dar, sodass es sich um eine anständige Heuristik handeln könnte.
Ich kann sehen, wie Sie dieses Problem auf Graph Coloring reduzieren können , wodurch Sie ein Werkzeug zur Lösung des Problems erhalten (für kleine Fälle!), Aber noch nicht, wie Sie es in die andere Richtung reduzieren können (wodurch die NP-Härte hergestellt wird).
Die Grundidee besteht darin, ein Diagramm zu erstellen, das für jeden Einkauf einen Scheitelpunkt und eine Kante zwischen zwei Käufen enthält, die nicht auf derselben Reise erfolgen können. Wir versuchen dann, die Einkäufe in die kleinstmögliche Anzahl von Gruppen ("Reisen") zu gruppieren, so dass keine zwei Einkäufe in derselben Gruppe in Konflikt geraten würden. Insbesondere wenn der ursprünglich gerichtete Graph ist, in dem eine Kante angibt, dass die Person der Person ein Geschenk kaufen muss , dann erstellen Sie einen ungerichteten Graphen in dem sich ein Scheitelpunkt befindet für jede Kante in und eine (ungerichtete) Kante wann immerG=(V,E) uv u v H=(X,Y) xuv uv G xuvxvw uv und sind beide (gerichtet) Kanten in (wenn einige kauft Geschenk während einer Reise, dann kann niemand kaufen während dieser gleichen Reise ein Geschenk). Eine Scheitelpunktfärbung von ist eine Aufteilung der erforderlichen Käufe (Scheitelpunkte in ) in Fahrten (Farben), die nicht in Konflikt stehen (eine Kante teilen), und eine Scheitelpunktfärbung mit minimaler Größe erfordert die geringstmöglichen Fahrten.vw G v w v H H
Es könnte möglich sein, in die andere Richtung zu gehen (die Graphfärbung oder ein anderes NP-hartes Problem auf Ihr Problem zu reduzieren und dadurch seine NP-Härte festzustellen), indem eine Reduzierung von 3SAT an die Graphfärbung angepasst wird (wie z. detailliert auf S. 10 von Jeff Ericksons Notizen ), aber ich habe es selbst nicht versucht.
quelle
Es ist die Art von Problem, bei dem ich mir große Sorgen machen würde, wenn mein Chef mich bitten würde, einen Algorithmus zu implementieren, der garantiert in angemessener Zeit eine optimale Lösung findet.
So finden Sie eine nicht unbedingt optimale Lösung: Bei einer bestimmten Anzahl von Personen und Geschenken können wir zählen, wie viele Geschenke eine Gruppe von Personen auf einem Einkaufsbummel kaufen kann. Beginnen Sie also mit einer leeren Gruppe (die 0 Geschenke kaufen kann). Bestimmen Sie für jede Person, die nicht zur Gruppe gehört, wie viele Geschenke gekauft werden können, wenn diese Person der Gruppe hinzugefügt wird. Wenn es eine Person gibt, die wir hinzufügen können, ohne die Anzahl der Geschenke zu verringern, wählen Sie nach dem Zufallsprinzip eine aus, die die Anzahl der gekauften Geschenke um den Höchstbetrag erhöht, bis durch Hinzufügen einer Person die Anzahl der gekauften Geschenke verringert wird. Machen Sie dann diesen Einkaufsbummel und beginnen Sie von vorne, bis alle Geschenke gekauft sind.
Ich würde es ein paar Mal wiederholen und "zufällig" verschiedene Leute auswählen, falls dies eine bessere Lösung findet.
In dem Beispiel, in dem fünf Personen ein Geschenk für einander kaufen müssen, findet dies in vier Fahrten eine optimale Lösung. Wenn wir einer Reise keine Personen hinzufügen würden, bei denen die Anzahl der Geschenke unverändert bleibt, ohne sie zu verbessern, hätten wir fünf Reisen. Und 6 Personen benötigen 5 Fahrten.
quelle
Angenommen, Sie bestellen die Personen basierend darauf, von wem sie (Eltern) empfangen und wem sie (Kind) geben. Da jeder ein Geschenk gibt und ein Geschenk erhält, ist die Eltern-Kind-Funktion eins zu eins.
Sie möchten niemals Eltern und Kind in dieselbe Gruppe einordnen. Sie beginnen mit einer zufälligen Person und ordnen alle entsprechend an, also usw. Sie ordnen alle in eine Gruppe und alle in eine andere Gruppe ein. Für die letzte Person ist , Sie möchten also nicht, dass diese Person mit in derselben Gruppe ist . Wenn ist, ist dies kein Problem. Andernfalls benötigen Sie eine zusätzliche Gruppe, die im einfachsten Fall nur kann.p1 child(p1)=p2 podd peven pn=parent(p1) p1 n pn
Dieser Algorithmus setzt voraus, dass alle verbunden sind. Das muss aber nicht so sein. Wenn es mehrere getrennte Zyklen gibt, wenn irgendwann wobei , dann beenden Sie diesen Kreis und beginnen mit einem neuen, der demselben Algorithmus folgt. Solange Sie nicht die Chancen und Ereignisse desselben Zyklus zusammenführen, können Sie getrennte Zyklen zusammenführen.pk=parent(p1) k!=n
Dieser Algorithmus endet mit höchstens 2 Runden (für gerade ) und 3 Runden (für ungerade ).n n
quelle