2016-12-18 21 views
3

私はProlog CLP FDを使って制限プログラムを使用して、提案されたパズルを解決しようとしています。このパズルは、次の簡単なルールで構成されていますProlog CLP FDを使用してパス制限を設定する方法は?

Yin Yang puzzle description

は今、私のコードでは、私はすでに2x2のグリッドの一枚は、同じ色の少なくとも1つに接続されなければならないことの制限をカバーしています。

問題は、一方のピースが同じ色の他のすべてのピースにPATH(接続されている)を持っていなければならないという制約を作成する方法を見つけることができないということです。私はこの種の出力を得ています:

0 0 0 0 
0 1 0 1 
0 1 0 1 
0 1 0 0 

0 0 0 0 
0 1 0 1 
0 1 0 1 
0 1 0 1 

ここで、1はすべて互いに接続されていません。

CLP FDでこの種のグラフ制限を作成するにはどうすればよいですか?

編集:私はSICStus Prologを使用しています。

答えて

2

我々はより明確にそれについて考えることができるように自分の状況を言い替えるするには:

  1. すでに
  2. しかし答えは現在あまりにも一般的なある答えを生成することができます。

プログラムは、より具体的にするために、あなたは現在、ある条件を見つけなければならないあなたが生成答えの一つにに違反しますが、すべてのソリューションでを保持し、その後で、この状態を表現しなければなりません の制約。

たとえば、あなたはケースを再度考える:

条件
がここに違反している
 
0 0 0 0 
0 1 0 1 
0 1 0 1 
0 1 0 1 

?明らかに、1の部分はパスに沿っていません。しかし、CLP(FD)のフルパスについては、非常に面倒であり、これは試験や宿題の質問から明らかであるため、単純なの基準が望ましいことを示唆しています。

"ローカル"とは、 ボードの代わりにいくつかのネイバーを考慮する必要があるということです。

したがって、もう一度1個を考えてみましょう。明らかに、1のすべてのピースには、この回答で   1という隣人があります。ほかに何か?すべての1作品は、  隣人ですか?いいえ、現在ではありません。 1は、  の2つの の近隣を持つ必要がありますか?そうでない場合は、いくつの例外が許されますか?

これらの条件に沿って考えると、間違いなく良い解決策が得られます。

1つのヒント:時にはreifiedという制約がこのようなタスクに役立ちます。これは、例えば、B #<==> (X #= Y)と言うことができ、Bは、X #= Y  のいずれかを表すとすると、を表します。この のケースでもこれは必要ないかもしれないことに注意してください。

+0

私はあなたが言ったことを熟考し、どれくらいの**等価**個のピース​​が1つのピースに隣接しているか(上、左、下、右)を知る方法を見つけました。 次に、** ** ** **隣接するピースの数が5を超えてはならないという制限を加えました(これは、4つのセルを持つ2x2のベースケースのためです)。他のボードサイズのソリューションのセットを短くします。現われてはならないものもあります。私はこれが正しい制約の方法ではないかもしれないことを恐れる。私はどれくらい近いですか? – jazzchipc

+1

私はこれをエンコードする方法が多少あるかもしれないと思います。例えば、すべての接続された経路によって満足される、奇数および偶数の同一の隣接セルを有するセルの数の間には関係があり得る。面白いと思われるようにこれにアプローチすると、これらの数値をボードの*サイズ*に関連付ける必要があります。 CLP(FD)で制約を効率的に表現するには多くの洞察が必要です。 Peter Szerediはスライドで同様のタスクについて説明しますが、一見価値があります。 – mat

+0

あなたが参照したスライドを教えてください。私はあなたの助言に従い、オイラーパス定理に従った解を制約することができ、2つの頂点だけが奇数次でなければならないと言っていましたが、やはり解を失っています。 – jazzchipc

0

最後にこの問題を解決しましたか?

私はこの問題に非常に関心があり、コードが存在する場合はそのコードを見たいと思っています。

私はcircuit/1は役に立たず、これを解決するための使い方を見たいと思っています。

関連する問題