深度优先搜索的7升和5升水罐到4升水罐拼图

时间:2019-08-27 08:08:01

标签: prolog water-jug-problem

我想使用任何一种深度优先搜索来解决SWI-Prolog中的7升和5升至4升拼图

我不知道如何开始。

我想在罐子里最后得到4升

solve(JUG1, JUG2) :- fill(JUG1, JUG2), swap(JUG1, JUG2).
fill(JUG1,JUG2) :- JUG1 = 7, JUG2 = 5.
%i dont know about that
swap(JUG1, JUG2) :- JUG1 = JUG2. 

1 个答案:

答案 0 :(得分:1)

我要解决的问题完全相同,因此我在PC上找到了我的代码:

我们正在使用迭代加深深度优先搜索来结合呼吸和深度搜索的优势。通过以下代码,我们正在尝试可能的组合以达到我们的目标,即在一罐中最终达到4升。如果找到解决方案,我们将进行相应打印。

% Iterative deepening depth-first search
dlDfs(Node, Path, DepthLimit, ReturnPath) :-
    goal(Node), reverse(Path, ReturnPath);
    DepthLimit > 0,
    adj(Node,NewNeighbor), not(member(NewNeighbor,Path)),
    L is DepthLimit-1,
    dlDfs(NewNeighbor, [NewNeighbor|Path], L, ReturnPath).

idDfsLoop(Start, D, ReturnPath) :-
    dlDfs(Start, [Start], D, ReturnPath)
    ;
    L is D+1,
    idDfsLoop(Start, L, ReturnPath).

idDfs(Start, ReturnPath) :- idDfsLoop(Start, 1, ReturnPath).

% [L,R] L is 7 liter, R is 5 liter
goal([_,4]).
goal([4,_]).

adj(X,Y) :- adj0(X,Y).

%fill up
adj0([X,Y],[7,Y]).
adj0([X,Y],[X,5]).

%Swap over to another canister
adj0([X,Y],[Z,U]) :- X+Y =< 5, Z is 0, U is X+Y ; X+Y > 5, Z is (X+Y) mod 5, U is 5.
adj0([X,Y],[Z,U]) :- X+Y =< 7, Z is X+Y, U is 0 ; X+Y > 7, Z is 7, U is (X+Y) mod 7.

%empty the cansiter
adj0([X,Y],[0,Y]).
adj0([X,Y],[X,0]).

solution(Start, Return) :- idDfs(Start, Return).

您可以按以下方式调用解决方案谓词:

solution([0,0], R) 

其中一种解决方案应该是

R = [[0, 0], [7, 0], [2, 5], [2, 0], [0, 2], [7, 2], [4, 5]]

如果您有任何问题,请随时回答。