Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Волченков Логическое программирование язык пролог 2015

.pdf
Скачиваний:
11
Добавлен:
12.11.2022
Размер:
4.14 Mб
Скачать

шинство же известных нетривиальных игр этого типа (шашки, шахматы, рэндзю и т.п.) не допускают полного перебора за реальное (неастрономическое) время, разве что, когда речь идёт о решении шахматных задач типа «Белые начинают и дают мат в 3 хода».

В таких «реальных» играх при поиске лучшего хода из некоторой позиции приходится просчитывать игру лишь на некоторую глубину, оценивать возникающие при этом позиции и выбирать ход, который наиболее выгоден игроку, делающему этот ход, с точки зрения указанного оценивания.

Вся интеллектуальность здесь как раз и проявляется в выборе удачной оценочной функции. Аргументом её служит описание позиции игры, а значением – число, которое чем больше, тем выгоднее позиция для игрока по имени МАКСИМУМ, и которое чем меньше, тем выгоднее позиция для игрока по имени МИНИМУМ. Функцию эту называют эвристической, а поиск решающего подграфа на игровом дереве – эвристическим поиском. (Отметим, что задачу эвристического поиска традиционно относят к задачам искусственного интеллекта.)

Пример 9.3.

Всем с детства хорошо известна игра «крестики-нолики», в которую играют на поле 3 х 3. Неплохой оценочной функцией для

оценки произвольной позиции этой игры может быть такая: z = y – x,

где y – это число строк, столбцов и диагоналей, на которых нет «нолика», x – число строк, столбцов и диагоналей, на которых нет «крестика».

131

На рис. 9.4 показаны 5 позиций, в которые может перейти игрок МИНИМУМ («нолик») после своего ответа на ход «крестика» в угловую клетку.

 

x

 

 

 

x

 

 

 

x

 

 

 

x

 

 

 

x

 

 

 

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

o

 

 

 

 

 

 

o

 

 

 

 

o

 

 

 

 

o

 

 

 

 

 

6 –

5 =

1

 

5 – 5 = 0

 

6 –

5 =

1

 

5 –

5 =

0

 

4 – 5 = -1

Рис. 9.4. Примеры позиций игры «крестики-нолики» и вычисления их оценок

Самой лучшей в смысле значения эвристической функции (-1) для игрока МИНИМУМ является последняя в этом ряду позиция.

И действительно, всем хорошо известно, что только эта позиция из пяти представленных на рис. 9.4 не приводит «нолика» к проигрышу.

Так как же выбирать ход, если есть возможность строить дерево игры на определённую глубину и эвристически оценивать позиции, находящиеся на этой глубине?

Простейшим является так называемый минимаксный алгоритм. Следующий пример демонстрирует его суть.

Пример 9.4.

На рис. 9.5,а показано дерево абстрактной игры, когда из исходной позиции M1 ход делает игрок МИНИМУМ.

Возле каждой «висячей» вершины дерева игры, имеющего глубину 3, представлено численное значение эвристической оценки этой вершины. С помощью минимаксного алгоритма все вершины, не являющиеся «висячими», получают так называемые возвращённые оценки путём движения по дереву снизу-вверх. Если родительская вершина является позицией игрока МИНИМУМ, то значение её возвращённой оценки равно минимальному значению оценок её дочерних вершин. Если родительская вершина является позицией игрока МАКСИМУМ, то значение её возвращённой оценки равно максимальному значению оценок её дочерних вершин. На рис. 9.5,б показаны значения возвращённых оценок всех родительских вершин и выделен решающий путь, состоящий из наилучших ходов как игрока МИНИМУМ, так и игрока МАКСИМУМ.

132

 

 

 

M1

 

 

 

 

P1

 

P2

 

 

 

 

 

 

M2

 

M3

M4

M6

 

5

 

 

 

 

-3

M5

 

 

 

 

 

 

 

 

 

 

P3

 

 

 

 

 

-2

P4

 

P6

P9

а)

 

 

 

0

P5

4

0

 

 

 

P7

 

P10

 

 

3

P8

 

 

1

3

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

M1

 

 

 

 

 

1

 

 

 

P1

 

P2

 

 

 

5

 

1

 

 

 

 

M3

 

 

-2

 

M6

M5

0

 

 

 

 

1

 

б)

P7

1

Рис. 9.5. Демонстрация работы минимаксного алгоритма на абстрактном примере

Следующая программа на Прологе (код 9.7) демонстрирует процедуру поиска последовательности наилучших ходов по методу «минимакса» для уже имеющегося дерева игры.

133

Код 9.7

%Процедура поиска оптимальной стратегии игры

%по методу минимакса. Автор Н.Волченков. 2003 г.

%Сначала необходимо загрузить данные из двух файлов:

%

?- izvm, izvp.

% Пример последующего затем вызова:

%

?- minmax(m1, N, Res).

minmax(A, N, P) :- eval(A, N), path(A, N, P), !.

%Сначала, двигаясь от листьев к корню,

%программа оценивает все нелистовые вершины

%дерева (eval/2), затем строится оптимальный путь

%из корня к листу дерева – по вершинам, имеющим

%одинаковое значение оценки (path/3).

eval(A, N) :- m(A, N, L), !, eval(min, A, N, L). eval(A, N) :- p(A, N, L), !, eval(max, A, N, L).

eval(_, _, N, []) :- !.

eval(min, A, N, [B|L]) :- retract(m(A, N, [B|L])), eval(B, M),

eval1(min, N, M, L), assert(m(A, N, [B|L])).

eval(max, A, N, [B|L]) :- retract(p(A, N, [B|L])), eval(B, M),

eval1(max, N, M, L), assert(p(A, N, [B|L])).

eval1(_, N, N, []) :- !.

eval1(S, N, K, [A|L]) :- eval(A, K1), eval2(S, N, K, K1, L).

eval2(min, N, K, K1, L) :- K1 < K, !, eval1(min, N, K1, L). eval2(max, N, K, K1, L) :- K1 > K, !, eval1(max, N, K1, L). eval2(S, N, K, K1, L) :- !, eval1(S, N, K, L).

134

path(A, N, [A]) :- (m(A, N, []) ; p(A, N, [])), !. path(A, N, [A|P]) :- (m(A, N, L) ; p(A, N, L)), !,

path(B, N, L, P). path(A, N, L, P) :- member(A, L),

(m(A, N, _) ; p(A, N, _)), path(A, N, P).

% Извлечение данных из двух файлов: izvp :- see(ppp), read(T), cys(T), seen.

izvm :- see(mmm), read(T), cys(T), seen. cys(end_of_file) :- !.

cys(T) :- assert(T), read(TN), cys(TN).

Вреальных играх деревья, в отличие от дерева, представленного

впримере 9.4, бывают значительно более ветвистыми. И глубина их, как правило, бывает значительно большей. Поэтому становится актуальным повышение эффективности поиска решающего пути. С

этой целью часто используют улучшенный минимаксный метод – так называемую стратегию АЛЬФА/БЕТА-отсечений.

Стратегия АЛЬФА/БЕТА-отсечений предполагает совмещение процесса построения дерева игры с процессом вычисления верхних и нижних границ значений оценок его вершин: нижних границ для позиций игрока МАКСИМУМ и верхних границ для позиций игрока МИНИМУМ (так называемых АЛЬФА-ограничений и БЕТАограничений соответственно). Знание этих границ позволяет «отсекать» «бесперспективные» вершины при построении дерева игры.

Пример 9.5. Продемонстрируем процесс АЛЬФА/БЕТАотсечения на примере фрагментов дерева игры, показанного на рис. 9.5. Используем следующие обозначения: α(Pi) – АЛЬФАограничение вершины Pi; β(Mj) – БЕТА-ограничение вершины Mj.

На рис. 9.6,а показан фрагмент дерева игры после построения вершины P3. Её оценка -2. Следовательно, β(M3) = -2. При этом ранее установлено, что α(P1) = 5. Так как α(P1) > β(M3), то строить другие дочерние вершины для вершины M3 не имеет смысла. Вершина M3 бесперспективна и отсекается.

После построения вершины P6, имеющей оценку 4, выясняется, что α(P2) = -3, а β(M5) = 4. Так как α(P2) не превышает β(M5), то

генерация дочерних вершин (P7, P8) должна быть продолжена. На рис. 9.6,б представлен фрагмент дерева игры после этой генерации.

135

На рис. 9.6,в представлен фрагмент дерева игры после построения вершины P9, имеющей оценку 0. При этом α(P2) = 1, а β(M6) = 0. Так как α(P2) > β(M6), то строить другие дочерние вершины для вершины M6 не имеет смысла. Вершина M6 бесперспективна и отсекается.

P1

 

 

P2

 

 

 

P2

 

 

α(P1) = 5

 

α(P2) = -3

 

 

α(P2) = 1

 

 

 

M3

 

 

M5

 

 

 

M6

 

 

 

M4

β(M5) = 4

 

 

M5

β(M6) = 0

M2

β(M3) = -2

 

 

 

 

 

 

 

 

 

 

-3

 

 

 

1

 

 

 

 

 

 

 

 

 

5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

P6

 

 

 

 

 

 

 

 

 

4

P7

 

 

 

 

 

 

 

 

 

 

 

 

 

P6

 

 

 

1

P8

P9

 

 

 

 

 

 

 

P3

4

 

P7

P8

 

 

2

0

 

 

 

 

 

 

 

 

-2

 

 

1

2

 

 

 

 

 

а)

 

 

б)

 

 

 

в)

 

Рис. 9.6. Фрагменты дерева абстрактной игры в процессе применения алгоритма АЛЬФА/БЕТА-отсечения

Во многих случаях использование АЛЬФА/БЕТА-отсечения позволяет примерно в 2 раза увеличить глубину дерева игры при сохранении примерно того же числа вершин.

Взаключение отмечу, что впервые на языке Пролог алгоритм АЛЬФА/БЕТА-отсечения был реализован У.Уилсоном, а описан в уже упоминавшейся выше книге Л. Стерлинг и Э. Шапиро [7]. Применение Пролога для реализации игровых алгоритмов также

хорошо представлено и в книге И. Братко «Алгоритмы искусственного интеллекта на языке Пролог» [9].

Вкниге И. Братко хорошо изложен материал и о другой возможности использования Пролога в искусственном интеллекте – о реализации на этом языке основных идей построения экспертных систем. Ограниченность объёма настоящего пособия вынуждает автора призвать читателей к самостоятельному изучению этого материала.

136

Лекция 10

Пролог и системы искусственного интеллекта (продолжение)

В данной лекции рассмотрены ещё несколько задач, которые с той или иной степенью условности можно отнести к искусственному интеллекту. В частности, представлено довольно изящное, на взгляд автора, решение проблемы распознавания изображений тел с плоскими гранями. Это хотя и довольно узкий класс образов, но на нём демонстрируется эффективность характерного для Пролога «недетерминированного программирования». Автор недаром «заключил в скобки» термин «недетерминированное программирование», так как слушатели (читатели), разумеется, уже усвоили, что

Пролог со своими механизмами автоматического возврата (backtracking) и сопоставления образцов (pattern-matching) лишь имити-

рует «недетерминированность». Но эта имитация реализована в Прологе красиво и эффективно. Именно в этом смысле к искусственному интеллекту автор отнёс и другие задачи, рассмотренные в данной лекции. Это известная «задача о коммивояжёре» и весьма близкая к сфере деятельности известного сыщика Шерлока Холмса почти криминалистическая задача «об обитателях пяти домов».

1.Задача распознавания изображений тел с плоскими гранями

Пусть имеется исходная «картинка». Это плоское изображение, на котором компьютер «видит» многоугольники, точнее односвязные области, ограниченные замкнутыми ломаными линиями. Каждая область заполнена одним цветом. На рис. 10.1 – пример указанного изображения.

Рис. 10.1. Пример исходного изображения двух тел

137

«Видны» 10 односвязных областей, закрашенных разными цветами: один треугольник, 6 четырёхугольников, два шестиугольника и одна область с «дырой».

Ещё одна область на картинке – это фон, для простоты также закрашенный одним цветом.

Очевидно, что никакого искусственного интеллекта не нужно для автоматического преобразования картинки, представленной на рис. 10.1, в так назы-

ваемое контурное изображение,

показанное на рис. 10.2.

Рис. 10.2. Пример контурного изображения

После указанного преобразования можно считать, что компьютер «знает» уже не только о существовании на изображении, помимо фона, десяти гипотетических граней каких-то тел. Компьютеру уже также «известно» о существовании 29 рёбер – отрезков, находящихся либо между двумя гранями, либо между одной гранью и фоном. (Рис. 10.3).

Рис. 10.3. Нумерация ребер и граней контурного изображения

138

Следующая задача – построение контурного описания изображения.

Контурное описание изображения – это список описаний всех рёбер. В этом списке сначала должны быть представлены все рёбра, находящиеся на границе между фоном и «не фоном» при движении по часовой стрелке от какой-нибудь произвольно выбранной точки на этой границе (например, точки 0 на рис. 10.3). Остальные рёбра могут располагаться в списке произвольно.

Договоримся ещё об одном. Пусть описание каждого ребра – это структура с тремя аргументами. Функтор структуры – это вид ребра; 1-й аргумент структуры – это область, находящаяся слева от ребра; 2-й аргумент – это область, находящаяся справа от ребра, 3- й аргумент – это тип ребра.

Для простоты будем считать, что рёбра бывают всего трёх видов: «положительные» (рис. 10.4,а), «отрицательные» (рис. 10.4,б)

и «вертикальные» (рис. 10.4,в). Будем обозначать вид ребра так: pr, nr, vr.

а)

б)

в)

Рис. 10.4. Три вида ребер контурного изображения

Типы ребер (всего их четыре) следующие:

выпуклое ребро (грани слева и справа от ребра образуют выпуклую поверхность); вогнутое ребро (грани слева и справа от ребра образуют вогнутую поверхность);

ребро типа «down» (если при обходе по контуру изображения по часовой стрелке движение по данному ребру происходит сверху вниз);

ребро типа «up» (если при обходе по контуру изображения по часовой стрелке движение по данному ребру происходит снизу вверх).

Разумеется, сразу ответить на вопрос, какого типа каждое ребро, компьютер не может – это одна из тех задач, которые будут решаться в процессе распознавания. Другие (основные) задачи – ус-

139

тановить, сколько тел на изображении, какому из тел принадлежит каждая грань и какого типа каждая грань (типы граней такие: горизонтальная, левая и правая). По мнению автора, эти задачи вполне могут быть отнесены к категории искусственного интеллекта.

Итак, после предварительной обработки на вход «интеллектуального» распознавателя поступают данные следующего вида:

Код 10.1

patrecdata((R1;R2;R3;R4;R5;R6;R7;R8;R9;R10),

(pr(фон, R2, E1), nr(R2, фон, E2), vr(фон, R5, E3), pr(фон, R7, E4), nr(R7, фон, E5), vr(R8, фон, E6), pr(R8, фон, E7), nr(фон, R5, E8), vr(R6, фон, E9), pr(R6, фон, E10), nr(фон, R4, E11), pr(R3, фон, E12), nr(фон, R1, E13), vr(фон, R1, E14), nr(R1, R2, E15),

pr(R2, R3, E16),

vr(R1, R3, E17),

vr(R3, R4, E18),

nr(R4, R2, E19),

pr(R2, R6, E20),

vr(R4, R6, E21),

nr(R5, R7, E22),

pr(R7, R8, E23),

vr(R5, R8, E24),

pr(R8, R9, E25),

vr(R8, R9, E26),

vr(R9, R8, E27),

nr(R10, R9, E28), pr(R10, R8, E29))).

Данные представлены в виде факта Пролога patrecdata/2, первый аргумент которого – это совокупность граней (R1; …; R10), второй аргумент – это последовательность рёбер. Ri – переменная, обозначающая грань ( i-ю односвязную область на картинке). Все эти 10 переменных объединены в единую структуру данных с функтором «;» Ej – переменная, обозначающая тип j-го ребра.

Решение задачи распознавания в данном случае должно выдать следующий результат:

R1 = B1 : левая_грань,

R2 = B1 : горизонтальная_грань,

R3 = B1 : правая_грань,

R4 = B1 : левая_грань,

R5 = B2 : левая_грань,

R6 = B1 : правая_грань,

140

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]