2

各グループが一意の要素セットを持つように、オブジェクトGroupのリストを含むデータ構造があるとします。Element

public class Group
{
  public List<Element> Elements;
}

そして、特定の要素を必要とする母集団のリストを持っているとします。各母集団が必要な要素の固有のセットを持つようにします。

public class Population
{
  public List<Element> RequiredElements;
}

定義された各グループの数量に制限はありません。つまり、集団によって消費されません

特定の を見ているとしPopulationます。余分な要素が最小限に抑えられ、一致しない要素がないように、可能な限り最適なグループの一致を見つけたいと考えています。

例: 木材、鉄鋼、穀物、石炭を必要とする人口があります。使用可能なグループは、{wood, herbs}、{steel, coal, oil}、{grain, steel}、および {herbs, meat} のみです。

最後のグループ - {ハーブ、肉} は、私の集団ではまったく必要ないため、使用されていません。他のものはすべて必要ですが、ハーブとオイルは必要ないので無駄です。さらに、最小セットには鋼が 2 つ存在するため、1 ロットの鋼も無駄になります。この例のベスト マッチの無駄は 3 です。

そのため、数百Populationのオブジェクトの場合、最適な最小の無駄を見つけて、無駄になった要素の数を計算する必要があります。

どうすればこれを解決し始めることができますか? 一致が見つかったら、無駄を数えるのは簡単です。そもそもマッチを見つけるのは難しい。すべての可能性を列挙することはできますが、数千の集団と数百のグループがあるため、それはかなりの作業です。特に、このすべてがシミュレーテッド アニーリング アルゴリズムの各反復内にあることを考慮してください。

全体を混合整数プログラムとして定式化し、各反復で GLPK のようなソルバーを呼び出すことができるかどうか疑問に思っています。

問題を正しく説明できたことを願っています。不明な点は何でも明確にできます。


興味のある方のために、これが私のバイナリプログラムです...

x{0,1} の要素である決定ベクトルであり、問​​題の母集団がグループ i から受け取る/受け取らないことを示します。グループごとにエントリーがあります。

b{0,1} の要素である列ベクトルで、問題の母集団が必要とする/必要としないリソースを示します。リソースごとにエントリがあります。

A{0,1} の要素である行列で、どのリソースがどのグループに属しているかを示します。

プログラムは次のとおりです。

最小化: ((Ax - b)' * 1-ベクトル) + (x' * 1-ベクトル);

対象: Ax >= b;

制約は、必要なすべてのリソースが満たされなければならないことを示しているだけです。目的は、すべての余分なグループと使用されるグループの総数を最小限に抑えることです。(つまり、1 つのグループを使用した場合の 0 超過は、5 つのグループを使用した場合の 0 超過よりも優れています)。

4

3 に答える 3

0

次のように、母集団ごとに整数計画を定式化できPます。バイナリ変数 x jを使用して、グループ j が選択されたかどうかを示します。項目 i がグループ j に存在する場合にのみ、A ijが 1 になるように、A をバイナリ行列とします。次に、整数プログラムは次のとおりです。

min E i,j (x j A ij )

st E j x j A ij >= 1 for all i in P.

x j = 0、すべての j に対して 1。

|P|上記の IP の最適解から差し引くことで、最小の無駄を得ることができることに注意してください。

于 2012-10-09T04:29:30.813 に答える
0

重み付けされたセット カバーの問題を見てください。これはまさにあなたが上で説明したことだと思います。(重み付けされていない) 問題の基本的な説明は、ここにあります。

上で定義したように最小の無駄を見つけることは、カバー セットのカーディナリティの合計が最小になるようなセット カバーを見つけることと同じです。したがって、各セット (= 要素のグループ) の重みは、そのカーディナリティと等しく定義する必要があります。

重み付けされていないセット カバーの問題でさえ NP 完全であるため、問題のインスタンスに対して効率的なアルゴリズムが存在する可能性は低いです。たぶん、良い貪欲な近似アルゴリズムで十分ですか、それともあなたの目的ですか? 加重セットカバーをグーグルで検索すると、このスクリプトなど、いくつかの有望な結果が得られます。

于 2012-10-10T06:34:40.833 に答える
0

最大マッチング問題のことですか?

二部グラフを作成する必要があります。一方の側は母集団で、もう一方の側はグループであり、グループ A と母集団 B の間にエッジが存在する場合、グループ A と母集団 B の間にエッジが存在します。

最大エッジマッチングを見つけるには、ここ TopCoder で詳しく説明されている Kuhn アルゴリズムを簡単に使用できます。
ただし、最小エッジ支配集合 (すべての頂点をカバーする最小エッジのセット) を見つけたい場合、問題は NP 困難になり、多項式時間では解決できません。

于 2012-10-09T03:40:56.210 に答える