Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- % Best First Search - A* Eight puzzle
- a_star(Start,Goal):-
- estimate(Start,Goal,0,_,H), % [State,Parent,G,H,F]
- path([[Start,nil,0,H,H]],[],Goal). % path(Open,Closed,Goal)
- path([ ],_,_):-
- write('No solution was found.'),!.
- path(Open,Closed,Goal):-
- dequeue([Goal,Parent|_],Open,_),
- write('Solution was found. The path is:'),nl,
- print_solution([Goal,Parent|_],Closed),
- length(Open,L_open),nl,write('L_open: '),write(L_open),nl,
- length(Closed,L_closed),write('L_closed: '),write(L_closed).
- path(Open,Closed,Goal):-
- dequeue([State,Parent,G,H,F],Open,Rest_open),
- get_children(State,G,F,Rest_open,Closed,Goal,[],Children),
- insert_to_open(Rest_open,Children,New_open),
- append([[State,Parent,G,H,F]],Closed,New_closed),
- path(New_open,New_closed,Goal).
- dequeue(E,[E|T],T).
- get_children(State,G,F,Rest_open,Closed,Goal,Temp,Children):-
- move(State,Next),
- not(member([Next|_],Closed)),
- not(member([Next|_],Temp)),
- estimate(Next,Goal,G,Gnew,H),
- Ftemp is Gnew+H,
- max(F,Ftemp,Fnew),
- get_children(State,G,F,Rest_open,Closed,Goal,
- [[Next,State,Gnew,H,Fnew]|Temp],Children),!.
- get_children(_,_,_,_,_,_,L,L).
- max(A,B,A):-A>=B.
- max(A,B,B):-A<B.
- insert_to_open(Open,[],Open).
- insert_to_open(Open,[H|T],Open_new):-
- insert(Open,H,Temp_open),
- insert_to_open(Temp_open,T,Open_new).
- insert([],H,[H]).
- insert(Open,[Next,P,G,H,F],New_open):-member([Next,_,_,_,_],Open),!,
- insert_change(Open,[Next,P,G,H,F],New_open).
- insert([[S1,P1,G1,H1,F1]|T1],[S2,P2,G2,H2,F2],
- [[S2,P2,G2,H2,F2],[S1,P1,G1,H1,F1]|T1]):-
- F1>=F2.
- insert([[S1,P1,G1,H1,F1]|T1],[S2,P2,G2,H2,F2],[[S1,P1,G1,H1,F1]|T3]):-
- F1<F2,
- insert(T1,[S2,P2,G2,H2,F2],T3).
- %insert_change(Open,Child,Open_new)
- insert_change(Open,[Node,Pnew,Gnew,Hnew,Fnew],Open):-
- remove(Open,[Node,Pnew,Gnew,Hnew,Fnew],[Node,_,_,_,Fold],_),
- %write(Open_temp),nl,write(Fold),nl,write(Fnew),nl,
- Fold=<Fnew.
- insert_change(Open,[Node,Pnew,Gnew,Hnew,Fnew],Open_new):-
- remove(Open,[Node,Pnew,Gnew,Hnew,Fnew],[Node,_,_,_,Fold],Open_temp),
- %write(Open_temp),nl,write(Fold),nl,write(Fnew),nl,
- Fold>Fnew,
- %write('jsem zde'),nl,
- insert(Open_temp,[Node,Pnew,Gnew,Hnew,Fnew],Open_new).
- remove([[Node,Pold,Gold,Hold,Fold]|T],[Node,_,_,_,_],
- [Node,Pold,Gold,Hold,Fold],T).
- remove([H|T],[Node,_,_,_,_],[Node,Pold,Gold,Hold,Fold],[H|Ttemp]):-
- remove(T,[Node,_,_,_,_],[Node,Pold,Gold,Hold,Fold],Ttemp).
- member(H,[H|_]).
- member(H,[_|T]):-member(H,T).
- append([],S,S).
- append([H|T1],T2,[H|T3]):-
- append(T1,T2,T3).
- print_solution([State,nil|_],_):-
- write1(State),nl.
- print_solution([State,Parent|_],Closed):-
- member([Parent,Grandparent|_],Closed),
- print_solution([Parent,Grandparent|_],Closed),
- write1(State),nl.
- estimate(State,Goal,G,Gnew,H):-
- size(N),
- NN is N*N,
- evaluate(State,Goal,OK),H is NN-1-OK,Gnew is G+1.
- evaluate([],[],0).
- % evaluate([o],[o],0).
- % evaluate([A],[B],0):-A\=B.
- % evaluate([H],[H],1):-H\=o.
- evaluate([o|TState],[o|TGoal],OK):-evaluate(TState,TGoal,OK).
- evaluate([A|TState],[B|TGoal],OK):-A\=B,
- evaluate(TState,TGoal,OK).
- evaluate([H|TState],[H|TGoal],OK):-H\=o,
- evaluate(TState,TGoal,TOK),
- OK is TOK+1.
- %write1([A,B,C,D,E,F,G,H,I]):-
- % write(A),write(B),write(C),nl,
- % write(D),write(E),write(F),nl,
- % write(G),write(H),write(I),nl.
- write1([]).
- write1(L):-size(N),write2(L,N).
- write2([H|T],M):-M>0,write(H),MM1 is M-1,write2(T,MM1).
- write2(L,_):-nl,write1(L).
- move(State,Next):- size(N),
- find_pos(State,SP),
- SP>N,
- NP is SP-N,
- change(State,NP,SP,Next).
- move(State,Next):- size(N),
- find_pos(State,SP),
- R is SP mod N,
- R\=0,
- NP is SP+1,
- change(State,NP,SP,Next).
- move(State,Next):- size(N),
- find_pos(State,SP),
- NN is N*(N-1)+1,
- SP<NN,
- NP is SP+N,
- change(State,NP,SP,Next).
- move(State,Next):- size(N),
- find_pos(State,SP),
- R is SP mod N,
- R\=1,
- NP is SP-1,
- change(State,NP,SP,Next).
- find_pos([o|_],1).
- find_pos([H|T],SP):-
- H\=o,
- find_pos(T,SPM1),
- SP is SPM1+1.
- change(State,NP,SP,Next):-
- move_sp(State,NP,Piece,Temp_State),
- move_piece(Temp_State,SP,Piece,Next).
- move_sp([H|T],1,H,[o|T]).
- move_sp([H|T],N,Piece,[H|TN]):-
- N>1,
- NM1 is N-1,
- move_sp(T,NM1,Piece,TN).
- move_piece([_|T],1,H,[H|T]).
- move_piece([H|T],N,Piece,[H|TN]):-
- N>1,
- NM1 is N-1,
- move_piece(T,NM1,Piece,TN).
- %**************************************************************
- aa0:-assert(size(0)),retractall(size(_)),assert(size(4)),
- a_star([1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,o],
- [1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,o]).
- aa1:-assert(size(0)),retractall(size(_)),assert(size(4)),
- a_star([1,2,3,4,5,6,7,8,9,a,b,o,d,e,f,c],
- [1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,o]).
- aa2:-assert(size(0)),retractall(size(_)),assert(size(4)),
- a_star([1,2,3,4,5,6,7,8,9,a,o,b,d,e,f,c],
- [1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,o]).
- aa3:-assert(size(0)),retractall(size(_)),assert(size(4)),
- a_star([1,2,3,4,5,6,o,8,9,a,7,b,d,e,f,c],
- [1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,o]).
- aa4:-assert(size(0)),retractall(size(_)),assert(size(4)),tell('as4_aa4.vysl'),
- a_star([1,2,3,4,5,6,o,8,9,a,7,b,d,e,f,c],
- [1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,o]),told.
- aa5:-assert(size(0)),retractall(size(_)),assert(size(4)),tell('as4_aa5.vysl'),
- a_star([1,2,o,4,5,6,3,8,9,a,7,b,d,e,f,c],
- [1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,o]),told.
- aa6:-assert(size(0)),retractall(size(_)),assert(size(4)),tell('as4_aa6.vysl'),
- a_star([o,1,2,4,5,6,3,8,9,a,7,b,d,e,f,c],
- [1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,o]),told.
- a0:-assert(size(0)),retractall(size(_)),assert(size(3)),
- a_star([1,2,3,8,o,4,7,6,5],[1,2,3,8,o,4,7,6,5]).
- a1:-assert(size(0)),retractall(size(_)),assert(size(3)),
- a_star([1,2,3,8,4,o,7,6,5],[1,2,3,8,o,4,7,6,5]).
- a2:-assert(size(0)),retractall(size(_)),assert(size(3)),
- a_star([1,2,o,8,4,3,7,6,5],[1,2,3,8,o,4,7,6,5]).
- a3:-assert(size(0)),retractall(size(_)),assert(size(3)),
- a_star([8,1,3,o,2,4,7,6,5],[1,2,3,8,o,4,7,6,5]).
- a4:-assert(size(0)),retractall(size(_)),assert(size(3)),tell('as3_a4.vysl'),
- a_star([1,4,2,8,o,3,7,6,5],[1,2,3,8,o,4,7,6,5]),told.
- a5:-assert(size(0)),retractall(size(_)),assert(size(3)),tell('as3_a5.vysl'),
- a_star([1,4,2,o,8,3,7,6,5],[1,2,3,8,o,4,7,6,5]),told.
- a6:-assert(size(0)),retractall(size(_)),assert(size(3)),tell('as3_a6.vysl'),
- a_star([1,4,2,7,8,3,o,6,5],[1,2,3,8,o,4,7,6,5]),told.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement