17

x フィールドを持つグリッドがあります。このグリッドは、できるだけ多くの 2x2 の正方形 (「農場」と呼びましょう) で埋める必要があります (したがって、各農場のサイズは 4 フィールドです)。各農場は、「道路」を介して特定のフィールド(「ルート」)に接続する必要があります。

私は、農場と道路のあらゆる組み合わせを試す一種のブルート フォース アルゴリズムを作成しました。ファームがグリッドに配置されるたびに、アルゴリズムは、ファームが A* アルゴリズムを使用してルートに接続されているかどうかをチェックします。小さなグリッドでは非常にうまく機能しますが、大きなグリッドでは時間がかかりすぎます。

これは、すでに解決済みの小さなグリッドです

http://www.tmk-stgeorgen.at/algo/small.png

青い四角は農場、赤い四角は空きスペースまたは「道路」、塗りつぶされた赤い四角はルート フィールドで、すべての農場が接続を必要とします。

このグリッドを解決する必要があります:

http://www.tmk-stgeorgen.at/algo/grid.png

使用できる高速な標準アルゴリズムはありますか?

4

3 に答える 3

1

以下は検索よりも優れていると思いますが、検索に基づいているため、最初にそれについて説明します。

探す

基本的な検索をさまざまな方法で効率的にすることができます。

まず、可能な配置を効率的に列挙する必要があります。ファームを配置できる最初の位置に相対的なシフト数を格納することで、これを行うと思います。下から (ルートの近く)。したがって、(0) は一番下の行の左側にある単一の農場になります。(1) ファームが 1 つ右にシフトしたことになります。(0,0) は 2 つのファームになります。最初は (0) として、2 番目は最初の位置で上方向にスキャンできます (2 行目、最初のファームに接触)。(0,1) は 2 番目のファームを 1 つ右にします。等

次に、可能な限り効率的に剪定する必要があります。そこでは、スマートだがコストのかかることと、ばかげているが高速なこととの間のトレードオフがあります。愚かだが速いのは、すべてのファームに到達できるかどうかをチェックする、ルートからのフラッド フィルです。1 つのファームを追加するときに、増分方式でそれを行う方法を考える方が賢明です。たとえば、ファームがカバーする最小値よりも小さいセルを以前のフラッド フィルに依存できることがわかっています。さらに賢明なのは、重要な道路 (別の農場への一意のアクセス) を特定し、何らかの方法でそれらを「保護」することです。

第三に、より高いレベルでできる追加の微調整があるかもしれません。たとえば、対称グリッドを解決し (対称性を使用して、同じパターンをさまざまな方法で繰り返さないようにする)、どのソリューションが実際のグリッドと一致しているかを確認する方がよい場合があります。役立つかもしれないが、どのように機能するかはわかりませんが、農場ではなく道路に集中するという別のアプローチがあります。

キャッシング

秘伝のタレはこちら。私が説明した検索は、左から右へのスキャンで、下からスペースにファームを「埋めます」。

ここで、ほぼ最適な分布でスペースがいっぱいになるまで検索を実行したと想像してください。その解決策を改善するには、ほとんど最初に戻って、「底近く」のいくつかのファームを再配置する必要があるかもしれません。上のスペースを再入力するために検索を続行する必要があるため、これはコストがかかります。

ただし、農場の周囲の「境界」が以前の配置と同じである場合は、検索全体を繰り返す必要はありません。最適な方法でその境界の上をすでに「埋めて」いるからです。そのため、「特定の境界の最良の結果」によってキャッシュし、それらのソリューションを簡単に検索できます。

境界の説明には、境界の形状とルートへのアクセスを提供する道路の位置を含める必要があります。それだけです。

于 2013-06-25T23:57:25.560 に答える
0

このソリューションが数ファームを最大化するかどうかはわかりませんが、それらを通常の方法で配置することを試みることができます: 水平または垂直に配置します。2 つの列 (または行) をくっつけて、ファームの最適な密度にすることができます。上下 (または左右) に 1 つのスペースを空けるように注意する必要があります。

これ以上列 (行) を配置できない場合は、グリッドの境界近くにいくつかの農場を配置できるかどうかを確認してください。

それがあなたを助けることができればいいのに!

于 2013-06-25T13:01:31.787 に答える