Отношения для 'игры в восемь' показаны на рис. 12.6. Вершина пространства состояний — это некоторая конфигурация из фишек на игровой доске. В программе она задается списком текущих положений фишек. Каждое положение определяется парой координат X/Y
. Элементы списка располагаются в следующем порядке:
(1) текущее положение пустой клетки,
(2) текущее положение фишки 1,
(3) текущее положение фишки 2,
…
Целевая ситуация (см. рис. 11.3) определяется при помощи предложения
цель( [2/2, 1/3, 2/3, 3/3, 3/2, 3/1, 2/1, 1/1, 1/2] ).
Имеется вспомогательное отношение
расст( K1, K2, P)
P — это 'манхеттеновское расстояние' между клетками K1 и K2, равное сумме двух расстояний между K1 и K2: расстояния по горизонтали и расстояния по вертикали.
Рис. 12.7. Три стартовых позиции для 'игры в восемь': (а) решение требует 4 шага; (b) решение требует 5 шагов; (с) решение требует 18 шагов.
Наша задача — минимизировать
Эвристическая функция
h( Поз, H)
Поз
— позиция на доске; H
вычисляется как комбинация из двух оценок:
(1) сумрасст
— 'суммарное расстояние' восьми фишек, находящихся в позиции Поз
, от их положений в целевой позиции. Например, для начальной позиции, показанной на рис. 12.7(а), сумрасст
= 4.
(2) упоряд
— степень упорядоченности фишек в текущей позиции по отношению к тому порядку, в котором они должны находиться в целевой позиции. Величина упоряд
вычисляется как сумма очков, приписываемых фишкам, согласно следующим правилам:
• фишка в центральной позиции — 1 очко;
• фишка не в центральной позиции, и непосредственно за ней следует (по часовой стрелке) та фишка, какая и должна за ней следовать в целевой позиции — 0 очков.
• то же самое, но за фишкой следует 'не та' фишка — 2 очка.
Например, для начальной позиции рис.12.7(а),
упоряд
= 6.
Эвристическая оценка H
вычисляется как сумма
H = сумрасст + 3 * упоряд
Эта эвристическая функция хорошо работает в том смысле, что она весьма эффективно направляет поиск к цели. Например, при решении головоломок рис. 12.7(а) и (b) первое решение обнаруживается без единого отклонения от кратчайшего решающего пути. Другими словами, кратчайшие решения обнаруживаются сразу, без возвратов. Даже трудная головоломка рис. 12.7 (с) решается почти без возвратов. Но данная эвристическая функция страдает тем недостатком, что она не является допустимой: нет гарантии, что более короткие пути обнаруживаются раньше более длинных. Дело в том, что для функции
С другой стороны, оценка 'суммарное расстояние' допустима: для всех позиций
сумрасст
≤
Доказать это неравенство можно при помощи следующего рассуждения: если мы ослабим условия задачи и разрешим фишкам взбираться друг на друга, то каждая фишка сможет добраться до своего целевого положения по траектории, длина которой в точности равна манхеттеновскому расстоянию между ее начальным и целевым положениями. Таким образом, длина оптимального решения упрощенной задачи будет в точности равна сумрасст
. Однако в исходном варианте задачи фишки взаимодействуют друг с другом и мешают друг другу, так что им уже трудно идти по своим кратчайшим траекториям. В результате длина оптимального решения окажется больше либо равной сумрасст
.
12.2. Введите в программу поиска с предпочтением, приведенную на рис. 12.3, подсчет числа вершин, порожденных в процессе поиска. Один из простых способов это сделать — хранить текущее число вершин в виде факта, устанавливаемого при помощи assert
. Всегда, когда порождаются новые вершины, уточнять это значение при помощи retract
и assert
. Проведите эксперименты с различными эвристическими функциями задачи 'игра в восемь' с целью оценить их эвристическую силу. Используйте для этого вычисленное количество порожденных вершин.
12.3. Применение поиска с предпочтением к планированию выполнения задач
Рассмотрим следующую задачу планирования. Дана совокупность
На рис. 12.8 показан пример задачи планирования, а также приведено два корректных плана, один из которых оптимален. Из примера видно, что оптимальный план обладает одним интересным свойством, а именно в нем может предусматриваться 'время простоя' процессоров. В оптимальном плане рис. 12.8 процессор 1, выполнив задачу
Рис. 12.8. Планирование прохождения задач в многопроцессорной системе для 7 задач и 3 процессоров. Вверху показано предшествование задач и величины продолжительности их решения. Например, задача
Один из способов построить план можно грубо сформулировать так. Начинаем с пустого плана (с незаполненными временными промежутками для каждого процессора) и постепенно включаем в него