たとえば、double
sのリストがいくつかあり、固定サイズの複数の「バケット」で配布する必要があります(バケットサイズもdouble
)。2つの追加の制約があります。
特定のリストの値は、特定の(事前に指定された)バケットにのみ送信できます。
bucket1 <-\ |--- list1 / / bucket2 <--\ bucket3 <---- list2 bucket4 <--/ bucket5 <--- list3
結果として得られる分布は、可能な限り均一である必要があります(たとえば、すべてのバケットの負荷率が
0.5
)。
このような問題の具体例:複数の電源ユニット(「バケット」)と複数のランプボードがある場合を想像してみてください。各供給ユニットは1つまたは複数のボードに接続され、各供給ユニットの容量は異なり、ランプはさまざまな量のエネルギーを消費します。一部のボードが複数の電源ユニットに接続されている場合は、一部のランプを最初の電源に、一部を2番目の電源に「割り当てる」ことができます。
ブルートフォースでこれを行うと、多数の要素に対してすぐに実行不可能になります。
効率的なアプローチはありますか?
編集:私は次のアプローチを考案しました-それは必要な結果にかなり早く収束するようです。アイデアは次のとおりです。
- まず、リストごとに、最小負荷のバケットヒューリスティックを使用して、許可されたバケットにアイテムを配布します。
- 次に、次のことを行います。
- リストごとに:
- リストに対応するアイテムをバケットから削除します
- 同じ最小負荷のヒューリスティックを使用して、それらを再度配布します
- 最大負荷のバケットサイズと最小負荷のバケットサイズの比率を計算します(許可されたバケットの場合)
- 比率が一定未満の場合(私が取った
1.02
)、または通過したステップが多すぎる場合は、ループを終了します。
- リストごとに:
一般的な考え方は、分布が十分にフラットになるまでバケットを「スムーズ」にすることです。これは通常、必要な目標に到達したことを意味します。
それは良いアルゴリズムですか?