web-dev-qa-db-ja.com

小さい箱を大きいパッケージに収める方法をプログラムで決定するにはどうすればよいですか?

複数の商品を出荷するためのパッケージサイズを計算する既存のソフトウェアまたはアルゴリズムを知っている人はいますか?

在庫データベースには、長さ、幅、高さの寸法が定義された多数のアイテムがあります。これらの寸法を考慮して、購入したアイテムのうちどれだけが事前定義されたボックスサイズに収まるかを計算する必要があります。

48
polara

これは Bin Packing の問題であり、NPハードです。少数のオブジェクトとパッケージの場合、あらゆる可能性を試すブルートフォース方式を単純に使用できる場合があります。それを超えて、何らかのヒューリスティックを使用する必要があります。ウィキペディアの記事には、いくつかの詳細と、おそらくチェックアウトしたい論文への参照があります。

代替案は、もちろん、非常に単純なアルゴリズム(単純にアイテムを「積み重ねる」など)で開始し、それを使用して出荷の合理的な上限を計算することです。その後、人間のパッカーがより良い結果を得ることができれば、わずかな利益を得ることができます。または、梱包が理想的でないと仮定して、計算価格をわずかに割引きます。

58
Nick Johnson

「3Dビンパッキング」に関する文献は広範に渡っています。 Professor David Pisinger の出版物を追跡することにより、良い概要を得ることができます。また、ソースコードを使用したビンパッキングの数少ない高品質実装の1つを公開しました。 dbpp.c

私自身のロジスティクスツールキット pyShipping には、倉庫アプリケーション用の3D Bin Packing実装が付属しています。基本的に4D Bin Packing(3Dサイズとサイズ)を実装しており、2回目のランタイムで典型的な注文サイズ(数十個のパッケージ)の許容できるソリューションを取得します。これは、使用する出荷クレートの上限を決定するために、数か月間、生産(倉庫を意味する)で使用されます。多くの場合、倉庫作業員はいくらか効率的に梱包することができますが、それは問題ありません。

18
max

Pisingerは working code を投稿する数少ない学者の1人です。彼の論文の1つで、彼は「最小深度」問題に言及しています。

囲みボックスの高さを調整する3D長方形ボックスパッキング用の実用的な 効率的なアルゴリズム を次に示します。

そして、ここに php の実装があります。

9
TomEE

特定のサイズのパッケージに収まる単一の型の数を確認しようとしていますか、それとも型を混在させようとしていますか?

ナップザック問題 を解決しようとしているように聞こえます。特定の要件に適応できるアルゴリズムを見つけることができるかもしれません。 効率的なアルゴリズムを見つけるのは難しいことを理解してください、問題はNP complete効率的な近似を見つけるか、入力が問題にならないほど十分に小さい場合があります)。

6
Herms

ボックスを手でパックする場合は、reasonable humanが行うことを行うアルゴリズムを記述することを検討してください。これをお勧めする理由は、注文ごとに梱包手順を印刷したい場合を除き、梱包をしている人は、注文されたアイテムがどのように多くのボックスに割り当てられるかを調べる必要があるためです注文。

これにより、人間のパッカーがSO n個のアイテムをm個のボックスにパックする方法をプログラムで実行する方法を尋ねます。:-P(yo =それを行うには、指示などを求めます)。

あなたのアルゴリズムが合理的な人間がすることをする限り、私は個人的にその出荷見積もりを受け入れます。

4
freespace

多くのパッケージおよび/または多くの制約がある場合、メタヒューリスティックは実世界のビンパッキング問題に対処するのに適しています。 1つのオープンソースJava実装は Drools Planner です。

3

たぶんこれは明白に聞こえるかもしれませんが、問題をメモし、それらのいくつかを手作業で行う価値があるかもしれません。 NP-hardの任意の入力とボックスの最も効率的なソリューションを見つけますが、問題空間を制限し、非効率性を受け入れることで、NPサイズは妥当なものになるかもしれません。 「一般的なケース」の時間を大幅に短縮できる。

階層的なパッキングの観点から物事を考えることも役立ちます。

2
Gregg Lind

多くの検索の後、誰かを助けるかもしれない GitHub リポジトリを見つけました。関数PackingService.Pack()は、パラメーターとしてパックされるContainerのリストとItem(s)のリストを取り、以下を含む多くの情報を含む結果を返します。

「パーセンテージでパックされたコンテナ、およびパックされたアイテムとアンパックされたアイテムのリスト」

0
Ammar