web-dev-qa-db-ja.com

それが範囲内になるようにバケット内のいくつかの要素を分散させる方法は?

私は50個の要素n1、n2、n3、...、n50と限られた数のバケット、たとえば5バケットを持ち、各バケットはたとえば100から150までの範囲しか保持できません(これは、要素の合計にすぎません)そのバケット)、ただし100未満でも150未満でもありません。

5つのバケットすべてが使用され、すべての要素(n1、n2、n3など)も使い果たされるなど、このアルゴリズムを解決するのに最も適したアルゴリズムはどれですか。

バケットを使用できない場合、または要素を除外する必要がある場合、アルゴリズムは「InvalidConditionsFound」を返すだけです。

私はあなたに与えられた数に近い組み合わせを与えるナップザックを試しましたが、範囲内でそれを取得し、すべてのバケットがいっぱいになるように賢明に選択する方法を確認します他のバケツはたったの50ですか?

5

50要素x 5バケット?それらは少数です。総当たりバックトラックヒューリスティックがおそらく機能します。それらを並べ替え、バケットの合計を同じにしようとする要素をバケットに追加します。 1回のパスで解決策が得られない場合は、後戻りします。

私はかつて同様のプロセスを使用して、商品のパレットをトラックに割り当てました。目標は、すべてのパレットを収容するために必要なトラックの数を最小限にすることでした。各トラックには最大積載量(およびパレット制限)がありました。まず、ベストフィットファーストに従って、理論上の最小数のトラックをロードしました。パレットが残っていた場合は、最も空いている2台のトラックを見つけて、ブルートフォースで再梱包して、もう1つのパレットで圧搾できるかどうかを確認しました。このアルゴリズムにより、総重量が499,000ポンドの200個のパレットが、それぞれ50,000ポンドの容量を持つ10台のトラックに詰め込まれました。

2
kevin cline

Kバケットがあり、現在は5つです。

正の入力値を並べ替え、それらの合計sを見つけます。それを確認する 100 × K ≤ s ≤ 150 × K、またはすぐに中止します。

最大値から最小値まで、各入力値を貪欲に処理し、バケットに割り当てます。アルゴリズムの1つの変形では、それを現在最も軽いバケットに決定論的に割り当てます。より高価なバリアントでは、適格なバケットにランダムに割り当て、最初はうまくいかなかった場合のある程度のバックトラックまたは再試行に備えます。

1
J_H