2017-04-25 72 views
2

我試圖在Gprolog中實現Warnsdorff的規則來在任意棋盤上生成遊覽。我發現了一個SO帖子,在B-prolog中提供了一個很好的解決方案,我只需要翻譯Warnsdorff步驟(knight's tour efficient solution)。使用Warnsdorff規則的Gprolog騎士之旅

下面是我實現Warnsdorff步驟:從位置

warnsdorffSelect(X, Y, Row, Col, Past, NewX_, NewY_) :- 
    setof((Count, NewX, NewY), (
    possibleMovesFromPosWithBoard(X, Y, Row, Col, Past, NewX, NewY), 
    countMoves(NewX, NewY, Row, Col, [(NewX, NewY) | Past], Count). 
), [(_, NewX_, NewY_)|_]). 

possibleMovesFromPosWithBoard/7返回所有的法律動作和countMoves/6返回的從位置移動

我的問題發生在函數未能選擇導致從新位置移動的最小數目的移動,而是選擇返回結果列表中的第一個移動(也就是說,它沒有出現被分類)。最後,該計劃總是會導致「否」,因爲它將自己背上了一個角落。

在此先感謝!

+1

我們有這個[片刻](http://stackoverflow.com/questions/43600928/translating-a-tabled-predicate-from-b -prolog-to-gprolog?s = 3 | 0.0000)前。 – false

回答

1

全搜索空間是很容易恢復:

warnsdorffSelect(X, Y, Row, Col, Past, NewX_, NewY_) :- 
    setof((Count, NewX, NewY), (
    possibleMovesFromPosWithBoard(X, Y, Row, Col, Past, NewX, NewY), 
    countMoves(NewX, NewY, Row, Col, [(NewX, NewY) | Past], Count). 
), Sorted), 
    % on backtracking, get all steps sorted from lower Count to higher 
    member((_, NewX_, NewY_), Sorted). 
+0

當我運行代碼時出現錯誤,但可以在countMoves結束時刪除該句點時修復此錯誤。除此之外,它完美的作品。謝謝! – pepperguy3