キャプテンケイジャンのフェリーにZoombinisを配置するためのアルゴリズム?


12

私は最近、ZoombinisのLogical Journeyの再リリースをプレイしており、さまざまなパズルを解決できるコンピューターアルゴリズムを実装しようとしています。キャプテンケイジャンのフェリーボートパズルにアプローチする方法に固執しています。

なじみのない人にとっては、Zoombiniは髪、目、鼻、足の4つの属性を持つクリーチャーです。これらの属性にはそれぞれ5つの可能な値があります。たとえば、Zoombiniの足は、車輪、ローラースケート、スニーカー、バネ、またはプロペラです。乱雑な髪、メガネ、緑の鼻、スニーカーを備えたZoombiniの例を次に示します。

フェリーボートパズルのタスクは、フェリーボートの16席に16個のZoombinisのコレクションを配置することです。配置は、直交する隣接する2つの座席は、少なくとも1つの機能を共有するZoombinisが占有する必要があるという規則に従う必要があります。2 Zoombinisが異なるの髪、異なる目、鼻異なる、持っている場合と、互いに異なる足を、彼らは隣同士に座ってないかもしれません。

座席の配置はレベルによって異なります。具体的には、「非常に難しい」レベルに注目しましょう。このレベルでは、16席が4行4列のグリッドに配置されます。15個のZoombinisが合法的に着席しているが、右のZoombiniと機能を共有しないため、ドックに立つ最後のZoombiniを最後の空いている座席に配置することはできません。

ほぼ完成したパズルの例

16個あります!およそ21兆のZoombinisの座席への割り当てが可能です。したがって、すべての可能な割り当てを実行して、それが合法かどうかを確認するだけでは実用的ではありません。この問題に賢明にアプローチするために使用する可能性のあるヒューリスティックは何ですか?


2
それは私に数独を思い出させ、数独ソルバーは通常何らかのバックトラックを実装します。
マットカプ

2
準備ができており、さらに複雑な文献を掘り下げたい場合は、を検索して有用な情報を見つけることができますSubgraph Isomorphism Problem。問題は、あるグラフを別のグラフで見つけることです。あなたの場合、サブグラフは座席(エッジは隣接関係)であり、親グラフはzoombinisであり、接続は共有特性の存在です。一般に、問題はNP完全であり、通常はバックトラッキングによっても行われますが、いくつかの特別な場合(グラフが非常にうまくいく可能性があります)、多項式または線形解でさえ可能です。
オーダス

これは素晴らしいアイデアです、私は子供の頃のzoombinisが大好きでした-私はちょうど同じことをするかもしれません!
AlexFoxGill

回答:


8

「バックトラッキングアルゴリズム」という便利なGoogle検索用語を提供してくれた@mattecapuに感謝します。それは私に必要な思考の糧をくれました。

私の現在の直感では、最後に4人の隣人がいる中央席を最初に埋め、隣人が2人しかないコーナー席を保存する方が良いかもしれません。そこで、16の空席を次の順序でリンクリストに配置します。

13   5   6  14

 7   1   2   9

 8   3   4  10

15  11  12  16

ここに、私が書いた関数を説明するいくつかの擬似コードがあります。16個のZoombinisとリンクリストの最初の座席へのポインターを含むリストをフィードします。

function recursively_assign_seat(zoombini_list, seat):

    if zoombini_list is empty:
        return True

    else:
        for each z in zoombini_list:

            for each n in seat.neighbors:
                if not allowed_as_neighbors(z, n):
                    next z

            seat.occupant ← z
            if recursively_assign_seat(zoombini_list.remove(z), seat.next):
                return True
            else:
                seat.occupant ← None

        return False

実際、驚くほど速く動作します!私はそれにとても満足していました。

座席のリストを可能な限り最高の順序で並べたとはまだ完全に確信していません。この問題には合計24の制約があり、シート充填の理想的な順序は、シート充填プロセスのできるだけ早い段階でこれらの制約のそれぞれに直面します。


1
あなたが満たすとき、あなた8だけに隣接している2が、あなたは9両方7とに隣接している満たすことができます3。それを解決する素晴らしい仕事!
AlexFoxGill

その編集を行いました。ただし、インサイドアウトスキームが行ごとに入力するだけで勝つかどうかはまだわかりません。たぶん私はいくつかのタイミングテストを行います。
thecommexokid
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.