Prolog广度优先搜索(BFS)

时间:2014-12-01 08:08:25

标签: prolog breadth-first-search

我是Prolog的新手,我需要一些帮助。有这个问题:

  

输入是给定的某个状态空间,它是边缘标记的树。   在Prolog中编写一个程序,通过BFS方法实现搜索   用a找到状态空间的目标节点(g)   最低价格。

E.g。 :边缘标记的树 - > (a,g,[a-b / 1,a-c / 3,b-d / 4,b-e / 7,c-f / 6,c-g / 9])

e.g. tree

请求帮助,需要它。

编辑: 这就是我所做的,但它仅适用于未边缘标记的树。我不知道如何添加边缘标记。

oh(a,*).
oh(c,a).
oh(b,a).
oh(d,b).
oh(b,e).
oh(c,f).
oh(c,g).
oh(f,h).

bFS(Start, Finish, Path) :-
assertz(gen(Start, *)),
retract(gen(From, To)),
assertz(exp(From, To)),
oh(From, New),
not(gen(New, _)),
not(exp(New, _)),
assertz(gen(New, From)), New = Finish, find(From, [Finish], Path).

find(*, Path, Path).
find(Add, List, Path) :-
oh(Pridavany, Previous),
find(Previous,[Add|List],Path).

 %find(b,[e],Path).

1 个答案:

答案 0 :(得分:1)

These are some good tips on Prolog search

在看到答案之前,请尝试阅读这些内容。

广度优先算法已发布在cs.unm.edu上,可与SWI Prolog一起使用。

state_record(State, Parent, [State, Parent]).

go(Start, Goal) :- 
    empty_queue(Empty_open),
    state_record(Start, nil, State),
    add_to_queue(State, Empty_open, Open),
    empty_set(Closed),
    path(Open, Closed, Goal).

path(Open,_,_) :- empty_queue(Open),
                  write('graph searched, no solution found').

path(Open, Closed, Goal) :- 
    remove_from_queue(Next_record, Open, _),
    state_record(State, _, Next_record),
    State = Goal,
    write('Solution path is: '), nl,
    printsolution(Next_record, Closed).

path(Open, Closed, Goal) :- 
    remove_from_queue(Next_record, Open, Rest_of_open),
    (bagof(Child, moves(Next_record, Open, Closed, Child), Children);Children = []),
    add_list_to_queue(Children, Rest_of_open, New_open), 
    add_to_set(Next_record, Closed, New_closed),
    path(New_open, New_closed, Goal),!.

moves(State_record, Open, Closed, Child_record) :-
    state_record(State, _, State_record),
    mov(State, Next),
    % not (unsafe(Next)),
    state_record(Next, _, Test),
    not(member_queue(Test, Open)),
    not(member_set(Test, Closed)),
    state_record(Next, State, Child_record).

printsolution(State_record, _):- 
    state_record(State,nil, State_record),
    write(State), nl.
printsolution(State_record, Closed) :-
    state_record(State, Parent, State_record),
    state_record(Parent, _, Parent_record),
    member(Parent_record, Closed),
    printsolution(Parent_record, Closed),
    write(State), nl.

add_list_to_queue([], Queue, Queue).
add_list_to_queue([H|T], Queue, New_queue) :-
    add_to_queue(H, Queue, Temp_queue),
    add_list_to_queue(T, Temp_queue, New_queue).

为了教育目的,代码可以免费使用。

  

我们免费提供这些产品仅供教育使用。

我们无法确定您想要达到的目标,但这是算法。