序言:解决钉跳问题(启发式/ A *)

时间:2018-10-11 03:58:36

标签: prolog a-star

我正在尝试解决以下问题:

拼图由三个黑色的钉子,三个白色的钉子和中间的空白区域(“ BBBOWWW”)组成。

这个难题有两个相关成本的动作: (a)钉子可能会移动到相邻的空位置(成本为1)。 (b)一个钉子可以跳过另一个或两个其他钉子到空位置。代价等于跳过的钉子数。

目标是使所有白色钉位于所有黑色钉的左侧。毛坯的位置并不重要。

我被允许使用我选择的任何编程语言,并希望通过Prolog解决该问题以获得经验。我已经能够实现该问题的简化版本,找到了最短的路径,但是却在A *和启发式实现方面苦苦挣扎。

我已附上以下Prolog代码和我正在使用的查询。

我的问题是如何在代码中实现A *算法?我无法找到有用的示例,不胜感激任何指导/提示。

谢谢。

查询:

length(Path, _),
initial_state(Initial),
phrase(moves(Initial), Path),
maplist(writeln, Path).

程序:

% Initial state
initial_state([b,b,b,o,w,w,w]).

% 7 possible goal states
goalState([w,w,w,o,b,b,b]).
goalState([w,w,w,b,o,b,b]).
goalState([w,w,w,b,b,b,o]).
goalState([w,w,o,w,b,b,b]).
goalState([w,o,w,w,b,b,b]).
goalState([o,w,w,w,b,b,b]).

% All possible moves
move([E|Es]) --> [E], move(Es).
move([b,o|Solution]) --> [o,b], list(Solution). 
move([o,w|Solution]) --> [w,o], list(Solution).
move([o,X,w|Solution]) --> [w,X,o], list(Solution).
move([b,X,o|Solution]) --> [o,X,b], list(Solution).
move([o,X,X,w|Solution]) --> [w,X,X,o], list(Solution).
move([b,X,X,o|Solution]) --> [o,X,X,b], list(Solution).
move([w,X,X,o|Solution]) --> [o,X,X,w], list(Solution).
move([o,X,X,b|Solution]) --> [b,X,X,o], list(Solution).

list([]) --> [].
list([L|Solution]) --> [L], list(Solution).

moves(S)  --> [S], {goalState(S)}.
moves(S0) --> [S0], {phrase(move(S0),S)}, moves(S).

我的初始解决方案基于以下几点: Prolog program that solves the peg jump puzzle

0 个答案:

没有答案