次の問題の解決策を探していますが、賢明にそれを定式化し、それを解決するための適切なアルゴリズムを見つけるのに苦労しています。
ショッピングバッグに入れられたアイテムのリストを考えてみましょう:1、2、3、4 ...
各アイテムは、1つ以上のプロモーションの一部にすることができます:A、B、C、D
割引の価値を最大化するように、プロモーションのセットを適用します。アイテムは複数のプロモーションに参加できませんが、各プロモーションは複数回適用できます。
プロモーションはさまざまな方法で定義できますが、今のところ、「2つの対象アイテムを購入してXを節約」というタイプを検討しているだけなので、ここから一般化できると期待しています。
私の例は:
- プロモーションA-購入2割引8
- プロモーションB-購入2割引10
プロモーションC-購入2保存6
アイテム1-A、Bの対象
- 項目2-Bの対象
- 項目3-A、Cの対象
- アイテム4-B、Cの対象
プロモーションの正しい適用は、アイテム1に対して3、Bに対して2、4であることが簡単にわかります。これにより、合計で18割引になります。
大きなケースでは困難になるため、アルゴリズム的に解決する必要があります。
私は以下を試しました:
- 適用可能なプロモーションの可能な組み合わせをすべてリストアップしてください。
- 明らかに貧弱なものはすべて破棄します(例:値の高いプロモーションの直接コピー)。
- 他のプロモーションと重複しないものを適用します(たとえば、アイテム1と2がプロモーションAに対してのみ有効である場合、そのプロモーションを適用します)。
- 残りのセットを取得し、結果に対してブランチアンドバウンドタイプの検索を試みます。
ただし、これには時間がかかる場合があります(同様の割引のある大規模なセットの場合)。
これは一種のナップザックまたは割り当て問題だと思いますが、私はそれを賢く書くことができません。うまく書けなくては解決できません。
これは問題の認識されたバリアントですか?特にそれを解決するのに役立つ擬似コードでそれを攻撃する助けは大歓迎です