さまざまな形と色の長方形のグリッドがあり、同じ色のレイアウトを表す長方形の数を減らしたい(最適に近いほど良い、最適である必要はない)とします。
上の画像は非常に単純化されたケースであり、長方形間の空白は視覚化のみを目的としています-実際には密に詰め込まれています。
これを行うのに役立つアプローチまたはアルゴリズム名(Googleに満足)とは何ですか?
さまざまな形と色の長方形のグリッドがあり、同じ色のレイアウトを表す長方形の数を減らしたい(最適に近いほど良い、最適である必要はない)とします。
上の画像は非常に単純化されたケースであり、長方形間の空白は視覚化のみを目的としています-実際には密に詰め込まれています。
これを行うのに役立つアプローチまたはアルゴリズム名(Googleに満足)とは何ですか?
回答:
最初に、ソース長方形を下にあるグリッドのセルに変換して、入力をより均一にすることができます。(効果的に問題をラスタライズする)
これにより、ソースの四角形を直接操作する場合、特に複数のソースの四角形を分割してそれらを別の方法で再結合する場合に、明らかではない最適化を見つけることができます。
次に、深さ優先探索アルゴリズムまたは塗りつぶしアルゴリズムを使用して、同じ色の接続された領域を見つけることができます。接続された各リージョン(ポリオミノ)を個別に検討できます。別のリージョンに対して行うことは、このリージョンに影響を与える必要はありません。
事実上、このポリオミノを長方形に分解する方法を見つけたいと思います(残念ながら、私が見つけることができるほとんどの文献は、反対の問題についてです:長方形をポリオミノに分解する!これにより、リードを検索するのが難しくなります...)
簡単な方法の1つは、隣接する正方形の水平方向のランを長い細長い長方形に結合することです。次に、上の行と比較して、実行の開始と終了が一致するかどうかを組み合わせることができます-各実行/行を終了するとき、または各セルを現在の実行に追加することを検討するとき。
この方法がどれほど最適になるかはまだわかりません。まだ考慮していない行が、これまでに見た行とは異なるスプリットを示唆している場合、少し問題が発生する可能性があります。
ラン/長方形が上下のランで正確にカバーされていることを検出し、それを分割してマージすると、この特定のケースが解決されますが、問題がどれほど一般的であるかは調べていません。
また、ポリオミノの周囲を歩いて凹型のコーナーに遭遇するたびに横切る方法も調べましたが、この方法ではエラーが発生しやすくなります。最適な結果を得るには、2つの凹型コーナーを結合するカットに優先順位を付ける必要があり、くぼみを含む形状には特別な処理が必要であるため、行スキャン方式には単純さの利点があるようです。
私が検討しているもう1つの方法は、一番上の行にある最初の実行を取得して、できる限りそれを下に拡張することです。次に、残っている一番上の行を最初に実行します。ただし、これは逆T字型につまずくため、最適でもありません。
動的プログラミングを使用して最適な分割を見つける方法はおそらくあるように思いますが、まだそれを見つけていません。