アイテムの配送用の3Dパッキングアルゴリズム


24

可能な限り少ない箱に商品を収納するための最良の方法を提案する配送見積もりを作成するタスクを受け取りました。

  1. 既知の長方形のボックスサイズには有限のセットがあります

  2. 箱の中に詰められる多くの任意の長方形のアイテムがあります

  3. 少ないボックスが最適に使用されるべきです。2つの箱1x1x1を出荷するのは、1つの箱1x2x1よりもはるかに高価だからです。ここが優先事項です。

  4. また、第2レベルの優先度として、できるだけ小さなボックスを使用するように最適化する必要があります。(例:1つの大きな箱と2つの小さな箱から選択できる場合、大きな箱を選択する必要があります)

  5. アイテムはボックスに収まるように回転できますが、回転は少なくとも45°の増分に制限する必要があります(私の研究では、一部の構成では、より大きな四角形のボックス内に四角形のボックスをより適切に収めることができるようです) 、90°回転であることが標準です。

  6. ボックスには重量制限があり、アイテムには任意の重量があります(例:サイズが1x1x1のアイテムは、他の2x2x2アイテムよりも重いことがあります)

私は少し調べて、ビンのパッキングとナップザックの問題に関するいくつかの抽象化アルゴリズムを見つけましたが、次のやや強引なバリエーションがあり、最適なアルゴリズムに似ています。

  1. 「梱包するアイテム」リストで、アイテムを減少したボリューム順(大きい方)に並べ替えます

  2. このリストの各アイテムについて:

    1. 「使用済みボックス」リストにある小さなアイテムを選択し、アイテムに合うのに十分な残りの容量と重量の制限があります(寸法と重量を合わせるためにここでフィットを使用します)

    2. そのようなボックスがない場合、可能なボックスサイズの既知のセットから新しいアイテムを作成します。これは、アイテムの寸法と重量に適合する最小サイズで、「使用済みボックス」のリストに追加します。

    3. ボックスがアイテムにフィットする場合(以下のフィット関数を使用)、「このボックスのアイテム」のリストに追加し、「フィットするアイテム」リストから削除して、ボックス内の相対的な3D位置をマークします。

    4. 「梱包するアイテム」リストに適合するアイテムがなくなるまで、2.1から繰り返します。

上記の手順2で使用されるフィッティングチェック関数:

  1. ボックスの残りのボリュームがアイテムのボリュームに収まるかどうかを確認します。そうでない場合は、falseを返します。

  2. 「箱のアイテム」の重量と現在のアイテムの重量の合計が箱の重量制限以下かどうかを確認します。そうでない場合は、falseを返します。

  3. 「ボックスのアイテム」リストをチェックして、Yコンポーネントが最小で、アイテムの幅、奥行き、高さに十分なスペースがある最初のボックス座標を選択します。

  4. アイテムが現在の向きに収まらない場合は、単純化のために45°の回転を想定せずに、6つの可能な回転のいずれかで回転します。(すでにテストされているサイズをスキップできる回転。例えば、ボックスを180°回転させると、すべてのボックスとアイテムが反対面で同じサイズになるためスキップできるため、元の位置と同じ寸法になります。)

  5. アイテムがすべての可能な方法で元の方向に戻されていない場合は、手順3からやり直してください。

  6. すべての回転が試行され、フィットが見つからなかった場合、現在の座標を利用できないスペースと見なします。

  7. 使用可能なスペースがない場合は、falseを返します。そうでない場合は、ステップ3から再試行してください。

提示された制約が与えられた場合、私の問題に対する最善の解決策があるかどうかを知りたいです。

これは理論上はうまくいくようですが、コードでは試していません。私は正しい方向に進んでいるか、これを行うより良い、パフォーマンスの良い方法があるかどうかを知りたいです。

参照は素晴らしいでしょう。

編集:

必要なことを行う興味深いサードパーティAPIをいくつか見つけましたが、これは切断する必要があるため、これらにアクセスすることはできません。

以下に例を示します。

編集2:

解決すべき問題の実例は次のとおりです。

  • 私は4つのボックスサイズWxHxDを持っています:10x12x18、12x16x24、16x20x30、24x32x40
  • 私はサイズが6x8x10、2x 22x14x30、1x 22x4x20の4つのアイテムを注文しています

このアイテムを可能な限り少ないボックスを使用して、可能な限り小さいボックスを使用し、可能な限り少ない空きスペースを残して、1つ以上のサイズの任意の量のボックスに収めるにはどうすればよいですか?


4
packing-relatedタグは必要ありません。algorithmsで十分です:)
クリスサイレフィス

私は興味がありますが、実際の梱包はロボットまたは人間によって行われますか?後者の場合、スペースの最適化は、各ボックスをそれに合わせて回転させる方法を見つけるのに必要な時間の価値があるでしょうか?
foraidt 14年

良い質問。実際の梱包は人間が行いますが、ソフトウェアは梱包の順序と各箱の位置を提案します。提供されたレイアウトを見て、箱の中に商品を置くために、梱包の経験は必要ありません。最初はそれに慣れるのにある程度の時間を費やしますが、最良の性質について考える必要はありません。
リカルドソウザ14年

1
@mswが言っているのは、この種の問題は「完璧な」解決策には適していない可能性が高いが、合理的な時間内に発見されたルールに基づくヒューリスティックで見つかった許容可能な解決策には適していないということだと思う提供されます。数学的な観点から、これは多くの場合、異なるアルゴリズムとツールのセットを使用してアプローチすることを意味するため、彼はそれを推奨しているだけだと思います。たとえば、遺伝的アルゴリズム、シミュレーテッドアニーリング、およびヒューリスティックに関して解空間を近似する勾配降下曲線に従う他の方法は、ここで利点を提供します。
Jトラナ14年

1
ここにアイデアを投稿しています。あなたがそれが効果的であると思わない場合、あなたはそれを無視することができます。このソリューション(最適化に似ています)は、アルゴリズムの入力がどれだけ似ているかによって異なります。あなたの入力が時間の経過とともにいくつかの類似性を持つという事実を活用します。計算結果(計算の複雑さが大きい)を保存/キャッシュしてから、入力と比較し、完全一致または部分一致がある場合は、いくつかのマイナーサイズオブジェクトを並べ替えるのにいくつかの計算を行うだけで済みます。もちろん、これにより新しい問題が発生します。
JAAAY

回答:


4

ビンパッキングは非常に計算が困難です。問題の半分を考えてみてください。製品を箱に無駄なく梱包する必要があります。そのための最適なソリューションは、1つのトラックで出荷する必要があるすべての可能なサブセットと製品のすべての可能な3D配置を通過することを必要とするでしょう。朝食前に6つの不可能なことをする友人がいるので、そのための最適なソリューションを提供します。

今、あなたは無駄なくトラック上のすべてのボックスを取得する必要があります。私の友人は彼の2番目の不可能なことをして、あなたに解決策を与えます。残念ながら、上記で選択したボックスサイズでは、最初のタスクで異なる(より大きなまたはより小さな)ボックスを選択した場合、トラック内に空きスペースがあります。1つのボックスのサイズを変更する場合、せいぜいトラックを再梱包する必要があります。最悪の場合は、すべてのボックスを再梱包する必要がありますが、これは最初の問題と同じくらい困難です。そして、最初の段階と同様に、すべての可能な3Dアレンジメントを試す必要があります。

Skienaのアルゴリズム設計マニュアルは、どのクラスのアルゴリズムがどの種類の問題に適しているかを考えるのに役立つことがわかりましたが、ほとんどの場合、日常的な問題に対する優れた解決策が計算困難に直面することを知りました。あなたが必要としているものの大部分は、ビンパッキング問題のクラスに当てはまり、その記事は良い出発点です。このタスクはロジスティクスのあらゆる場所でポップアップするため、これに最適なアルゴリズムの一部は商用製品であることに注意する価値があります(商品を入れることのできる列車の最小数はどれくらいかなど)。適切なヒューリスティックが製造業者を1か月に100台の列車車を救うことができれば、かなりのお金を稼ぐことができます。

残念ながら、ヒューリスティックの最適化に関する文献は、アルゴリズムに関する文献ほど大きくはありません。一人で行こうとするなら、2か月目までに直方体を動かすことを夢見ていることを保証します。在庫切れの問題がありました。もう一度やらなければならないとしたら、おそらく専門家(または彼らの適切なソフトウェア)に頼るでしょう。

コメントを細かく拡張してくれた@JTranaに感謝。


ご意見ありがとうございます。質問で述べたように、私はすでにこの主題について研究しており、いくつかのアルゴリズムを組み合わせて上記のアルゴリズムを提案しました。梱包自体だけが心配です。このすべてのボックスは、郵便局のサービスを介して送信されます。幸いなことに、トラックの積み込みに対処する必要はありません。
リカルドソウザ

それは私の説明のかなりの部分でした。あなたは彼らのサービスにお金を払って欲しい会社からアルゴリズムを「抽出」することはできません。リストした2つの会社にはAPIがありますが、パッキングはサーバー上で行われ、盗難を除いて実装コードにアクセスできません。そして、トラックを荷造りする必要がないのは良いことです。今ではあなたの問題は半分だけ困難になっているため、企業はあなたにソリューションを売りたいと思っており、人々は喜んでサービスを購入します。
msw 14年

1
ここで誤解があると思います。私はうまく表現できなかったかもしれません(お気づきかもしれませんが、英語は私の母国語ではありません)。私はアルゴリズムを盗むことを求めていません。私はこの問題を明確にするためにここに来ました。私はいくつかの調査を行い、analisysの上記の例にそれを置きました。たぶん私にいくつかのより良い方向性を与えることができる同じ問題に出くわした人がいるでしょう。私のソリューションが適用できない場合、より良い結果を得るためにできることは何ですか?これが私の本当の質問です。私が今より明確になったことを願っています。
リカルドソウザ14年

あなたの英語は大丈夫です。問題は、タスクのさまざまなレイヤーについて話していることだと思います。あなたは実装を考えており、私は組み合わせの爆発を考えています。Edit 2を解決することは、私が見ている方法から問題をよりよく理解するのに役立つと思います。述べられているようにそれを解決できますか?無駄のない、最小サイズの最小数の箱で?これは、前に述べたマルチオプティマイゼーションの問題であり、実行することは不可能だと言いました。これらの要因の少なくとも1つを犠牲にして、別の要因を最適化する必要があります。
msw 14年

ありがとうございました。今手に入れたと思う。私はそれをコーディングしようとしませんでした。これは、最初は引用であるため、より具体的な解決策や少なくとも私の提案に対する肯定的なフィードバックが生じる前に、コーディングを無駄にしないことを考えていました。まだ調査中ですが、これらのAPIの1つを取得して、デバイス(Win CE 6.0を実行しているデータコレクター)がインターネットに接続して実行できるかどうかを確認する必要があります。クライアントから最初に得た情報は、職場ではインターネットにアクセスできないと述べていました。
リカルドソウザ14年

1

新しいアルゴリズムを作成するとき、私は最近自分でパッキングアルゴリズムを実行しました(まだ最適化の可能性があることはわかっています)、私は常に最も簡単なアプローチを実行します。

私は人間としてどうやってそれをアルゴリズムに変換するのですか?私の(ロボット工学)AI教師のロルフ・ファイファーから私はまだ心に留めていますアンダーエンジニアしよう

  1. 大きすぎるアイテム(特定のボックスに収まらないアイテム)を特定する
  2. 可能な限り最適なボックスを見つけてください(総容積とアイテムの寸法を相互比較することにより)
  3. 大きいものから小さいものまで、および小さいものから大きいものまでボックス(スペース)を注文する
  4. 最大のアイテムを最小のスペースに収める
  5. 最大のアイテムがそれを超えて見つからない場合は、次のアイテムがそれ以上収まるまで試してください
  6. 残りのアイテムについては、新しい最良のボックスを検索します。...

    X.常に例外的なイベントについて考えます(特大のアイテム、奇妙なフォーム、ボックスに1つのアイテムしか含まれていない場合、ボックスなしのアイテムを送信する方が良いでしょうか?など)が、決定の形でもヒューリスティックを作成できます木。

もちろん、さらに注意を要する点がありますが、出発点としてこれらのアイデアを示します。そこから可能な方法はたくさんあります。1つの代替方法は、ボックスを小さな立方体(5cmx5cmx5cmなど)に分割し、それらを占有/解放として追跡することです。別のアプローチは3dテトリスなどと呼ばれます。

このアプローチを使用すると、必ずしも組み合わせ爆発を心配する必要はありません。一方、アイテムのトレインロードについて話している場合、組み合わせ爆発が発生する可能性がありますが、それでもまた、会社がアイテムごとにパッキングリストをチェックすると思いますか?いいえ、彼らは分割統治ソリューションにアプローチしません。標準化されたボリューム(パレット、固定サイズのボックスなど)を使用して複雑さを分割します。練習だけでなく、電車だけでなく、従業員の時間もお金になることを考慮に入れてください。列車はx個のパレットをロードでき、すべてのパレットの体積が固定されているため、アイテムをパレットに詰め込みますが、パレットは複数の順序で構成される可能性があるため、アイテムに固定ボックスを使用し、パレットにロードしてからパレットにロードします電車に。

少なくともそれは私が人間としてタスクに対処し、最高のボックスを取得してから、利用可能な最小のスペースに最大のアイテムを1つずつフィットさせる方法です(そしてプレビューを少し追加します)。

私のアルゴリズムのように、最終的にはおそらく最良の解決策は得られませんが、非常に優れたヒューリスティックを使用して、さらに改善することができます。

時には最初のステップから始めて、途中で問題を解決する方が簡単な場合があります。もちろん、理想的にはエッジステップの一種ではなく、少し賢く...時には、選択肢を探って選択することを余儀なくされることがあります最高のものまたは「ステップバック」を実装します。

しかし、AIの先生から学んだように(Rolf Pfeifer、もう一度お邪魔して申し訳ありません):時々、非常にシンプルで少数のルールセットで明らかな知的行動を作成できることがあります>右側で障害物を検出し、左側に障害物がある場合は右折し、障害物がない場合または障害物が正面にある場合は直進します。3個または4個のロボットを3m x 3mの正方形に入れて、ピンポンボールがたくさんあると、ロボットが掃除しているように見えるという驚くべき事実につながり、ピンポンボールを隅に押し上げます。障害物を避けるためにのみプログラムされています。

PD:このアプローチから私が見つけた唯一の現実世界の逸脱は、メタリカ、アイアン・メイデン、ブリトニー・スピアーズ、ポール・マッカートニーなど、大きなコンサートの舞台手としてパートタイムで働いていたときです。国際ツアーには、アイテムごとに正確なパッキングリストがあります。計算は一度行われ(人間や機械ではわかりません)、複製されます。時には最初に梱包するときに、レイヤーごとの写真を作成してトラックに貼り付けて、現地の乗組員がいつ、どこでどのボックスに充電する必要があるかを正確に知ることができます。しかし、1つのツアーでは常に同じボックスとトラックを使用するため、これは特定の梱包ニーズでもあります。


1

投稿で言及したヒューリスティックは興味深いようです。

最終的なソリューションを改善するために、いくつかの修正をお勧めします。

すべてのアイテムを1つの箱に詰めたソリューションを考えて、2つの小さな箱の内容を1つの大きな箱に結合してみてください(これは、できるだけ少ない箱を使用する基準を改善するのに役立ちます)。

または、新しいボックスを開始するたびに、現在のアイテムを収容できる最小のボックスを使用する代わりに、それを収容できる最大のボックスを選択し、すべてのアイテムがボックスに割り当てられたら、すべてのアイテムを割り当ててみてくださいボックスを小さなボックスに。

また、フィッティング関数では、他のボックスの位置を固定と見なす代わりに、ロードシーケンスを変更することを想像できます。これにより、実行時間が長くなりますが、より良いソリューションを見つけることができます。


それは興味深い改善のようです。私はこの問題に長い間触れていません。たぶん、私はこの日のいずれかを試してみる必要があります。ありがとう。
リカルド・ソウザ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.