Ich suche nach einer Lösung für das folgende Problem, habe aber Probleme, es sinnvoll zu formulieren und dann einen geeigneten Algorithmus zu finden, um es zu lösen.
Betrachten Sie eine Liste der Artikel in einer Einkaufstasche: 1, 2, 3, 4 ...
Jeder Artikel kann Teil einer oder mehrerer Werbeaktionen sein: A, B, C, D.
Wir möchten die Werbeaktionen so anwenden, dass wir den Wert des Rabatts maximieren, dass kein Artikel an mehr als einer Aktion teilnehmen darf, aber jede Aktion mehr als einmal angewendet werden kann.
Werbeaktionen können auf verschiedene Arten definiert werden, aber im Moment denke ich nur über eine Art von "2 qualifizierende Gegenstände kaufen, X speichern" nach. Ich hoffe, dass ich von hier aus verallgemeinern kann.
Mein Beispiel wäre:
- Aktion A - Kaufen Sie 2 Sparen Sie 8
- Promotion B - Kaufen Sie 2 Sparen Sie 10
Promotion C - Kaufen Sie 2 Sparen Sie 6
Punkt 1 - Berechtigt für A, B.
- Punkt 2 - Berechtigt für B.
- Punkt 3 - Berechtigt für A, C.
- Punkt 4 - Berechtigt für B, C.
Hier ist leicht zu erkennen, dass die korrekte Anwendung von Werbeaktionen A bis Punkt 1, 3 und B bis 2, 4 ist. Dies ergibt einen Gesamtrabatt von 18.
In einem größeren Fall wird es schwierig, daher muss es algorithmisch gelöst werden.
Ich habe folgendes versucht:
- Listen Sie alle möglichen Kombinationen von Werbeaktionen auf, die wir anwenden könnten.
- Verwerfen Sie alle offensichtlich schlechten (z. B. eine direkte Kopie einer Aktion mit einem höheren Wert).
- Wenden Sie alle Aktionen an, die sich nicht mit anderen Werbeaktionen überschneiden (z. B. wenn Artikel 1 und 2 nur für Aktion A gültig sind, wenden Sie diese Aktion an).
- Nehmen Sie den verbleibenden Satz und versuchen Sie eine Suche nach verzweigten und gebundenen Typen für die Ergebnisse.
Dies kann jedoch lange dauern (bei großen Sets mit ähnlichen Rabatten).
Ich denke, dies ist eine Art Rucksack- oder Zuweisungsproblem, aber ich kann es nicht vernünftig schreiben. Ohne es vernünftig schreiben zu können, kann ich es nicht lösen.
Ist dies eine anerkannte Variante eines Problems? Jede Hilfe, die es angreift, wäre sehr dankbar, insbesondere mit Pseudo-Code, um es zu lösen