Введение в теорию игр. Жариков И.А - 39 стр.

UptoLike

39
Значением функции MM_EVALP является либо вычисленная оценка
вершины Position (при Depth>0) либо список дочерних для Position
позиций с их числовыми оценками (при Depth=0).
При работе MM_EVALP используются вспомогательные функ-
ции, определение которых зависит от конкретной игры: OPENING,
вычисляющая для заданной позиции игры список дочерних вершин-
позиций, и STAT_EST статическая оценочная функция.
[define MM_EVALP (lambda (Position Depth Deptype)
[prog (D %дочерняя позиция;
(Movelist()) %список ходов-позиций);
Pvalue Dvalue) %оценки текущей и дочерней позиций;
% 1: установка развилки, включающей все дочерние вершины те-
кущей позиции (список () добавлен в развилку, чтобы «поймать» мо-
мент ее закрытия);
[set D [among (<OPENING .Position> ())]]
% 2: если развилка закрыта возврат функцией подсчитанной
оценки;
[cond ([empty .D]
[return [cond ([eq .Depth 0] .Movelist)
(t .Pvalue)]])]
% 3: вычисление оценки очередной дочерней позиции: либо при-
менение статической функции, либо рекурсивный спуск;
[cond ([eq .Depth [- .N 1]]
[set Dvalue [STAT_EST .D]])
(t [set Dvalue [MM_EVALP .D
[+ 1 .Depth]
[not .Deptype]]])]
% 4: пересчет оценки текущей позиции по минимаксному прин-
ципу;
[cond ([hasval Pvalue] [pset Pvalue
[cond(.Deptype [max .Pvalue .Dvalue])
(t [min .Pvalue .Dvalue])]])
(t [pset Pvalue .Dvalue])]
% 5: при необходимости пересчет для исходной позиции списка
ходов (дочерних позиций) с их оценками;
[cond([eq .Depth 0]
[pset Movelist(!.Movelist (.Dvalue .D)) ])]
% 6: возврат к другой альтернативе развилки;
[fail]])]