2012-12-09 40 views
3

好的,所以我有一個叫做CuFrog的難題,它包括在每個位置用一個數字填充一個3x3x3的立方體,但是在從一個位置跳到另一個位置時跳過一個位置。例如,考慮一個扁平立方體,第一面(1,1)右邊的有效位置是(3,1)在第一面。使用CLPFD解決CuFrog

所以我在Prolog中使用約束來做到這一點,我已經給出了每個變量的域(1到54),我已經說過它們必須是不同的,並且對於每個位置,設置的右下角中的一個位置必須是當前的這個位置的值+1。

另外,我已經給出了一個謎題的入口點,這意味着我已經在第一個位置上放置了數字1。

事情是,當我給變量添加標籤時,SICStus沒有找到答案。 :(看來我必須某處缺少限制或者也許我做錯了什麼。誰能幫助?

感謝。

+1

使用'asserta(clpfd:full_answer))'。然後輸入沒有標籤的查詢!你絕對沒有錯過一個限制,而是相反:你限制太多! – false

+0

對不起,但我應該如何在我的代碼中使用它? 是否這樣? (Vars,54), domain(Vars,1,54), restriction_predicate(), asserta(clpfd:full_answer)。 %標籤([min],Vars) - 這就是我在做的。' – Sidner

+0

在頂層輸入它。 – false

回答

2

所以你說的CLP(FD)沒有找到解決的辦法。做您 的意思是「無」終止或你的意思是它不 終止?

問題看起來像一個Hamiltonian path問題,它 可能是搜索需要指數時間,根本 不會終止在實際時間內。

在這種特殊情況下,像對稱性 這樣的限制違反啓發式規則,實際上可以縮短搜索時間!例如,從您的起點開始,您可以在2個方向上修復搜索 ,其他方向可以稍後派生。

所以如果答案是「否」,這意味着太多的限制。 如果答案是它沒有終止,這意味着沒有足夠的限制或不可能實際解決。

儘管所有的蠻力都用於搜索路徑,但是後來可能會發現解決方案是系統化的。或者你可能會自己得到這個想法。

再見