web-dev-qa-db-ja.com

重複することなく長方形のセットをカバーするために最も少ない長方形を見つけるためのアルゴリズム

長方形のセットがあり、そのセットを「削減」して、元のセットと同じ領域を表す長方形の数を最小限にしたいと思います。できれば高速にもしたいのですが、できるだけ長方形の数を少なくすることに関心があります。私は現在、ほとんどの場合に機能するアプローチを持っています。

現在、私は一番左上の四角形から始め、四角形を維持したまま右下に拡張できるかどうかを確認します。展開できなくなるまでこれを行い、すべての交差する四角形を削除して分割し、展開した四角形をリストに追加します。次に、左上にある次の長方形からプロセスを再開します。ただし、場合によっては機能しません。例えば: enter image description here

この3つの長方形のセットを使用すると、正しい解決策は次のように2つの長方形になります。 enter image description here

ただし、この場合、私のアルゴリズムは青い長方形を処理することから始まります。これは下向きに拡大し、黄色の長方形を(正しく)分割します。ただし、黄色の四角形の残りの部分が処理されると、下に拡張するのではなく、最初に右に拡張して、以前に分割された部分を取り戻します。次に、最後の四角形が処理され、右または下に拡張できないため、元の四角形のセットは残ります。アルゴリズムを微調整して、最初に拡張し、次に拡張することができます。これでこのケースは修正されますが、同じようなシナリオで同じ問題が発生しました。

編集:明確にするために、元の長方形のセットは重複しておらず、接続する必要はありません。また、長方形のサブセットが接続されている場合、それらを完全にカバーするポリゴンに穴を開けることができます。

69
Mike Dour

あなたの質問のタイトルにもかかわらず、あなたは実際には、直線ポリゴンの長方形への最小の分解を探していると思います。 (ジェイソンのリンクは長方形による最小カバーであり、これはまったく別の問題です。)

David Eppstein 2010年の調査記事のセクション3でこの問題について説明しています 計算幾何学の問題に対するグラフ理論的解決策 、そして彼は この回答でmathoverflow.net

アイデアは、端点として2つの凹状頂点を持ち、それらに沿って分割され、残りの各凹状頂点に対してさらに1つの分割を形成する、互いに素な軸平行対角線の最大数を見つけることです。互いに素な軸平行な対角線の最大数を見つけるには、対角線の交差グラフを作成します。このグラフは2部構成であるため、グラフのマッチング手法により、最大独立セットを多項式時間で見つけることができます。

エプスタインの記事の図2を使用した、この見事なほど簡潔な説明に対する私の光沢は次のとおりです。おそらく穴のある直線のポリゴンがあるとします。

多角形が長方形に分解されるとき、凹面の頂点のそれぞれは、解剖の少なくとも1つのエッジによって満たされる必要があります。したがって、これらのエッジのできるだけ多くが二重の役割を果たしている場合、つまり、2つの凹状の頂点を接続している場合、minimumの解剖が得られます。

それでは、完全にポリゴン内に含まれる2つの凹状の頂点の間に軸平行の対角線を描画してみましょう。 (ここで「軸平行」とは「水平または垂直」を意味し、 多角形の対角線 は2つの隣接しない頂点を結ぶ線です。)これらの線をできるだけ多く使用したい彼らが交差しない限り解剖。

(軸に平行な対角線がない場合、解剖は簡単です。各凹面の頂点からカットを作成するだけです。または、軸に平行な対角線の間に交差がない場合は、それらすべてと残りの各凹面の頂点からのカットを使用します。 。それ以外の場合は、先にお読みください。)

一連のラインセグメントの 交差グラフ には、すべてのラインセグメントのノードがあり、エッジがラインを交差すると2つのノードを結合します。軸に平行な対角線の交差グラフは次のとおりです。

bipartite で、一方の部分に垂直の対角線があり、もう一方の部分に水平の対角線があります。ここで、対角線が交差しない限り、できるだけ多くの対角線を選択します。これは、交差グラフで 最大独立セット を見つけることに対応します。

一般的なグラフで最大の独立セットを見つけることはNP困難な問題ですが、2部グラフの特別なケースでは、 ケーニッヒの定理 は最大マッチングを見つける問題と同等であり、たとえば Hopcroft–Karpアルゴリズム によって多項式時間で解かれます。与えられたグラフはいくつかの最大の一致を持つことができますが、それらはすべて同じサイズであるため、それらのどれでも可能です。この例では、すべての最大一致には、{(2、4)、(6、3)、(7、8)}のように、3組の頂点があります。

(このグラフの他の最大一致には、{(1、3)、(2、5)、(7、8)}; {(2、4)、(3、6)、(5、7)}および{ (1、3)、(2、4)、(7、8)})

最大一致から対応する 最小頂点カバー を取得するには、 ケーニッヒの定理の証明 を適用します。上記のマッチングでは、左側のセットは[〜#〜] l [〜#〜]= {1、2、6、7}で、右側のセットは[〜#〜] r [〜#〜]= {3、4、5、8}、および[〜#〜内の一致しない頂点のセット] l [〜#〜][〜#〜] u [〜#〜]= {1}です。 [〜#〜] u [〜#〜]で始まる代替パスは1つだけ、つまり1–3–6であるため、代替パスの頂点のセットは[〜#〜] z [〜#〜]= {1、3、6}したがって、最小頂点カバーは[〜#〜] k [ 〜#〜]=([〜#〜] l [〜#〜]\[〜#〜] z [〜 #〜])∪([〜#〜] r [〜#〜][〜#〜] z [〜 #〜])= {2、3、7}、以下の赤で示され、最大の独立セットは緑で示されます。

これを解剖の問題に戻すと、これは解剖で5つの軸平行な対角線を使用できることを意味します。

最後に、残りの各凹状頂点から切り取り、解剖を完了します。

118
Gareth Rees

この問題の解決策について議論しているいくつかの学術論文があります。

最小長方形カバリングの線形時間近似アルゴリズム (これはポリゴンをカバリングするためのものであり、ここで示したものよりも一般的なケースです)。

凸型レクチン線形ポリゴンの最適な四角形のカバー (これは、特定の問題に沿ったものです)

here を試して、この主題に関する他の論文の参考文献を調べることもできます。

8
Jason Moore