Bob's Sale (Neuordnung von Paaren mit Einschränkungen, um die Summe der Produkte zu minimieren)


15

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:

  1. P M A k ≤ P M B k , für 0 ≤ k <K
  2. Σ (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

$


Ähm, der vorformatierte Block für das Beispiel unten wurde durcheinander gebracht, und ich bin nicht sicher, wie ich das beheben soll (StackOverflows Markdown-Syntax und <pre> -Tags scheinen hier nicht zu funktionieren).
Vladimir Panteleev

Das Markup für den vorformatierten Block wurde nicht erkannt, da Dollarzeichen als TeX-Trennzeichen behandelt wurden (obwohl ich nicht weiß, warum TeX-Markup das Markup für den vorformatierten Block ruiniert). Da es anscheinend keinen „richtigen“ Weg gibt, um Dollarzeichen zu umgehen , habe ich den Fehler ad-hoc behoben.
Tsuyoshi Ito

was ist die Frage? Sie wollen einen (effizienten) Algorithmus, um eine optimale Lösung zu finden? Härte? ungefähre lösung?
Marcos Villagra

1
@Ito, danke. @Marcos - Entschuldigung, ich suche einen Algorithmus, um dieses Problem zu lösen, hoffentlich schnell genug, damit ich ihn in mein Projekt implementieren kann. Es gibt viele Ideen für eine ungefähre Lösung, daher wäre eine genaue Lösung vorzuziehen.
Vladimir Panteleev

1
Für das, was es wert ist, denke ich, dass die verwandte Frage ( cstheory.stackexchange.com/q/4904/751 ) den Fall betrachtet, in dem die Preise aus k Einsen und N - k Nullen bestehen.
mhum

Antworten:


6

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 ≤ ik , 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≤ ik , gibt es eine 3-Partition , wenn und nur wenn Bob kann verkaufen 2b & Sigma; 1≤ ik t i :

  • Wenn es eine Lösung für 3-Partitionen gibt, können alle b- Produkte, die Objekten w i , w j , w l entsprechen, die demselben Fach zugeordnet sind, mit demselben Preis gekennzeichnet werden, ohne die Einschränkungen zu verletzen. Somit weist die Lösung Kosten 2b & Sigma; 1≤ ik t i (da die Gesamtmenge der Produkte mit Preis t i ist 2b ).
  • Betrachten Sie eine optimale Lösung von Bob's Sale. Stellen Sie zunächst fest, dass in jeder Lösung mehr als 3 Wurzelprodukte dasselbe Preisschild tragen. Für jedes solche Wurzelprodukt, das "zu viel" ist, gibt es ein billigeres Preisschild, das auf weniger als 3 Wurzelprodukte klebt. Dies ist schlimmer als jede andere Lösung, wenn es genau 3 Wurzelprodukte pro Preisschild gibt (falls vorhanden).
    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≤ ik t i , müssen wir zeigen , dass der gerade betrachteten Fall schlechter ist. Dies ist der Fall , wenn t k > 2b & Sgr; 1≤ ik-1 t i (beachten Sie, dass es die k-1 in der Summe jetzt). Einstellung t i= (2b + 1) i , 1 ≤ ik , 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.


7

Dies ist eine Fortsetzung von Geros Antwort . Die Idee ist, seine Konstruktion so zu modifizieren, dass sie eine starke NP-Härte aufweist.

tich=(2b+1)ichtich=ichP=2b1ichktich

wich-1PP

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.

kf(k)nÖ(1)nÖ(k)


Wird auch auf die ursprüngliche Stapelüberlauf-Frage gekreuzt.


Ich kann zwei Antworten nicht akzeptieren, deshalb muss ich mich nur für den Einblick bedanken :)
Vladimir Panteleev

0

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

S-> AkSBk | AkBkS | SAkBk

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.

                A1B1 --- Stufe 1 
               / | \
              / | \
             / | \
            / | \
    A1A2B2A1 A1B1A2B2 A2B2A1B1 --- Stufe 2

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

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.