⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 astar.pl

📁 用prolog实现的一个A星算法
💻 PL
字号:
% A-Star Best-First Search. A simplified version of Bratko Fig. 12.3.
% Store paths and costs in a list of pairs [Path, Cost], ordered according to f(n)
% where f(n) = g(n) + h(n) with g(n) the path cost and h(n) the heuristic cost from n to a goal
% Nodes in a path are listed in reverse order, i.e. list [t,g,f,e,s] represents path s->e->f->g->t
% To search from the a node Start for a solution path SolPath, call ?- solve(Start, SolPath)

solve(Start, SolPath) :-
	astar([[[Start], 0]], SolPath).

astar([BestPath|Paths], Path) :-
	BestPath = [Path, Cost],
	Path = [LastNode|_],
	goal(LastNode).

astar([BestPath|Paths], SolPath) :-
	BestPath = [Path, Cost],
	Path = [LastNode|_],
	extend(Path, Cost, Paths, NewPaths),
	astar(NewPaths, SolPath).

% extend best path by successors of last node

extend(Path, Cost, Paths, NewPaths) :-
	Path = [LastNode|_],
	findall(S, s(LastNode, S, _), Succs),
	not(Succs = []),
	extend_path(Succs, Path, Cost, Paths, NewPaths).

% extend path by each node in Succs and insert into Paths in order of costs

extend_path([], _, _, Paths, Paths).		% no more paths

extend_path([S|Succs], Path, Cost, Paths, Paths2) :-
	Path = [LastNode|_],
	s(LastNode, S, C),
	NewCost is Cost + C,			% g(S) = NewCost
	h(S, H),				% h(S) = estimate S->goal
	NewEst is NewCost + H,			% f(S) = estimate of node's value
	insert([S|Path], NewCost, NewEst, Paths, Paths1),
	extend_path(Succs, Path, Cost, Paths1, Paths2).

% insert path in order in the list of paths

insert(Path, Cost, Estimate, [], [[Path, Cost]]).

insert(Path, Cost, Estimate, Paths, [[Path, Cost]|Paths]) :-
	Paths = [Path1|_],
	Path1 = [[Last1|_], Cost1],
	h(Last1, H),
	Estimate1 is Cost1 + H,
	Estimate1 > Estimate.			% new path is better

insert(Path, Cost, Estimate, [Path1|Paths], [Path1|Paths1]) :-
	insert(Path, Cost, Estimate, Paths, Paths1).

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -