3
アイテムの配送用の3Dパッキングアルゴリズム
可能な限り少ない箱に商品を収納するための最良の方法を提案する配送見積もりを作成するタスクを受け取りました。 既知の長方形のボックスサイズには有限のセットがあります 箱の中に詰められる多くの任意の長方形のアイテムがあります 少ないボックスが最適に使用されるべきです。2つの箱1x1x1を出荷するのは、1つの箱1x2x1よりもはるかに高価だからです。ここが優先事項です。 また、第2レベルの優先度として、できるだけ小さなボックスを使用するように最適化する必要があります。(例:1つの大きな箱と2つの小さな箱から選択できる場合、大きな箱を選択する必要があります) アイテムはボックスに収まるように回転できますが、回転は少なくとも45°の増分に制限する必要があります(私の研究では、一部の構成では、より大きな四角形のボックス内に四角形のボックスをより適切に収めることができるようです) 、90°回転であることが標準です。 ボックスには重量制限があり、アイテムには任意の重量があります(例:サイズが1x1x1のアイテムは、他の2x2x2アイテムよりも重いことがあります) 私は少し調べて、ビンのパッキングとナップザックの問題に関するいくつかの抽象化アルゴリズムを見つけましたが、次のやや強引なバリエーションがあり、最適なアルゴリズムに似ています。 「梱包するアイテム」リストで、アイテムを減少したボリューム順(大きい方)に並べ替えます このリストの各アイテムについて: 「使用済みボックス」リストにある小さなアイテムを選択し、アイテムに合うのに十分な残りの容量と重量の制限があります(寸法と重量を合わせるためにここでフィットを使用します) そのようなボックスがない場合、可能なボックスサイズの既知のセットから新しいアイテムを作成します。これは、アイテムの寸法と重量に適合する最小サイズで、「使用済みボックス」のリストに追加します。 ボックスがアイテムにフィットする場合(以下のフィット関数を使用)、「このボックスのアイテム」のリストに追加し、「フィットするアイテム」リストから削除して、ボックス内の相対的な3D位置をマークします。 「梱包するアイテム」リストに適合するアイテムがなくなるまで、2.1から繰り返します。 上記の手順2で使用されるフィッティングチェック関数: ボックスの残りのボリュームがアイテムのボリュームに収まるかどうかを確認します。そうでない場合は、falseを返します。 「箱のアイテム」の重量と現在のアイテムの重量の合計が箱の重量制限以下かどうかを確認します。そうでない場合は、falseを返します。 「ボックスのアイテム」リストをチェックして、Yコンポーネントが最小で、アイテムの幅、奥行き、高さに十分なスペースがある最初のボックス座標を選択します。 アイテムが現在の向きに収まらない場合は、単純化のために45°の回転を想定せずに、6つの可能な回転のいずれかで回転します。(すでにテストされているサイズをスキップできる回転。例えば、ボックスを180°回転させると、すべてのボックスとアイテムが反対面で同じサイズになるためスキップできるため、元の位置と同じ寸法になります。) アイテムがすべての可能な方法で元の方向に戻されていない場合は、手順3からやり直してください。 すべての回転が試行され、フィットが見つからなかった場合、現在の座標を利用できないスペースと見なします。 使用可能なスペースがない場合は、falseを返します。そうでない場合は、ステップ3から再試行してください。 提示された制約が与えられた場合、私の問題に対する最善の解決策があるかどうかを知りたいです。 これは理論上はうまくいくようですが、コードでは試していません。私は正しい方向に進んでいるか、これを行うより良い、パフォーマンスの良い方法があるかどうかを知りたいです。 参照は素晴らしいでしょう。 編集: 必要なことを行う興味深いサードパーティAPIをいくつか見つけましたが、これは切断する必要があるため、これらにアクセスすることはできません。 以下に例を示します。 http://v2.3dbinpacking.com/demo/main http://www.packit4me.com/api 編集2: 解決すべき問題の実例は次のとおりです。 私は4つのボックスサイズWxHxDを持っています:10x12x18、12x16x24、16x20x30、24x32x40 私はサイズが6x8x10、2x 22x14x30、1x 22x4x20の4つのアイテムを注文しています このアイテムを可能な限り少ないボックスを使用して、可能な限り小さいボックスを使用し、可能な限り少ない空きスペースを残して、1つ以上のサイズの任意の量のボックスに収めるにはどうすればよいですか?