дер-текущее поддерево поиска.
предел- предельное значение f-оценки, при котором допускается решение.
Дер1- дерево дер, расширенное в пределах ограничения предел; f-оценка дер1 >,чем предел(если только при расширении не была обнаружена целевая вершина).
Решение-решающий путь, ведущий из стартовой вершины через дер1 к целевой вершине и имеющий стоимость, не превосходящую ограничение предел(если такая вершина была обнаружена).
Если ЕстьРеш= «да» , Решение=решающий путь ,найденный при расширении дерева дер с учетом ограничения предел, дер1 =не конкретизировано . Если ЕстьРеш= «нет», дер1=дер, расширенное до тех пор, пока f-оценка не превзойдет предел, Решение =не конкретизировано. Если ЕстьРеш= «никогда»,дер1 и Решение = не конкретизировано.
After(B,B1,C)-отношение истинно, когда в пространстве состояний существует дуга стоимостью С между вершинами В и В1.
B1-преемник вершины B;
C- стоимость дуги, ведущей из B в B1.
Aim(B)- отношение истинно, если В- целевая вершина
r(K1,K2,P)-
Р- это «манхеттеновское расстояние » между клетками К1 и К2, равное сумме 2-х расстояний между К1 и К2: расстояние по горизонтали и по вертикали.
Sumr(F1,F2,P)-суммарное расстояние 8 фишек, находящихся в позиции В, от их положений в целевой позиции.
Ord(F1,F2,I)-степень упорядоченности фишек в текущей позиции по отношению к тому порядку, в котором они должны находиться в целевой позиции.I- вычисляется как сумма очков, приписываемых фишкам: фишка в центральной позиции- 1 очко; фишка не в центральной позиции, и непосредственно за ней следует (по часовой стрелке) та фишка, какая и должна следовать за ней в целевой позиции F2-0 очков; то же самое ,но за фишкой следует «не та » фишка- 2 очка.
h(B,H)-
H-эвристическаяоценкастоимости оптимального пути из вершины B в целевую вершину.
H=P+3*I
Max_f(Fmax)-
Fmax -некоторое значение, задаваемое пользователем , про которое известно, что оно > любой возможной f-оценки.
Граф переходов:
Решение:
1
1 3 4
8 0 2
7 6 5
2
1 3 4
8 2 0
7 6 5
3
1 3 0
8 2 4
7 6 5
4
1 0 3
8 2 4
7 6 5
5
1 2 3
8 0 4
7 6 5
Текст программы:
domains
xy = xy(i,i)
sost = xy*
i = integer
way = sost*
num = num(i,i)
pair = rang(sost,i)
allp = pair*
ver = ver(sost,num)
list = tree*
tree =der(sost,num,list );
ver(sost,num)
solve = symbol
sh = sh(symbol,xy)
sl = sh*
il = i*
file = fi1;fi2
predicates
h(sost,i);
poisk(sost,way);
maxf(i);
broad(way,tree,i,tree,solve,way);
continue(way,tree,i,tree,solve,solve,way);
ins(tree,list,list);
f(tree,i);
opt_f(list,i);
min(i,i,i);
make_next(i,allp,list);
Help(solve,list,list).
member(sost,way);
aim(sost);
after(sost,sost,i);
check(allp);
bagof(way,sost,allp);
bagof_(way,sost,allp,allp);
need(pair,way,sost);
member_p(pair,allp);
member_s(sh,sl);
member_i(i,il);
show(way,i);
showp(sost);
change(xy,xy,sost,sost);
r(xy,xy,i);
r1(i,i,i);
sumr(sost,sost,i);
ord(sost,i);
ord(sost,i,i);
get_score(sost,i,i);
get_i(xy,sost,i,i);
get_xy(i,sost,xy);
next(xy,xy);
test(xy,xy,i).
checker(i,i,i,i).
clauses
poisk(Start,Resh):-
maxf(Fmax),broad([],ver(Start,num(0,0)),Fmax,_,"yes",Resh).
%Fmax > любой f-оценки
need(rang(B1,C),P,B):-after(B,B1,C),not (member(B1,P)).
bagof(P,B,L):-bagof_(P,B,[],L).
bagof_(P,B,A1,A2):-
need(Q,P,B), not (member_p(Q,A1)),!,bagof_(P,B,[Q|A1],A2).
bagof_(P,B,A1,A1).
check([]).
broad(P,ver(B,_),_, _,"yes",[B|P]):-
aim(B).
broad(P,ver(B,num(F,G)),Lim,Tr1,IsResh,Resh):-
F<=Lim,
bagof(P,B,Flwrs),
not (check(Flwrs)),!,
nl,write("Parent: "),showp(B),write("Children: "),
make_next(G,Flwrs,TT),opt_f(TT,F1),
broad(P,der(B,num(F1,G),TT),Lim,Tr1,IsResh,Resh).
broad(P,ver(B,num(F,G)),Lim,Tr1,IsResh,Resh):-
F<=Lim,
IsResh="never".% нет преемников - тупик
broad(P,der(B,num(F,G),[T|TT]),Lim,Tr1,IsResh,Resh):-
F<=Lim,
opt_f(TT,OF),min(Lim,OF,Lim1),
broad([B|P],T,Lim1,T1,IsResh1,Resh),
continue(P,der(B,num(F,G),[T1|TT]),Lim,Tr1,IsResh1,IsResh,Resh).
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.