2017-04-25 79 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