Bob's Sale(製品の合計を最小化するための制約付きペアの並べ替え)


15

私は少し前にStack Overflowでこの質問をしました:問題:Bob's sale。誰かが質問をここに投稿することも提案しました。

誰かがすでにこの問題に関連する質問をしています- 特定のカーディナリティの最小重みサブフォレスト -しかし、私が理解している限り、それは私の問題に役立ちません。StackOverflowで最も評価の高い回答もご覧ください。

StackOverflowの質問の逐語的なコピーを次に示します。おそらく、このサイトには不適切に定式化されているので(ちなみに、ここで質問するだけでは教育を受けられないと感じます)、自由に編集してください。


注:これは、SWFファイル内のレコードの順序に関する実際の問題を抽象的に言い換えたものです。ソリューションは、オープンソースアプリケーションの改善に役立ちます。

ボブは店を持ち、販売をしたいと考えています。彼の店には多くの製品があり、在庫がある各製品の単位の特定の整数量を持っています。彼はまた、多くの棚に取り付けられた価格ラベル(製品の数と同じ数)を持ち、価格はすでに印刷されています。彼はどの製品にも価格ラベルを付けることができます(その製品の在庫全体に対する1つのアイテムの単価)。ただし、一部の製品には追加の制限があります。

すべてのBobの製品の総コストが可能な限り低くなるように、価格ラベルを配置する方法を見つける必要があります。総コストは、各製品に割り当てられた価格ラベルにその製品の在庫数を掛けた合計です。


与えられた:

  • N –製品と価格ラベルの数
  • S I、0≤ I <N -インデックスを有する製品の在庫の数量I(整数)
  • PのJ、0≤ J <N -インデックス付き価格ラベル上の価格J(整数)
  • K –追加の制約ペアの数
  • K、BはK、0≤ K <K -追加の制約のために、製品インデックス
    • どの製品インデックスもBに1回しか表示されません。したがって、この隣接リストによって形成されるグラフは、実際には有向木のセットです。

プログラムは以下を見つける必要があります。

  • M I、0≤ I <N -価格ラベルインデックス製品インデックスからマッピング(P M iは、製品の価格であるI

条件を満たすには:

  1. P M A K ≤P M BがK、0≤ためのK <K
  2. Σ(S I ×P M I 0≤ため)、I <Nが最小であります

最初の条件でない場合、ソリューションは、価格でラベルをソートし、数量で製品をソートし、両方を直接照合することに注意してください。

入力の一般的な値はN、K <10000です。現実の問題では、いくつかの異なる価格タグ(1,2,3,4)のみがあります。


最も単純なソリューション(トポロジカルソートを含む)が機能しない理由の1つの例を次に示します。

あなたは価格で10個の数量を持つ項目1から10、及び10枚の価格ラベル持つ 1から$数量1でのアイテムよりも安くしてはならないアイテム数量10と:1つの条件があります10。$$

最適なソリューションは次のとおりです。

Price, $   1  2  3  4  5  6  7  8  9 10
Qty        9  8  7  6  1 10  5  4  3  2

合計コストは249 です。1,10ペアをどちらかの極値に近づけると、合計コストは高くなります。$


えー、下の例の事前にフォーマットされたブロックが壊れてしまい、それを修正する方法がわかりません(StackOverflowのMarkdown構文と<pre>タグはここでは機能しないようです)。
ウラジミールパンテレエフ

ドル記号がTeX区切り文字として扱われたため、事前にフォーマットされたブロックのマークアップは認識されませんでした(TeXマークアップが事前にフォーマットされたブロックのマークアップを台無しにする理由はわかりませんが)。ので、ドル記号をエスケープするために「正しい」方法はないようです、私は、アドホックな方法でそれを修正しました。
伊藤剛

質問は何ですか?最適なソリューションを見つけるための(効率的な)アルゴリズムが必要ですか?硬度?近似解?
マルコスヴィラグラ

1
@伊藤、ありがとう。@Marcos-申し訳ありませんが、私はこの問題を解決するためのアルゴリズムを探しています。できれば、プロジェクトに実装できるように十分に高速です。近似解には多くのアイデアがありますので、正確な解が望ましいでしょう。
ウラジミールパンテレエフ

1
価値があるのは、関連する質問(cstheory.stackexchange.com/q/4904/751)で、価格がk個の1とN−k個のゼロで構成される場合を考慮していると思います。
ムム

回答:


6

Stack Overflowの元の質問にもこれを投稿しました。


この問題は、一般的なケースではNP完全です。これは、3パーティションの削減によって示されます(これは、依然としてビンパッキングの強力なNP完全バージョンです)。

ましょうwは1、...、W N 3パーティション・インスタンスのオブジェクトの重みであり、ましょうbはビンサイズであり、そしてK = N / 3充填することを許可されているビンの数。したがって、ビンごとに正確に3つのオブジェクトがあるようにオブジェクトを分割できる場合、3つのパーティションがあります。

削減のために、N = kbを設定し、各ビンは同じ価格のb個の価格ラベルで表されます(P ib番目のラベルごとに増加すると考えてください)。してみましょうトンに私を 1≤、IKに対応するラベルの価格になり、I番目のビン。w iごとに、数量w i + 1の1つの製品S j(これをw iのルート製品と呼びます)と、S jよりも安くする必要がある数量1の別のw i -1製品があります。 (これらを休暇商品と呼びます)。

以下のためにT iが =(2B + 1)I、1≤ IK、3パーティションが場合があり、ボブがために販売することができる場合にのみ、図2(b) Σ 1≤ IK T I

  • 3パーティションのソリューションがある場合、同じビンに割り当てられたオブジェクトw iw jw lに対応するすべてのb製品は、制限に違反することなく同じ価格でラベル付けできます。したがって、溶液はコスト有し2B Σを1≤ IK T I(価格で製品の総量のでtのiがある2B)。
  • Bob's Saleの最適なソリューションを検討してください。最初に、どのソリューションでも、3つ以上のルート製品が同じ価格ラベルを共有していることを確認してください。これは、価格ラベルごとに正確に3つのルート製品がある場合(存在する場合)、どのソリューションよりも悪いです。
    今では、価格ごとに3つのルートラベルを使用したボブズセールのソリューションが存在する可能性がありますが、彼らの休暇商品は同じ価格ラベルを着用しません(ビンは流れます)。最も高価な価格ラベルが、より安価なタグ付き休暇製品を持つw iのルート製品にタグ付けするとします。これは、3つのルートラベルw iw jw l最も高価な価格でタグ付けされた場合、合計はbになりません。したがって、この価格でタグ付けされた製品の総コストは少なくとも2b + 1です。
    したがって、このようなソリューションのコストは、t k(2b + 1) +その他の割り当てコストです。既存の3-パーティションに最適なコストであるので、図2b Σ 1≦ IK トン私は、私達はちょうどみなさ場合が悪化していることを示さなければなりません。これがあればそうであるT K > 2bの Σ 1≦ IK-1 トンI(それはだとノートK-1になりました合計で)。t iの設定=(2B + 1)I、1≤ Ikが、これはそうです。これは、最も高価な値札が「悪い」値札ではないにしても、他の値札にも当てはまります。

したがって、これは破壊的な部分です;-)ただし、異なる価格タグの数が定数である場合、動的プログラミングを使用して多項式時間で解決できます。


7

これは下呂の回答のフォローアップです。アイデアは、強いNP硬度を示すために彼の構造を修正することです。

t=2b+1t=P=2b1kt

w1PP

したがって、すべてのリーフ製品がルート製品と同じ賞品を持つ場合にのみ、請求された賞品を獲得することができます。これは、3つのパーティションが存在することを意味します。

kfknO1nOk


また、元のスタックオーバーフローの質問へのクロスポスト。


2つの答えを受け入れることはできませんので、洞察力に感謝する必要があります:)
ウラジミールPanteleev

0

これはゲーム理論の質問のように聞こえます。その場合、非常に単純なブルートフォースソリューションは次のとおりです。

制約が次の形式の不変式を表すと仮定します。

S-> AkSBk | AkBkS | SAkBk

解決策は、最初に制約を追加し、次に要素を追加し続けることです。例:n = 10とすると、A1B1とA2B2の2つの制約があります。次に、ルートノード(レベル2)に3つの子があります。これら3つのノードにはそれぞれレベル3の7つの子があり、各21にはレベル4に6つの子があります。本質的に、すべての可能な組み合わせを実行しています。

                A1B1 ---レベル1 
               / | \
              / | \
             / | \
            / | \
    A1A2B2A1 A1B1A2B2 A2B2A1B1 ---レベル2

木を育てます 最初は恐ろしい解決策のように見えますが、ヒューリスティックとプルーニングを使用して、非常に高価な葉を追いかけることを放棄できると思います...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.