私は、アインシュタインのパズルに似たロジックゲームの開発について考えてきました。これには、新しいゲームのリプレイごとに異なる手がかりが含まれます。
提供する手がかりが一意のソリューションを指すことを保証するために、さまざまなエンティティ(ペット、家の色、国籍など)、控除規則などを処理するためにどのデータ構造を使用しますか?
控除ルールを考えられる手掛かりと一緒にプレイする方法を考えるのに苦労しています。どんな洞察もいただければ幸いです。
私は、アインシュタインのパズルに似たロジックゲームの開発について考えてきました。これには、新しいゲームのリプレイごとに異なる手がかりが含まれます。
提供する手がかりが一意のソリューションを指すことを保証するために、さまざまなエンティティ(ペット、家の色、国籍など)、控除規則などを処理するためにどのデータ構造を使用しますか?
控除ルールを考えられる手掛かりと一緒にプレイする方法を考えるのに苦労しています。どんな洞察もいただければ幸いです。
回答:
ワオ。これは、リチャードバートルがArtificial Intelligence and Computer Gamesを書いたときにゲームの未来にとって重要であると考えられていたような昔ながらのAIセマンティックWeb が役立つ状況であるように見えます。基本的に、いくつかのデータリスト(データベーステーブルなど)があり、最初のリストでは、次のように、物事が相互にどのように関係するかについてのルールを指定します。
a PERSON must LIVE IN a DOMICILE
a PERSON must OWN an ANIMAL
a PERSON must DRINK a BEVERAGE
a PERSON must SMOKE a CIGARETTE BRAND
a PERSON must BE OF a NATIONALITY
a DOMICILE must BE IN a POSITION
a DOMICILE must BE OF a COLOR
次に、カテゴリのインスタンスがあります。
ANIMAL: dog snail zebra fox horse
BEVERAGE: milk tea OJ coffee water
CIGARETTE BRAND: Kools Parliaments Luckies OldGold Chesterfields
NATIONALITY: Englishman Spaniard Ukrainian Japanese Norwegian
POSITION: first second third fourth fifth
COLOR: red green yellow ivory blue
これらのデータ構造は状況を完全にカプセル化していません-一意性の制約が必要であり、一部のカテゴリにPOSITION
は、「右側」、「左側」、および「次へ」の処理が必要なメタルールが必要です。たとえば、「」の概念ですが、問題の構造はそれらを強く示唆しているようです。
これがあなたを遠くに連れて行くならDunnoですが、それが役に立てば幸いです。
私の推奨は、AIMAプロジェクトで提供されている制約充足問題(CSP)のPythonコードを確認することです。辞書(連想配列/ハッシュテーブル)を使用して、有効な制約を追跡します。また、min-conflictsやAC3など、CSPの解決に使用されるいくつかのアルゴリズムの実装があります。
このコードには、リンクした問題と同様に、サンプルのZebra問題が例として含まれています。
これは実際には非常に深くなります。ウィキペディアがそれについて決して言及しないのは奇妙です。
あなたが探しているのは、おそらくフィッチの証明のようなもので到達できる非常に難しい証明です。そのため、与えられたデータから物事を差し引こうとしています。たくさんのがありフィッチ証明ビルダーあなたのための作業の多くを行います。しかし、いくつかの演習は証明するだけではありません。
ユーザーが計算を行うべきかどうかわかりません。その場合は、3SATなどの多項式時間では元に戻せない問題に注意してください。
使いたいデータ構造は、なんらかのRule
クラスが欲しいと思います。ルールは、タイプに応じて何でもかまいません。述語論理には多くのルールがないので、これを継承することで克服できます(if、iff、and、or、not ...)。これらのルールを評価する必要があるだけです。そして、ルールが実行できる唯一のことは、trueまたはfalseを返すことです。それが述語論理で行うことだからです。大学では、この本をJohn Kellyから読むよう勧められました。
クラスに戻る:数学で通常の計算を実装するのと同じように、これらの問題が表示されます。+
オペレーターとは?これには2つのパラメーターが含まれており、それ自体で新しい方程式にすることも、数だけにすることもできます。ルールも同じだと思います。新しいルールをパラメーターとして、またはブール値(いわゆる述語)だけを使用できます。
これが特に参考文献に役立つことを願っています。詳細を知りたい場合、または私が間違った方向に進んでいる場合は、教えてください。
Rule
クラスはいいアイデアだと思う。これらの制約のモデル化は、やはり私が考える述語論理によって行われます。
私は良い答えはありませんが、同じ種類の問題に関するヒントを探して、githubにこのリポジトリを見つけました:
https://github.com/nateinaction/Zebra-Puzzle
手がかりを選択し、パズルを解けるようにするために必要な手がかりの数を決定するためのいくつかのロジックが含まれています。
もちろん、逆方向に作業することはそれほど難しくはないと思います。それはこのようなリストがあります:
フレッドレッドドッグ
スティーブ・ブルー・キャット
ビルパープルクジラ
エリックシアンイルカ
これは簡単に生成でき、それから一連のルールを構成します。
ストレージについては、それぞれ個別のもののセットではないので、[フレッド、スティーブ、ビル、エリック]と答えのセット[フレッド、レッド、ドッグ]です。次に、「NAMEはACTION OBJECTを(しない)」にします。
あなたがそれに取り掛かったとき、ユニークなソリューションは本当に重要ですか?ゲームがそれらをリストに分割できる限り、「セット1にクジラが含まれていない」ことを確認してください。