1

アイテムのセット(1〜100のサイズ)とビンの数(1〜15)が与えられた場合、ビンのサブセットを持つ各アイテムには、アイテムを割り当てることができ、どのビンが最適、2番目に最適、など、それだけです。アイテムには自然な順序もあります。たとえば、item1の前にitem2の名前を付けることで、以下に示します。各ビンの容量は1〜5です(すべてのアイテムの重量は同じ、つまり1です)。

入力の例としては、3つのビンと6つのアイテムがあります(-は、ビンがアイテムの使用可能なセットにない、つまり、ビンをパックできないことを示します)。

      | bin1 bin2 bin3 | bin1 bin2 bin3   
------------------------ -------------------------- - 
item1 | 12-容量| 4 4 5
item2 | --1 2               
item3 | 2 1 3
item4 | 1 2 3
item5 | 1-2
item6 | 1 2 3

目標は次のとおりです(競合が発生した場合に、各目標が下位の目標を完全にオーバーライドするために、たとえば、使用されるビンの数や設定が無視される場合でも、5つのアイテムをパックする方が常に4つよりも優れています)。

  1. 梱包されたアイテムの数を最大化する
  2. アイテムを自然な順序でパックします。たとえば、ビンの合計容量が1で、アイテムが2つある場合、item1はパックされ、item2はパックされません。
  3. 使用するビンの数を最小限に抑える
  4. ビンの設定と自然な順序に従って各アイテムをパックします。つまり、最初の設定のitem1と2番目のitem2は、2番目のitem1と最初のitem2よりも優れています。
  5. 2つのソリューションがこれらの目標によって区別できない場合、たとえば、実装の副作用または単なる任意のタイブレークとして、どちらのソリューションも上位にランク付けすることができます。

したがって、上記の入力は次のようにパックされます。

      | bin1 bin2 bin3
------------------------
item1 | バツ            
item2 | バツ     
item3 | バツ     
item4 | バツ          
item5 | バツ      
item6 | バツ   

問題は、最初の段落からの入力サイズと数秒の時間制約、つまりブルートフォース(または少なくともブルート)ではなく、この問題を解決するためのアルゴリズムのアイデアを思い付くのに役立つ、何を読んでレビューするかです。これまでに考えた力です。)私はRubyとCを使用していますが、森のつまずきのこの段階では、言語はあまり関連性がありません。

読書の提案、アルゴリズムの組み合わせに関するアイデア、または問題の説明を明確にするための考えに感謝します...

アップデート1

不明確ではありませんが、これのさまざまな部分をカバーする多くのアルゴリズムがありますが、私の難しさは、すべての基準を一緒に処理する情報を見つける(またはおそらく認識する)ことです。 -ビンセットとアイテム設定。これは、次の例でより明確に示されることを願っています。

      | bin1 bin2 bin3 | bin1 bin2 bin3   
------------------------ -------------------------- - 
item1 | 123容量| 3 2 3
item2 | 1 2 3          
item3 | --1 2

bin1が最も優先されますが、item3はまったく配置できません。また、bin2はすべてのアイテムで次に優先されますが、3つのアイテムのうち2つしか保持できません。したがって、割り当ての正しいセット(x)は、実際には最も優先度の低いビンです。

      | bin1 bin2 bin3
------------------------
item1 | バツ  
item2 | バツ  
item3 | バツ  

更新2 目標がどのように関連しているかに関する情報を使用して説明を作り直し、ビンの優先度の変数を削除しました。これは、回答を見つける可能性が低くなり、作業中のシステムの他の場所で回避できるためです。

4

3 に答える 3

1

n個のアイテムとb個のビンがあり、各ビンのサイズがsであるとします。追加した制約の順序は、実際には問題を大幅に単純化します。

具体的には、割り当てられたビンの数に収まる最大のm <= nのアイテム1、2、...、mを常に選択する必要があることを意味します(より少ない数を選択すると、ルール1によって必然的に悪い解が生成されるため) 。アイテムはこの順序でビンにパックされ、一部のビンが不完全に埋められたままになる可能性があります(ビン内またはビン間でアイテムを再配置すると、ルール2によってより悪い解決策が生成されるため)。2つのケースがあります:

  1. m <nは、すべてのアイテムを収めることができないことを意味します。その場合、すべてのbビンに、最初のm個のアイテムがこの順序で密に詰め込まれます。これで完了です。
  2. m = nの場合、すべてのアイテムを適合させることができます。ここで、このケースのサブケースについて検討します。

この場合、ビンをしっかりと梱包すると、ビンの0 <e<=bの最終ブロックが完全に空になる可能性があります。その場合、それらの最後のe個の空のビンを破棄して続行します(より多くのビンを使用すると、ルール3によってより悪い解決策が生成されるため)。いずれの場合も、残りのビンの最終的な数をrと呼びます。(r = b-e。)

これで、使用するアイテムとビンが正確にわかりました。また、アイテムを梱包する必要がある順序もわかっています。順序の制約があるため、どのビンを不完全に埋めておくかについての決定は、「start-next-bin」命令をアイテムの順序付きリスト1、2、...nに挿入する方法の問題と見なすことができます。これらの命令を最大r-1まで注入できます。

この問題は、動的計画法を使用してO(nrs)時間で解決できます。基本的に、関数を計算します。

f(i、j、k)=最初のi個のアイテムが最初のj個のボックスを占め、j番目のボックスに正確にk個のアイテムがある最良の解のスコア。

再発は次のとおりです。

f(i, j, 0)     = max(f(i, j-1, k)) over all 0 <= k <= s
f(i, j, k > 0) = f(i-1, j, k-1) + q(i, j)

ここで、q(i、j)は、アイテムiをボックスjに割り当てる品質スコアです。(あなたの投稿へのコメントで述べたように、おそらくiの好みがどれだけ満たされているかに基づいて、任意のアイテムiを任意のボックスjに配置するためのスコアを割り当てる方法を決定する必要があります。品質値よりも悪い」値の場合は、max()aに変更し、以下min()-infinity境界値をに変更しますinfinity。)

最初の方程式は、右端のビンが空である最初のiアイテムの解の最高スコアは、そのビンのない最初のiアイテムのすべての解を検討することによって見つけることができる最高スコアに等しいことを示しています。これらの候補ソリューションは、前のビンを空のままにすることを含め、パックできるすべての方法で構成されています。

2番目の式は、右端のビンが空でない最初のiアイテムの最高スコアは、最後のアイテムを配置するための品質スコアを、同じ数のビンに最初のi-1アイテムを配置するための最高スコアに加算するだけで見つかることを示しています。 。

境界条件は次のとおりです。

f(0, 0, 0) = 0
f(i, 0, k) = -infinity for all other i and k

0 <= i <= n、0 <= j<=rおよび0<=k <= sごとにf(i、j、k)の値を計算し、それらをテーブルf(n、r 、s)は、最終的な解の最適なスコアを示します。これは最大のスコアを与えるだけですが、実際の最適解は、f(i、j、k)行列を最後からさかのぼって、各k =0ステップで先行状態を探すことによって見つけることができます(つまり、max()現在の状態につながったに違いない)の下の代替案。(下のいくつかの選択肢がmax()等しいスコアを与える場合があります。その場合、複数の最適なソリューションが存在し、これらのパスのいずれかをたどって、そのうちの1つだけを見つけることができます。)

于 2011-02-23T11:48:40.977 に答える
1

これは、医学部卒業生をレジデンシープログラムに配置するために使用される「一致」アルゴリズムを思い出させます。アイテムを学生のように扱い、ビンの好みをランク リストのように扱い、ビンを病院のように扱うとしたらどうでしょうか。

基本的に、アイテムのリストを調べて、各アイテムについて、最も優先するビンを見つけます。ごみ箱を確認してください。 このアイテムを入れるスペースはありますか? そうでない場合は、現在持っているどのアイテムよりも好きですか? 「いいえ」の場合、項目のリストからこのビンを取り消して、項目の次の選択肢に移動します。
はいの場合、このアイテムをビンに置き、移動したアイテム (ある場合) を不一致プールに戻します。

あなたの問題と居住地の一致の違いは、事前にビンの設定を修正しないことです。代わりに、ビンが 100% いっぱいになるアイテムを優先するルールを使用します。

私の唯一の懸念は、この変更によりアルゴリズムが不安定になる可能性があることです。しかし、これは非常に単純なアルゴリズムなので、おそらく試してみる価値があります。

于 2011-02-21T17:24:45.123 に答える
1

これは二部マッチング問題であり、多項式時間で解くことができます。

http://en.wikipedia.org/wiki/Matching_(graph_theory)#Maximum_matchings_in_bipartite_graphs

于 2011-02-21T17:46:37.703 に答える