より大きなリストからアクティビティのサブセットを選択するアルゴリズムを開発しようとしています。選択した場合、各アクティビティは一定量の固定リソースを使用します (つまり、選択したアクティビティの合計が総予算を下回っている必要があります)。複数の実行可能なサブセットが存在する可能性があり、それらから選択する手段は、選択されていない活動の機会費用の計算に基づいています。
編集:これが0-1 ナップザックの問題ではない理由が 2 つあります。
- ナップサックでは、重み (つまり、消費されるリソース) に整数値が必要ですが、私のリソース消費 (つまり、ナップザックの用語では質量) は連続変数です。(明らかに、ある程度の精度を選択して必要なリソースを量子化することは可能ですが、ビンのサイズは非常に小さくする必要があり、ナップサックは
O(2^n)
W. - アプリオリに機会費用を計算することはできません。つまり、それぞれの活動の適合性を個別に評価することはできませんが、特定の一連の選択された活動の効用や、既存のリストに追加のタスクを追加することによる限界効用を評価することはできます。
私が行った調査では、素朴なアプローチが示唆されています。
パワーセットを定義するパワーセット
の各要素について、セットにない項目に基づいてその効用を計算します
最高の効用を持つ要素を選択します
ただし、実行時間と必要なメモリを高速化する方法があることは知っています。例えば:
- パワーセットを完全に列挙する
O(2^n)
ことはできますが、リストを完全に列挙する必要はありません。予算を超えるタスクのセットを見つけたら、それ以上のタスクを追加するセットは実行不可能であり、拒否される可能性があることがわかっているからです。つまり、{1,2,3,4}
が実行不可能な場合、 も実行可能です{1,2,3,4} U {n}
。ここで、n は、より大きなリストに残っているタスクのいずれかです。 - 私は義務を要約しているだけなので、タスクの順序は重要ではありません (つまり、実行可能であれば、 、 など
{1,2,3}
もそうです)。{2,1,3}
{3,2,1}
- 最終的に必要なのは選択されたセットだけなので、おそらく比較目的でこれまでに見つかった最高の効用値のみが必要です。
- すべての実行可能なものを確認したと確信できる限り、リストの列挙を保持する必要はありません。(ただし、以前に計算された実行可能なサブセットのデューティ合計を維持すると、実行時間が短縮される可能性があると思います。)
優れた再帰アルゴリズムが機能すると確信していますが、疑似コードであっても、それを定義する方法がわかりません (おそらく、いくつかの言語で実装されるため、これが最も理にかなっています-おそらくプロトタイピング用の Matlab と、後でコンパイルされた言語)。