使用Warnsdorff规则的Gprolog骑士之旅

时间:2017-04-25 23:03:14

标签: prolog

我正在尝试在Gprolog中实施Warnsdorff规则来生成任意棋盘上的游览。我找到了一篇SO帖子,为B-prolog提供了一个很好的解决方案,我只需要翻译Warnsdorff步骤(knight's tour efficient solution)。

以下是我对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 个答案:

答案 0 :(得分: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).