Ich habe diese Frage vor einiger Zeit bei Stack Overflow gestellt: Problem: Bobs Verkauf . Jemand schlug vor, die Frage auch hier zu posten.
Jemand hat hier bereits eine Frage zu diesem Problem gestellt - Unterwald mit minimalem Gewicht und gegebener Kardinalität -, aber soweit ich das verstehe, hilft es mir bei meinem Problem nicht. Die bestbewertete Antwort auf StackOverflow ist ebenfalls einen Blick wert.
Hier ist die wörtliche Kopie meiner StackOverflow-Frage. Es ist wahrscheinlich nicht ausreichend für diese Site formuliert (zum Teufel, ich fühle mich nicht ausreichend ausgebildet, wenn ich es hier frage), also zögern Sie nicht, es zu bearbeiten:
Hinweis: Dies ist eine abstrakte Umformulierung eines realen Problems beim Bestellen von Datensätzen in einer SWF-Datei. Eine Lösung hilft mir, eine Open-Source-Anwendung zu verbessern.
Bob hat ein Geschäft und möchte etwas verkaufen. Sein Geschäft führt eine Reihe von Produkten, und er hat eine bestimmte ganzzahlige Anzahl von Einheiten von jedem Produkt auf Lager. Er hat auch eine Reihe von Preisschildern auf dem Regal (so viele wie Produkte), auf denen die Preise bereits gedruckt sind. Er kann auf jedem Produkt ein beliebiges Preisschild anbringen (Einheitspreis für einen Artikel für den gesamten Lagerbestand dieses Produkts). Einige Produkte unterliegen jedoch einer zusätzlichen Einschränkung - ein solches Produkt ist möglicherweise nicht billiger als ein bestimmtes anderes Produkt.
Sie müssen herausfinden, wie Sie die Preisschilder so anordnen, dass die Gesamtkosten aller Waren von Bob so niedrig wie möglich sind. Die Gesamtkosten sind die Summe der zugewiesenen Preisschilder der einzelnen Produkte, multipliziert mit der Menge des auf Lager befindlichen Produkts.
Gegeben:
- N - Anzahl der Produkte und Preisschilder
- S i , 0≤ i <N - die auf Lager befindliche Menge des Produkts mit dem Index i (Ganzzahl)
- P j , 0≤ j <N - der Preis auf dem Preisschild mit dem Index j (ganze Zahl)
- K - die Anzahl der zusätzlichen Bedingungspaare
- A k , B k , 0 ≤ k <K - Produktindizes für die zusätzliche Bedingung
- Jeder Produktindex darf in B höchstens einmal vorkommen. Das durch diese Adjazenzliste gebildete Diagramm ist also tatsächlich eine Menge gerichteter Bäume.
Das Programm muss finden:
- M i , 0 ≤ i <N - Zuordnung vom Produktindex zum Preisetikettenindex (P M i ist der Preis des Produkts i )
Um die Bedingungen zu erfüllen:
- P M A k ≤ P M B k , für 0 ≤ k <K
- Σ (n i · P M i ) für 0≤ i <N ist minimal
Beachten Sie, dass die Lösung ohne die erste Bedingung darin besteht, die Etiketten einfach nach Preis und die Produkte nach Menge zu sortieren und beide direkt abzugleichen.
Typische Werte für die Eingabe sind N, K <10000. In der Realität gibt es nur verschiedene Preisschilder (1,2,3,4).
Hier ist ein Beispiel, warum die meisten einfachen Lösungen (einschließlich der topologischen Sortierung) nicht funktionieren:
Die optimale Lösung ist:
Price, $ 1 2 3 4 5 6 7 8 9 10
Qty 9 8 7 6 1 10 5 4 3 2
quelle
Antworten:
Ich habe dies auch auf Ihrer ursprünglichen Frage zu Stack Overflow gepostet:
Das Problem ist für den allgemeinen Fall NP-vollständig. Dies kann durch eine Reduzierung der 3-Partitionen gezeigt werden (was eine immer noch starke NP-vollständige Version der Bin-Packung ist).
Sei w 1 , ..., w n die Gewichtung von Objekten der Instanz mit drei Partitionen, sei b die Behältergröße und k = n / 3 die Anzahl der Behälter, die gefüllt werden dürfen. Daher gibt es eine 3-Partition, wenn Objekte so partitioniert werden können, dass genau 3 Objekte pro Bin vorhanden sind.
Für die Reduktion setzen wir N = kb und jedes Bin wird durch dargestellt durch b Preisschilder von den gleichen Preis (man denke an P i zu erhöhen jeder b - ten - Label). Sei t i , 1 ≤ i ≤ k , der Preis der Etiketten, die dem i- ten bin entsprechen. Für jedes w i haben wir ein Produkt S j mit der Menge w i + 1 (nennen wir dies das Wurzelprodukt von w i ) und ein anderes w i - 1- Produkt mit der Menge 1, die billiger sein müssen als S j (Nennen Sie diese die Urlaubsprodukte).
Für t i = (2b + 1) i , 1≤ i ≤ k , gibt es eine 3-Partition , wenn und nur wenn Bob kann verkaufen 2b & Sigma; 1≤ i ≤ k t i :
Jetzt kann es noch eine Lösung von Bob's Sale mit 3 Stammetiketten pro Preis geben, aber ihre Urlaubsprodukte tragen nicht die gleichen Preisetiketten (die Mülleimer laufen über). Sagen wir, das teuerste Preisetikett markiert ein Wurzelprodukt von w i, das ein billigeres markiertes Urlaubsprodukt hat. Dies impliziert, dass die 3 Wurzelbezeichnungen w i , w j , w lmit dem teuersten Preis getaggt ergeben nicht b . Daher betragen die Gesamtkosten der mit diesem Preis gekennzeichneten Produkte mindestens 2b + 1 .
Daher ist eine solche Lösung hat Kosten t k (2b + 1) + eine andere Zuweisungskosten. Da ist der optimale Preis für eine vorhandene 3er-Partition 2b & Sgr; 1≤ i ≤ k t i , müssen wir zeigen , dass der gerade betrachteten Fall schlechter ist. Dies ist der Fall , wenn t k > 2b & Sgr; 1≤ i ≤ k-1 t i (beachten Sie, dass es die k-1 in der Summe jetzt). Einstellung t i= (2b + 1) i , 1 ≤ i ≤ k , das ist der Fall. Dies gilt auch, wenn nicht der teuerste Preis der "schlechte" ist, sondern jeder andere.
Das ist also der destruktive Teil ;-) Wenn die Anzahl der verschiedenen Preisschilder jedoch konstant ist, können Sie sie mit dynamischer Programmierung in polynomieller Zeit lösen.
quelle
Dies ist eine Fortsetzung von Geros Antwort . Die Idee ist, seine Konstruktion so zu modifizieren, dass sie eine starke NP-Härte aufweist.
Daher ist es nur möglich, den beanspruchten Preis zu erhalten, wenn alle Blattprodukte den gleichen Preis wie ihr Wurzelprodukt haben, was bedeutet, dass es eine 3-Partition gibt.
Wird auch auf die ursprüngliche Stapelüberlauf-Frage gekreuzt.
quelle
Das klingt nach einer Frage der Spieltheorie. In diesem Fall ist eine sehr einfache Brute-Force-Lösung:
Nehmen wir an, die Nebenbedingungen repräsentieren einige Invarianten der Form
Die Lösung besteht darin, zuerst die Einschränkungen und dann die Elemente hinzuzufügen. ZB: Sagen wir n = 10 und es gibt 2 Bedingungen, A1B1 und A2B2. Dann gibt es drei Kinder zum Wurzelknoten (Stufe 2). Jeder dieser 3 Knoten hat 7 Kinder der Stufe 3, jeder der 21 haben 6 Kinder der Stufe 4 usw. Im Wesentlichen durchlaufen Sie alle möglichen Kombinationen.
und den Baum wachsen lassen. Obwohl es von Anfang an wie eine schreckliche Lösung aussieht, könnte man auf die Jagd nach sehr teuren Blättern verzichten, wenn man Heuristiken einsetzt und ...
quelle