web-dev-qa-db-ja.com

FlowFreeゲームを解くためのアルゴリズム

最近プレイを始めました Flow Free Game

一致する色をパイプで接続してフローを作成します。すべての色をペアにし、ボード全体をカバーしてFlowFreeで各パズルを解きます。ただし、パイプが交差したり重なったりすると、パイプが破損することに注意してください。

2つのパスが重ならない条件で、指定されたポイントのペア間のパス検索ゲームであることに気付きました。ゲームの解決策を書くことに興味がありましたが、どこから始めればよいのかわかりません。バックトラックを使用することを考えましたが、ボードサイズが非常に大きい場合、時間計算量が高くなります。

ゲームを効率的に解決するための適切なアルゴリズムはありますか?ヒューリスティックを使用して問題を解決できますか?どこから始めればいいのか、ヒントを教えてください。そこから取り上げます。

私は通常ほとんどのボードで観察しました

  1. 最も遠いポイントについては、エッジに沿ったパスをたどる必要があります。
  2. 互いに最も近いポイントについては、直接パスがある場合はそれに従ってください。

これは正しい観察であり、それを効率的に解決するために使用できますか?

20
coder hacker

SATへの削減

基本的な考え方

  1. 問題を [〜#〜] sat [〜#〜] に減らします
  2. 最新のSATソルバーを使用して問題を解決する
  3. 利益

複雑

問題は明らかにNPにあります。ボードの配置を推測すると、問題が解決するかどうかを簡単に(ポリタイムで)確認できます。

それがNP困難(SATなどのNPの他のすべての問題と同じくらい難しいことを意味する)であるかどうかは明らかではありません。確かに、最新のSATソルバーは、大きなインスタンスを気にせず、そよ風で解決します(100x100までだと思います)。

ナンバーリンクに関する文献

ここでは、NuclearmanのコメントをOPにコピーします。

「ナンバーリンクのSAT定式化」と「ナンバーリンクのNP完全性」を検索すると、いくつかの参照が見つかります。当然のことながら、最も興味深い2つは日本語です。 first は、NP完全性の実際の紙の証明です。 second は、SATソルバーSugarを使用してNumberLinkを解く方法を説明しています。 –

SATへの削減のヒント

問題をエンコードするいくつかの可能性があります。早く補えるものをあげます。

リマーク

j_random_hackerは、独立したサイクルは許可されていないと述べました。次のエンコーディングはそれらを許可します。この問題により、SATエンコーディングの魅力が少し低下します。自立ループを禁止するために私が考えることができる最も簡単な方法は、O(n ^ 2)の新しい変数を導入します。ここで、nはボード上のタイルの数(各タイルの次のシンクからの距離を数える)です。これにはログエンコーディングを使用します。これにより、ログがO(n*log n)になり、ソルバーにとって問題が難しくなる可能性があります。

変数

タイル、ピースタイプ、色ごとに1つの変数。ある変数の例X-Y-T-C trueは、位置X/YのタイルのタイプがTで、色がCであることをエンコードします。これはソリューションでは発生しないため、空のタイルタイプは必要ありません。

初期変数を設定する

シンク/ソースの変数を設定し、他のタイルをシンク/ソースにすることはできないと言います。

制約

  1. すべての位置について、正確に1つの色/ピースの組み合わせが真です(カーディナリティ制約)。
  2. すべての変数(位置、タイプ、色)について、隣接する4つのタイルに互換性がある必要があります(色が一致する場合)。

私は何かを逃したかもしれません。ただし、簡単に修正できるはずです。

7
ziggystar

この問題のすべてのインスタンスを解決するための多項式時間アルゴリズムは保証されていないのではないかと思います。しかし、要件の1つはすべての正方形をパイプで覆う必要があることなので、人とコンピューターの両方が解決に使用するものと同様のアプローチがここでうまく機能するはずです:数独

  1. 空の正方形ごとに、その正方形の可能な色のセットを形成し、次に各正方形で論理的推論を繰り返し実行して、その正方形の許可された色のセットを縮小します。
  2. 正方形の可能な色のセットがサイズ1に縮小するたびに、その正方形の色が決定されます。
  3. これ以上論理的な推論を実行できず、パズルがまだ完全に解決されていない状態に達した場合(つまり、複数の可能な色を持つ正方形が少なくとも1つある場合)、これらの未決定の正方形の1つを選択し、それぞれを試して繰り返します。順番に可能な色の。それぞれの試みは、解決策または矛盾につながります。後者は、その正方形の可能性としてその色を排除します。

分岐する正方形を選択するときは、通常、許可されている色ができるだけ少ない正方形を選択することをお勧めします。

[編集:パイプの無効な「ループ」を形成する可能性を回避することが重要です。これを行う1つの方法は、各正方形xの許可された色iごとに、2ビットの情報を維持することです:正方形xかどうかは、明確なi-colouredタイルのパスによって最初のi-colouredエンドポイントに接続され、2番目のi-colouredエンドポイントについても同じです。その後、再帰するときは、同じビットを持つ2つの隣接する正方形を選択しないでください。許可された色に設定(またはどちらのビットも設定しない)。]

実際には論理的な控除を使用する必要はまったくありませんが、使用する控除が多ければ多いほど、プログラムの実行速度が速くなり、再帰の量が(おそらく劇的に)減少します。いくつかの有用な控除は次のとおりです。

  1. 正方形が特定の色のパスを拡張する唯一の可能な方法である場合、その色を割り当てる必要があります。
  2. 正方形の許可された色のセットに色iが含まれているが、許可された色のセットに色iが含まれている隣接する正方形が少なくとも2つない場合、色iのパスによって「到達」することはできません。 、および色iは可能性として排除することができます。

パス接続に基づくより高度な控除は、さらに役立つ可能性があります-例:コネクタのペアを接続するすべてのパスが特定の正方形を通過する必要があると判断できる場合は、すぐにその色を正方形に割り当てることができます。

この単純なアプローチは、5x5の例では再帰のない完全なソリューションを推測します。(5、2)、(5、3)、(4、3)、および(4、4)の正方形は強制的にオレンジ色になります。 (4、5)は強制的に緑色になります。 (5、5)は、他の色がこの正方形に到達してから再び戻ることができないという事実のために、緑色に強制されます。これで、(4、4)で終わるオレンジ色のパスは、(3、4)でオレンジ色のパスを完了する以外に行く場所がありません。また、(3、1)は強制的に赤になります。 (3、2)は強制的に黄色になり、(2、1)、次に(2、2)が赤になり、最終的に黄色のパスが(3、3)で終了します。 (2、2)の赤いパイプは、(1、2)を青に強制し、赤と青のパスは完全に決定され、「互いに強制し合う」ようになります。

3
j_random_hacker

Needlessly Complex に、SATを使用してこの問題を解決する方法を完全に説明しているブログ投稿を見つけました。

コード もオープンソースなので、実際に見て(そして理解して)ください。

ここでは、SATで実装する必要のあるルールを説明する引用を提供します。

  • すべてのセルに単一の色が割り当てられます。

  • すべてのエンドポイントセルの色は既知であり、指定されています。

  • すべてのエンドポイントセルには、その色に一致する隣接セルが1つだけあります。
  • すべての非エンドポイントセルを通るフローは、6つの方向タイプの1つと正確に一致します。
  • 方向タイプで指定されたセルの隣接セルは、その色と一致する必要があります。
  • 方向タイプで指定されていないセルの隣接セルは、その色と一致してはなりません。

ありがとう @ Matt Zucker これを作成してくれてありがとう!

3
Pro Q

私は人間の思考に似た解決策が好きです。力ずくで数独の答えを(かなり簡単に)得ることができますが、パズルを解くためにたどることができた道を見つける方が便利です。

私はほとんどのボードで通常1を観察しました。最も遠いポイントについては、エッジに沿ったパスをたどる必要があります。 2.互いに最も近いポイントについては、直接パスがある場合はそれに従います。これは正しい観察であり、それを効率的に解決するために使用できますか?

これらは「ほとんどの場合」真実ですが、常にそうであるとは限りません。

最初のルールをこれに置き換えます。両方のシンクがEdgeに沿っている場合は、Edgeに沿ったパスに従う必要があります。 (反例を作成することもできますが、ほとんどの場合に当てはまります)。エッジに沿ってパスを作成した後、エッジに沿ったブロックはエッジの一部と見なされる必要があるため、アルゴリズムは前のパイプによって作成された新しいエッジをたどろうとします。この文が理にかなっていることを願っています...

もちろん、これらの「ほとんどの場合」のルールを使用する前に、絶対ルールに従う必要があります(j_random_hackerの投稿からの2つの推論を参照してください)。

もう一つのことは、解決策につながることができないボードを排除しようとすることです。未完成のパイプ(シンクから始まり、まだ他のシンクに到達していないパイプ)をヘビと呼びましょう。未完成のパイプの最後の正方形は、ヘビの頭と呼ばれます。同じ色の2つのヘッドの間に空白の正方形のパスが見つからない場合は、ボードが解決策につながることができないため、破棄する必要があることを意味します(または、実装によってはバックトラックする必要があります)。

フリーフローゲーム(および他の同様のゲーム)は、同じ色の2つの線が並んでいるボードを有効な解決策として受け入れますが、並んだ線のない解決策は常に存在すると思います。つまり、シンクではない正方形には、同じ色の隣接する正方形が2つだけあり、シンクには1つだけあります。ルールが常に真である場合(私はそれが正しいと信じていますが、それを証明することはできません)、それは可能性の数を減らすための追加の制約になります。 Free Flowのパズルのいくつかを並べて線を使って解きましたが、ほとんどの場合、それらがない別の解決策を見つけました。 FreeFlowのソリューションWebサイトで並んでいる行を見たことがありません。

0
Yves Forget

Big DuckGamesによるIOSバージョン)に基づいて、フローのレベルを解決するための一種のアルゴリズムにつながるいくつかのルール、この会社は正規バージョンを作成しているようです。この回答の残りの部分は、壁、橋、反りはありません。

たとえあなたの不思議なことに良いとしても、巨大な15x18の正方形のボードは、終わりの直前に何度も何度も立ち往生し、実際には最初からやり直さなければならないように見える方法でそれを行う方法の良い例です。これはおそらく、一般的なケースですでに述べた指数関数的な時間計算量と関係があります。しかし、これは、単純な戦略がほとんどのボードで圧倒的に効果的ではないという意味ではありません。

  1. ブロックが空のままになることはありません。したがって、孤立したブロックは、何か間違ったことをしたことを意味します。

  2. 同じ色の基本的に隣接するセルを接続する必要があります。これにより、同じ色の2x2ブロックと、隣接する3つのセルの六角形グリッド三角形が除外されます。

  3. 多くの場合、色が特定の正方形に移動するか、特定の正方形から除外されるかを確認することで、目覚ましい進歩を遂げることができます。

  4. ポイント1と2により、六角形のボード上の六角形のグリッドでは、通常、エッジに沿って進むパイプが出口までずっと行き詰まっており、外側のエッジを効果的に移動してボードを小さくします。このプロセスを繰り返すことができます。どの種類の隣接条件が保証し、どの種類が両方の種類のグリッドでこのサイクルを中断できるかは予測可能です。

私が見つけたサードパーティの亜種のほとんどは1から4に欠けていますが、これらの制約を考えると、有効なボードを生成するのは難しい作業かもしれません。


回答:

ポイント3は、色、または各色に1つある誤った/不確定な値のセットのいずれかになり得る値が各セルに格納されることを示しています。

ソルバーは、パイプの端の周りのパスの小さな近傍にポイント3に保存されたデータとともに、ポイント1と2を繰り返し使用して、色を徐々に設定したり、不確定な値をfalseに設定したりできます。

0
alan2here