Самостійне проектування

Резюме

Абс_разн( X, X1, Рх), абс_разн(Y, Y1, Ру), P is Рх + Ру.

Расст( X : Y, X1 : Y1, Р) :- % Відстань до короля абс_разн( X, X1, Рх),абс_разн( Y, Y1, Ру),макс( Рх, Ру, Р).

L_конфиг( _..Б..Л..Ч.._ ) :- % L - конфігурація манх_расст( Б, Ч, 2),манх_расст( Л, Ч, 3).

Расст_до_клетки( Поз, Мрасст) :- % Манхеттенська відстань бк( Поз, БК), % між БК і критичною кліткою кк( Поз, КК), % Критична клітка манх_расст( БК, КК, Мрасст).

Пат( Поз) :- чей_ход( Поз, ч),not шах( Поз),not разрход( Поз, _, _ ).

Мат( Поз) :- чей_ход( Поз, ч), шах( Поз),not разрход( Поз, _, _ ).

Любая_поз( Поз).

Коорд( 5). коорд( 6). коорд( 7). коорд( 8).

Коорд( 1). коорд( 2). коорд( 3). коорд( 4).

Мешает( X : Y1, X : Y2, X : Y3) :-упоряд( Y1, Y2, Y3).

Мешает( X1 : Y, X2 : Y, Х3 : Y) :-упоряд( X1, Х2, Х3), !.

Мешает( S, S1, S1) :- !.

Разрход( Поз, Ход, Поз1) :-ход( разреш, Поз, Ход, Поз1).

Ход( разреш, ч..Б..Л..Ч..Г, Ч-Ч1, б..Б..Л..Ч1..Г1) :-Г1 is Г + 1,сосед( Ч, Ч1),not шах( б..Б..Л..Ч1..Г1).

шах( _..Б..Лх : Лу..Чх : Чу.._ ) :-
сосед( Б, Чх : Чу); % Королі поряд
( Лх = Чх; Лу = Чу),
Лх : Лу \== Чх : Чу, % Нема взяття тури
not мешает( Лх : Лу, Б, Чх : Чу).

упоряд( N1, N2, N3) :-
N1 < N2, N2 < N3;
N3 < N2, N2 < N1.

 

% Предикати цілей

ход_противника( б.._ ). % Супротивник ходить білими

уменьш_простр( Поз, КорнПоз) :-
простр( Поз, Пр),
простр( КорнПоз, КорнПр),
Пр < КорнПр.

ладья_под_боем( ЧейХод..Б..Л..Ч.._ ) :-
расст( Б, Л, Р1),
расст( Ч, Л, Р2),
( ЧейХод = б, !, Р1 > Р2 + 1;
ЧейХод = ч, !, Р1 > Р2 ).

ближе_к_клетке( Поз, КорнПоз) :-
расст_до_клетки( Поз, Р1),
расст_до_клетки( КорнПоз, Р2),
Р1 < Р2.

раздел( _..Бх : Бу..Лх : Лу.. Чх : Чу.._ ) :-
упоряд( Бх, Лх, Чх), !;
упоряд( Бу, Лу, Чу).

не дальше_от_ладьи( _..Б..Л.._, _..Б1..Л1.._ ) :-
расст( Б, Л, Р),
расст( Б1, Л1, Р1),
Р =< Р1.

простр_больше_2( Поз) :- простр( Поз, Пр), Пр > 2.

наш_король_на_краю( _..Х : Y.._ ) :-
% Білий король на краю
( X = 1, !; X = 8, !; Y = 1, !; Y = 8).

король_противника_на_краю( _..Б..Л..Х : Y.._ ) :-
% Чорний король на краю
( X = 1, !; X = 8, !; Y = 1, !; Y = 8).

короли_рядом( Поз) :- %Відстань між королями < 4
бк( Поз, БК), чк( Поз, ЧК),
расст( БК, ЧК, Р), Р < 4.

потеря_ладьи( _..Б..Л..Л.._ ). % Тура взята

потеря_ладьи( ч..Б..Л..Ч.._ ) :-
сосед( Ч, Л), % Чорний король напав на туру
not сосед( Б, Л). % Білий король не захищає туру

абс_разн( А, В, С) :- А > В, !, С is A - В; С is В - А.

макс( А, В, М) :-А >= В, !, М = А;М = В.

манх_расст( X : Y, X1 : Y1, Р) :- % Манхеттенська

відстань

простр( Поз, Пр) :-
% Область, в якій "запертий" чорний король
бл( Поз, Лх : Лу),
чк( Поз, Чх : Чу),
( Чх < Лх, СторонаХis Лх - 1;
Чх > Лх, СторонаХis 8 - Лх ),
( Чу < Лу, СторонаY is Лу - 1;
Чу > Лу, СторонаY is 8 - Лу ),
Прis СторонаХ * СторонаY, !;
Пр = 64. % Тура і чорний король на одній лінії

кк( _..Б..Лх : Лу.. Чх : Чу.._, Кх : Ку) :-
% Критична клітка
( Чх < Лх, !, Кх is Лх - 1; Кх is Лх + 1),
( Чу < Лу, !, Ку is Лу - 1; Ку is Лу + 1).

 

% Процедуры для відображення позицій

отобр( Поз) :-
nl,
коорд(Y), nl,
коорд(X),
печ_фиг(X : Y, Поз),
fail.

отобр( Поз) :-
чей_ход( Поз, ЧХ), глуб( Поз, Г),
nl, write( 'ЧейХод='), write( ЧХ),
write( 'Глубина='), write( Г), nl.

печ_фиг( Клетка, Поз):-
бк( Поз, Клетка), !,write( 'Б');
бл( Поз, Клетка), !,write( 'Л');
чк( Поз, Клетка), !,write( 'Ч');
write( '.').

показать_ход( Ход) :- nl, write( Ход), nl.

§ Ігри двох осіб піддаються формалізації у формі І/Або-графів. Тому процедури пошуку в І/Або-графах застосовні для пошуку в ігрових деревах.

§ Простий алгоритм пошуку вглиб в ігрових деревах легко програмується, але для ігор, що представляють інтерес, він не ефективний. Більш реалістичний підхід - мінімаксний принцип у комбінації з оцінюючою функцією й пошуком, обмеженим по глибині.

§ Альфа-бета алгоритм є ефективною реалізацією мінімаксного принципу. Ефективність альфа-бета алгоритму залежить від порядку, у якому проглядаються варіанти ходів. Застосування альфа-бета алгоритму, у найкращому разі, зменшує коефіцієнт розгалуження дерева пошуку до значення, що є коренем квадратним від коефіцієнта розгалуження мінімаксного дерева пошуку.

§ В альфа-бета алгоритм можна внести ряд удосконалень. Серед них:

o продовження пошуку за межі обмеження по глибині аж до спокійних позицій,

o послідовне поглиблення й

o евристичне відсікання гілок.

§ Числова оцінка позицій є досить обмеженою формою подання знань про конкретну гру. Більш змістовний за своїми можливостями метод подання знань має передбачати внесення в програму знань про типові ситуації. Мова порад (Advice Language) реалізує такий підхід. На цій мові знання представляються в термінах цілей і засобів для їхнього досягнення.

§ У даній главі подано наступні програми: програмна реалізація мінімаксного принципу і альфа-бета процедури, інтерпретатор мови AL0 і таблиця порад для ендшпілю "король і тура проти короля".

§ Були введені й обговорені наступні поняття:

ігри двох осіб з повною інформацією

ігрові дерева

оцінююча функція, мінімаксний принцип

статичні оцінки, робочі оцінки

альфа-бета алгоритм

послідовне заглиблення,

евристичне відсікання,

евристики для виявлення спокійних позицій

Мови порад

цілі, обмеження, елементарні поради, таблиця порад

 

 

 

1. Напишіть програму для якої-небудь простої гри (такої, як ним), що використає спрощений алгоритм пошуку в І/Або-дереві.

2. Розгляньте яку-небудь гру двох осіб (наприклад, який-небудь нетривіальний варіант хрестиків-нуликів). Напишіть відношення, що задають правила цієї гри (дозволені ходи й термінальні позиції). Запропонуйте статичну оцінюючу функцію, придатну для використання в ігровій програмі, заснованій на альфа-бета алгоритмі.

3. Розгляньте який-небудь інший простий ендшпіль, наприклад "король і пішак проти короля", і напишіть для нього програму мовою AL0 (разом з визначеннями відповідних предикатів).