2次元のパッケヌゞ化に぀いおオフラむンアルゎリズム

今日、Habr様、コンビナトリアルオプティマむれヌションに぀いおお話したす。
叀代少なくずも前䞖玀の初めからから、数孊者は、必芁で有甚な物のある量のビヌルをバックパックに最適に入れる方法を知りたした。 ナップザックずそのサブタスクの問題が定匏化されたした-䜕千もの -コンピュヌタ科孊者、暗号䜜成者、さらには蚀語孊者に興味を持っおいる。

2次元のパッケヌゞング2次元のビンパッキングの問題の1぀であるコンテナヌの パッキング  ビンパッキング問題 は、ナップザックの問題から生じたした。 いく぀かのバリ゚ヌションを再び砎棄したので、ようやく半制限されたストリップの2次元パッキング2次元ストリップパッキング、2DSPに行きたした。 すでに舞台裏にどれだけ面癜いものが残っおいるのか感じおください。 しかし、私たちは分類を歩き終えおいたせん。 2DSPには2぀の入力オプションがありたす。パックされたオブゞェクトのセットが事前にわかっおいる堎合オフラむンの問題ず、デヌタがバッチで到着する堎合オンラむンの問題です。

この蚘事では、オフラむンバリアント2DSPを解決するためのアルゎリズムに぀いお説明したす。 カットの䞋には、少しの玠材ず色の付いた正方圢の写真がたくさんありたす。

実際、問題は䜕ですか


2次元のパッキング問題の特殊なケヌスずしお、2DSPは、特定の圢状のオブゞェクトを特定の圢状の有限数のコンテナヌにパッキングするこずにあり、䜿甚されるコンテナヌの数が最小になるか、オブゞェクトの数たたは䜓積パックされるが最倧になりたす。 2次元パッケヌゞずの違いは、コンテナが1぀しかないこずです。コンテナの数を最小化する代わりに、1぀の高さを最小化したす。 必芁に応じお最倧の梱包密床を提䟛したす。

問題はNP困難であるため、研究は䞻に近䌌解法アルゎリズムの開発に焊点を圓おおいたす。  遺䌝的アルゎリズムはHabréで蚀及されたした。 近䌌アルゎリズムは、䞀定の粟床で最適な゜リュヌションを芋぀けたすが、デヌタセットの最適なパッケヌゞ化を保蚌するものではありたせん。 この堎合、最適性の基準は、最適化しようずしたものによっお異なりたす。
私は、最も単玔な戊略ず、これが人生でどのように適甚されるかに぀いお説明したすビヌルの入ったバックパックを陀く。

したがっお、n個の長方圢のセットず、幅Wが固定され、高さが無限の半制限のコンテナヌガラスがありたす。 幅の各長方圢はWを超えたせん。タスクは、グラスをできるだけ小さくするために、オヌバヌレむや亀差なしで長方圢をグラスに入れるこずです。 すべおの長方圢を盎亀しおパックする必芁があり、回転できないこずに同意したしょう。
゜ヌスデヌタ
20䞖玀の初め、キュヌビズム
半制限車線包装オプション悪いパッケヌゞングオプションより良い

この問題には、パックされた長方圢の高さがストリップの幅で割った合蚈面積に等しいずいう理想的な゜リュヌションがあるこずがわかりたす。

動物園アルゎリズム


2DSPのオフラむンバヌゞョンでは、すべおのパックされた長方圢のサむズがすぐにわかるため、特定の基準に埓っお゜ヌト、遞択、グルヌプ化、たたは適切な堎所ぞの単玔なバンプが可胜です。 ほずんどのアルゎリズムはこれに基づいおいたす

  1. レベルレベル
  2. 棚棚
  3. フラット平面

フラットアルゎリズムは長方圢を互いに厳密に近づけお配眮したすが、これは䞀芋するず思われるかもしれたせんが、これは最も成功した戊略ではありたせん。 レベル1は、ストリップを遞択された長方圢の1぀ず同じ高さのレベルに分割し、他のすべおを特定の基準に埓っお特定のレベルに配眮したす。 シェルフシェルフは、䞀床に耇数のシェルフシェルフを事前に決定し、それらに沿っお長方圢をプッシュしたす。この動䜜はオンラむンアルゎリズムの兞型であり、これはたったく別の話です。

䞀般的な単語に拡匵するよりも、すべおを順番に凊理する方が適切です。

次のフィット枛少高


圌らが蚀うように、アルゎリズムは「額に」。 長方圢は高さの増加なし高さの枛少のヒントで䞊べ替えられ、最高はストリップの巊䞋隅にあり、それにより高さが等しい最初のレベルを初期化したす。 残りの長方圢は巊から右に配眮されたすが、珟圚のレベルにはスペヌスがありたす。 レベルに収たらない長方圢は䞊に配眮され、次のレベルを圢成したす。
次の2぀の䟋に぀いお、各アルゎリズムの図を䜜成したす。明確にするために、巊偎では長方圢の圢状が長くなり、右偎ではより正方圢になりたす。

NFDHアルゎリズム
 入力パックする長方圢の数n、
       長方圢の寞法 
        {wLi;  hLi}およびストリップ幅W
出力ストリップで埗られたパッキングの高さ。
  1レベル= 0;  hレベル= 0;  wレベル= 0;  i = 1
  2hL1≥hL2≥...≥hLnのように、高さが増加しない順に長方圢を゜ヌトしたす
  3ストリップの䞋郚で巊揃えの長方圢Liをパック
  4hレベル= hLi;  wレベル= wLi
  5i = 2..nの堎合
  6W-wレベル≥wLiの堎合
  7長方圢Li-1の右偎に長方圢Liを詰める
  8wレベル+ = wLi
  9else [W-wレベル<wLi]
 10前のレベルの䞊に新しいレベルを䜜成し、新しいレベルに長方圢Liをパックしたす
 11レベル++;  wレベル= wLi;  hレベル= hレベル-1+ hLi
 12終了する堎合
 13終了
 14H = hレベルを印刷 


ファヌストフィットの枛少


前のアルゎリズムず同様に、次の長方圢ごずに、堎所が最埌のレベルだけでなく、最䜎レベルから怜玢されるずいう違いがありたす。 したがっお、「最初の適合」-長方圢は䞋から最初の適切なレベルに配眮されたす。 盎芳的には、パッケヌゞングの方が優れおいたす。 別の重芁な違いはパフォヌマンスです。最悪の堎合、すべおのレベルをボトムアップですべおのステップで考慮する必芁があるためです。

FFDHアルゎリズム
 入力パックする長方圢の数n、
       長方圢の寞法
        {wLi;  hLi}およびストリップ幅W
出力ストリップで埗られたパッキングの高さ。
  1レベル= 0;  hレベル= 0;  i = 1;  LevelNum = 1
  2hL1≥hL2≥...≥hLnのように、高さが増加しない順に長方圢を゜ヌトしたす
  3ストリップの䞋郚で巊揃えの長方圢Liをパックしたす。  hレベル+ 1= hLi
  4for i = 2..n do
  5すべおのレベルを䞋から十分なスペヌスのある最䜎レベルで怜玢したす
  6そのようなレベルが存圚する堎合
  7長方圢Liをそのレベルで巊揃えでパック
  8その他[既存のすべおのレベルに十分なスペヌスがない]
  9LevelNum ++;  level = LevelNum;  hレベル= hレベル-1+ hLi
 10新しいレベルで長方圢Liをパックする
 11終了する堎合
 12終了
 13H = hレベルを印刷 


ベストフィットが高くなる


前のアルゎリズムの修正。 その本質は、最初の長方圢ではなく、次の長方圢のパッキングに適したレベルのものであり、最適なものが遞択されたす。 最適なレベルは、珟圚の四角圢をパックした埌にスペヌスが最小限になるレベルです。 簡単に蚀えば、最小の適切なスペヌスが遞択され、レベルのより良い充填に貢献したす。

BFDHアルゎリズム
 入力パックする長方圢の数n、
       長方圢の寞法
        {wLi;  hLi}およびストリップ幅W
出力ストリップで埗られたパッキングの高さ。
  1レベル= 0;  hレベル= 0;  i = 1;  LevelNum = 1
  2hL1≥hL2≥...≥hLnのように、高さが増加しない順に長方圢を゜ヌトしたす
  3ストリップの䞋郚で巊揃えの長方圢Liをパックしたす。  hレベル+ 1= hLi
  4for i = 2..n do
  5すべおのレベルを怜玢しお、十分なスペヌスがあり、残りのスペヌスが最小のレベルを探したす
  6そのようなレベルが存圚する堎合
  7長方圢Liをそのレベルで巊揃えでパック
  8その他[既存のすべおのレベルに十分なスペヌスがない]
  9最䞊䜍レベルの䞊に新しいレベルを䜜成し、長方圢Liをパックしたす
 10LevelNum ++;  level = LevelNum;  hレベル= hレベル-1+ hLi
 11終了する堎合
 12終了
 13H = hレベルを印刷 


ナップザック0-1


ここに詳しく滞圚する䟡倀がありたす。 ナップザック0-1は、ナップザック問題の特殊なケヌスです。 䞻な質問いいえ、42ではなく、結果のパッケヌゞングボリュヌムに答えるだけでなく、 ゜リュヌションパッケヌゞ化する必芁があるアむテムのリストを提䟛するこずも泚目に倀したす。 手順は次のずおりです。長方圢は高さの増加しない順に゜ヌトされたす。 最初の長方圢は新しいレベルにパックされたす。 このレベルでは、ナップザック0-1問題の解決策がありたす。これは、面積が最倧化された長方圢のリストを提䟛したす。 遞択された長方圢がパックされ、アンパックされたリストから抜出され、レベルが閉じられ、新しい長方圢が開きたす-通垞どおり、残りの最初の最高が初期化されたす。 長方圢ができるたで繰り返したす。

アルゎリズムKP01
 入力パックする長方圢の数n、
       長方圢の寞法
        {wLi;  hLi}およびストリップ幅W
出力ストリップで埗られたパッキングの高さ。
  1hL1≥hL2≥...≥hLnのように、高さが増加しない順に長方圢を゜ヌトしたす
  2レベル= 0
  3展開された長方圢がある間に
  4最初にアンパックされた長方圢をパック、Liが蚀う
  5hレベル+ = hLi
  6KP01むンスタンスを解決する
  7遞択した長方圢をパック
  8レベル=レベル+ 1
  9しばらくの間
 10印刷H = hレベル 


スプリットフィット


「分割統治」の原則に基づいおFFDNを改善するために蚭蚈されたアルゎリズム。 たず、ストリップの半分よりも広い長方圢が遞択されたす。 最初に梱包されたす。 これらのうち、さらに広いものが遞択されたす。ストリップの2/3よりも広いです。 FFDHアルゎリズムが詰め蟌たれおいたす。 それらの䞊に、 次のレベルから始めたしょうレベルRず呌びたしょう、残りの1぀はパックされおいたす。それらはただ1/2より広いですが、すでに2/3です。 たた、FFDHを䜿甚しおパッケヌゞ化されたす。 この分割は、レベルRで始たり、パッケヌゞの珟圚の䞊郚境界で終わる、ちょうどパックされたものの右偎に1/3の幅の空き領域を䜜成したす぀たり、長方圢1/2 <幅<= 2/3の䞊に拡匵したせん。 1/2ストラむプよりも狭い残りのすべおの長方圢は、最初に同じFFDHを䜿甚しお、圢成された領域に詰め蟌たれ、収たらない堎合は䞊から詰められたす。 蚀葉では面倒に聞こえたすが、画像はより鮮明になりたす。 そしお、私の文孊的な゚クササむズにすでに疲れおいる人のために-擬䌌コヌド

SFアルゎリズム
 入力パックする長方圢の数n、
       長方圢の寞法
        {wLi;  hLi}およびストリップ幅W
出力ストリップで埗られたパッキングの高さ。
 1m≥1をL内のすべおの長方圢の最倧敎数ずしたす
   最倧で幅1 = m
 2長方圢のリストLを2぀のサブリストL1ずL2に分割したす
    L1は、幅よりも倧きい長方圢のリストです
    1 /m + 1、L2は最倧1 /m + 1の幅の長方圢のリスト
 3FFDHアルゎリズムを䜿甚しお、L1長方圢をストリップに詰めたす
 4このパッキングのブロックを再配眮しお、幅のブロックを
    m + 1/m + 2よりも倧きい堎合、幅よりも小さい
   最倧m + 1/m + 2
 5幅が最倧で1 /m + 2の長方圢を領域Rに詰める
   長方圢が䞊郚に重ならないようにFFDHアルゎリズムを䜿甚する
    RのRずRに収たらないものは、L1のパッキングの䞊にパッキングされたす。
 6各レベルの高さを远加するこずにより、ストリップの高さを出力したす 


参加する


どうやら、このアルゎリズムは入力デヌタの特定の性質のために投獄されたした。たあ、実際の状況には存圚する暩利がありたす。 これで、すべおを自分で理解できるようになりたす。 通垞のように、増加しない高さで゜ヌトされた長方圢はペアで結合され、ペアの高さの差が指定された分数通垞0〜10を超えないようにしたす。 別の条件は、それらの合蚈幅がストリップに収たるこずです。 結果の「スヌパヌ長方圢」は、NFDHずFFDHを䜿甚しおペアなしで残りず䞀緒にパックされ、最適な゜リュヌションが遞択されたす。
長方圢が幅で䞊べ替えられ、垂盎方向に結合される堎合、このアルゎリズムにはバリ゚ヌションがありたす。これは、ペアの幅の最倧偏差が所定のパヌセント数だけ同じ条件で行われたす。

結合アルゎリズム
 入力パックする長方圢の数n、
       長方圢の寞法
        {wLi;  hLi}、aずしおの定数ガンマ
       割合ずストリップ幅W
出力ストリップで埗られたパッキングの高さ。
  1hL1≥hL2≥...≥hLnのように、高さが増加しない順に長方圢を゜ヌトしたす
  2j = 1
  3䞀方、j + 1≀n do
  4ifhLj-hLj + 1/ hLj* 100 <ガンマ
         そしおwLj+ wLj + 1≀W
  5wLj+ = wLj + 1
  6j + = 2
  7その他
  8j ++
  9終了する堎合
 10終了
 11NFDHおよびFFDHアルゎリズムを実行しお、長方圢をパックしたす
 12最適な゜リュヌションから、元のむンスタンスの実行可胜なパッキングを構築したす
 13各レベルの高さを远加するこずにより、ストリップの高さを出力したす 


回転しない床の倩井


ただスペヌスレベルにずどたるこずに困惑しおいる堎合は、このアルゎリズムが最適です。 長方圢は高さの増加によっお゜ヌトされたす予想倖に、そうですかそしお、いく぀かの修正を加えたBFDHアルゎリズムが適甚されたす。 各レベルには「床」ず「倩井」がありたす。 可胜な限り、長方圢は「床」に巊から右に詰め蟌たれたす。 堎所が終わるず、「倩井」を右から巊に詰め蟌もうずしたす。 倩井にスペヌスがない堎合は、新しいレベルのみが始たりたす。 BFDHの最高の䌝統では、あらゆる段階で、最初に「床」、次に「倩井」のすべおのレベルが最適な堎所で衚瀺されたす。 ご芧のずおり、パッケヌゞングは​​悪くありたせん。 このメ゜ッドは、「倩井」に最小の長方圢を正垞にパックしたす。

FCNRアルゎリズム
 入力パックする長方圢の数n、
       長方圢の寞法
        {wLi;  hLi}およびストリップ幅W
出力ストリップで埗られたパッキングの高さ。
  1hL1≥hL2≥...≥hLnのように、高さが増加しない順に長方圢を゜ヌトしたす
  2for i = 1..n do
  3Liが䞊限に達した堎合
  4倩井にLiを最小限の残䜙スペヌスで詰める
  5その他[Liは䞊限に達しおいない]
  6Liがフロア実珟可胜であれば
  7最小の残䜙スペヌスで床にリチりムを詰める
  8その他[Liはフロア実行䞍可胜]
  9レベル++;
 10終了する堎合
 11終了する堎合
 12終了
 13ストリップの高さHを出力したす。これは、各レベルの高さを远加するこずにより求められたす 


スレむタヌ


レベルに分割するこずなく、「フラットな」アルゎリズムの時代が来たした。 Sleatorアルゎリズムは、バックパックをパックするずいう盎感的な原則を䜿甚したす。最倧のアむテムを䞋に折り、小さなアむテムで埋めたす。 倖芳は次のずおりです。 長方圢から、ストリップの半分よりも幅が広い、幅の広いものが遞択され、掚枬し、巊に揃えおランダムに積み重ねられたす。 残りのものは、増加しない高さで゜ヌトされ、既に配眮されおいるものに向かっお巊から右に次々に積み重ねられ始めたす。 それらの合蚈幅がストリップの幅の半分を超えるずすぐに、残りのストリップは、「珟時点では少ない」ずいう原則に埓っお、巊ストリップの巊端から開始たたは右䞭倮からに散らばりたす。 図からわかるように、ボックスよりもこの方法で本を積み重ねる方が䟿利です。

Sleatorアルゎリズム
 入力パックする長方圢の数n、
       長方圢の寞法
        {wLi;  hLi}およびストリップ幅W
出力ストリップで埗られたパッキングの高さ。
  1Lを長方圢で構成される2぀のサブリストL1およびL2に分割する
    それぞれ幅が1/2より倧きく、最倧で1/2の幅。
  2L1のすべおの長方圢を巊䞊に揃えお積み重ねたす
    ストリップの䞋郚から開始したす。  hstackを蚈算する
  3パッキングはHstackより䞊に続きたす
  4増加しない高さに埓っおL2の長方圢を゜ヌトしたす
     inに察しおhLi≥hLi + 1
  5HtallをリストL2の最も高い長方圢の高さずしたす。
  6巊から右に巊揃えで長方圢を詰める
    詰めるスペヌスが䞍十分になるたでストリップの端
    長方圢たたはすべおの長方圢がパックされおいる
  7ストリップを垂盎線で2぀の等しいセグメントに分割したす。
    内郚が傍受される可胜性のある長方圢が1぀ある可胜性がありたす
    瞊線で。
  8HrightずHleftを右偎の長方圢の高さずする
     それぞれ巊巊たたは右の゚ッゞを持぀ストリップの半分
    垂盎線に隣接しおいるか、その内郚が遮断されおいる
    瞊線で
  9展開された長方圢がある間に
 10長さ半分の氎平線を描く
      高さがHleftずHrightである長方圢
 11埌続の梱包はすべお巊偎になりたす
      たたはストリップの右セグメント
 12最小の高さずパックのセグメントを遞択したす
      ストリップの端から
      すべおの長方圢が完成するたでの瞊線
      パックされおいるか、収たらない長方圢がある
 13終了
 14印刷H =最倧{Hleft;  Hright} 


バヌク


ここでも、远加の「高さマップ」が導入されるレベルレスアルゎリズム
 |  |  |  _ _ ___ |
 |  |  |  |  | _ | _ |  |  |
 |  |  | _ |  |  |  |  |
 | _ _ _ _ _ _ _ _ _ | |  .. | _ | _ | _ | _ _ | _ | _ _ |
  0 0 0 0 0 0 0 0 0 1 0 3 2 3 0 3 3 

これは、ストリップが塗り぀ぶされるず、最も塗り぀ぶされおいない領域ずその幅を远跡できる配列です。 最初はれロで埋められたす。 長方圢は、増加しない、突然の幅で゜ヌトされたす。 次に、アルゎリズムの各ステップで
1.最䜎領域の䜍眮が蚈算されたす-配列の最小倀のむンデックス。
2.最も適切な長方圢が遞択されたす-最初に、この領域に収たり、次に、できるだけ広く塗り぀ぶされたす。
3.適切な長方圢が芋぀かった堎合、次のいずれかの方法でこの領域に配眮されたす。
3.1。゚リアの巊端。
3.2近隣の1぀がストリップの゚ッゞである堎合、より高い近隣に近い堎合、゚ッゞに近い。
3.3近隣の1぀がストリップの端である堎合、より䜎い隣に近く、その埌端から遠い。 長方圢の幅に察応する配列の倀に、その高さが远加されたす。
4.適切な長方圢がない堎合、゚リアは、その高さを最も近い゚ッゞの高さに揃えるこずによっお「塗り぀ぶされ」たす。
このアルゎリズムを䜿甚しおテトリスをプレむするボットをすでに䜜成したいずお考えですか

バヌクアルゎリズム
 入力パックする長方圢の数n、
       長方圢の寞法
        {wLi;  hLi}およびストリップ幅W
出力ストリップで埗られたパッキングの高さ。
  1wLi≥wLi + 1≥..≥WLnのように、増加しない幅に埓っお長方圢を゜ヌトしたす
  2各配眮ポリシヌに぀いお
     巊端、最も高い隣人、最も小さい隣人do
  3長方圢がパックされおいない間
  4最も䜎いギャップを芋぀ける
  5wLi≀GapWidthの堎合
  6配眮ポリシヌを䜿甚しお最適な四角圢を配眮する
  7配列の芁玠を適切な高さに䞊げる
  8その他
  9最䞋䜍の高さたでギャップを䞊げる
 10終了する堎合
 11終了
 12終了
 13最倧の゚ントリを持぀配列の芁玠は、パッキングの党䜓の高さを瀺したす
 14各配眮ポリシヌによっお取埗された総梱包高さを比范し、最適な゜リュヌションを返したす 


誰が良い


各アルゎリズムの結果は垯域幅のレベルであり、少ないほど良いです。 それに察する最適の比率によっお掚定できたす



2セットの゜ヌスデヌタの結果を比范したす。
最適
決定
NfdhFfdhBfdhKp01SF参加するFCNRスレむタヌブルヌク
セット11490.650.710.710.710.750.610.830.680.72
セット21400.660.770.770.780.770.700.840.510.71

Floor Ceilingアルゎリズムが䞡方のデヌタセットで勝ったこずがわかりたす。 Sleatorは最初のセットでより良い結果を瀺し、反察にJoinは2番目のセットにより適しおいるこずに泚意しおください。 しかし、これはすべお統蚈に過ぎたせん。

゚ピロヌグ


簡単な定匏化により、バむナリパッケヌゞングのタスクは、オブゞェクトの盎接的な梱包や材料の切断、資金の割り圓お、クラスタヌでのタスクの蚈画など、膚倧な数の実甚的なアプリケヌションに適甚できたす。 人生には掗緎された問題はほずんどありたせんが、いく぀かの条件が限られおいるため、状況を倚項匏時間で達成できる優れた゜リュヌションを備えた矎しい数孊モデルに枛らすこずができたす。 そしお、䞀床、バタフラむ効果の結果ずしお、砎棄された条件はかなりの重量を芁し、決定はすべおの無名の人に枡りたす。 䞖界が䞍完党であるのはそのような仮定のためです。

気が散ったもの。 次の郚分では、タスクのオンラむンバヌゞョンずオフショアアルゎリズムに぀いおお話したいず思いたす。 頑匵っお


むンスピレヌションの源
Nthabiseng Ntene 2D指向ストリップパッキング問題ぞのアルゎリズム的アプロヌチ
デビッド・ピシンガヌナップザックの問題
二次元パッキングに関する調査
レベルアルゎリズムずシェルフアルゎリズム 泚意、涙目蚭蚈

コヌドQt
アルゎリズムpackager.h packager.cpp
Gui window.h window.cpp renderarea.h renderarea.cpp main.cpp

UPD オンラむンアルゎリズム

Source: https://habr.com/ru/post/J136225/


All Articles