Листинг 12.1. Программа поиска по заданному критерию
I bestfiratt Start, Solution):
Ч Решение Solution. - зто путь от узла Start до целевого узла
bestfirst) Start, Solution) :-
expand( [], 1( Start, 3/0), SS99, _, yes, Solution).
Ь Предполагается, что любое f-значение не превышает 9999
% expand! Pathr Tree, Bound, Treel, Solved, Solution):
Глава 12.Эвристический поиск нозаданному критерию
Path — это путь между начальным узлом поиска и поддеревом. Tree 1 — дерево
Tree, развернутое в пределах Bound; если цель найдена, то Solution — путь. решения и Solved = yes
к Случай 1. Y.fiT.v. |
лист-узел, сформировать путь поиска yes, [HIP]) :-
expand ( р, 1 ( S, _ ) , goal(Hi .
\ Случай 2. Лист-узел; f-значение меньше чем Bound. Сформировать
\ узлы-преемники к развернуть ше в пределах 3ound
expand! P, 1(N,F/G), Bound, Treel, Solved, Sol) :-F -< Bound, ( bagoft М/С, [s(N,M,C}, not member (M, P) ), Succ) ,
!, % Узел Ы имеет преемников
succlist( G, Succ, Ts), % Создать поддеревья Ts
bestf{ Ts, Fit, % f-значение лучшего преемника
expand! P, t(N,Fl/G,Ts), Bound, Treel, Solved, Sol)
)
Solved
% Узел не имеет преемников — тупиковый конец*
Случай 3. Не лис-.-у-ол; f-значение меньше чем Bound. Развернуть наиболее перспективное поддерево; в зависимости от результатов процедура continue примет решение в отношении дальнейших действий
expand! P, t(N, F/G, [T[Ts]), Bound, Treel, Solved, Sol) :-F =< Bound,
bestf ( Ts, BF! , mint Bound, BF, Boundl) , %. Boundl - min (Bound, BF] expandt [H|F], T, Boundl, Tl, Solvedl, Sol), continue( P, t(N,F/G, [Tl|Ts]), Bound, Treel, Solvedl, Solved, Sol) .
....-; 4. . . ■ .•■-.. ;...'.: с пустыми поддеревьями. Это Б котором не может Быть найдено решение
тупиковое направление,
expand; _, t(_,_, []), _, _, never, _) :- !.
I Случай 5. Получено f-значение больше чем Bound. Дерево больше не может расти'
expand С _, Tree, Bound, Tree, no, _) :-ft Tree, F) , F > Bound.
«continue; Path, Tree, Bound, HewTree, SubtreeSolved, TreeSolved, Solution)
continue; _, _, _, _, yes, yes, Sol) .
continue; P, t(N,F/G,[Tl|Ts]), Bound, Treel, no, Solved, Sol) :-insert; Tl, Ts, NTs), bestf; NTs, Fl), expand! P, t[N,Fl/G,NTS), Bound, Treel, Solved, Sol).
continue! P, t(N,F/G,1_ITs]), Bound, Treel, never, Solved, Sol) :-bestf; Ts, Fl), expand!' P, t (Ы, Fl/G, Ts) , Bound, Treel, Solved, Sol).
% succlist( GO, [ Nodel/Costl, ...], ! 1(BestHode,BestF/G), ...)!: 't упорядочить список листьев поиска по их F-значенинм
succlist(
[] , []) -
succlistС GO, [Ы/С i NCs], Ts) G is GO + C,
: -
252 Часть II. Применение языка Prolog в области искусственного интеллекта
ht Я, н) , % Эвристический терм h(N)
F is G + H,
succlist( GO, NCs, Tsl),
insert! 1{H,F/G), Tsl,Ts i .
% Вставить дерево Т Е СПИСОКдеревьев Ts с сохранением упорядоченности ; по отношению к f-значениям
insert; T,Ts, [Т | Ts] ) :-f( Т, F), bestf! Ts, Fl),
F=< Fl, ! .
insert; T, [Tl | Ts], [Ti | Tsl]) :-
insert ( T, Ts, Tsl) .
% Извлечь f-значение
f( 1 (_, f/_; , F) . % f-значение jthcts
f( t(_/F/_,J, F). % f-значение дерева
bestf( [Т|_], F) :- % Лучшее f-значение в списке деревьев
ЦТ, F} .
bestfl [], 9999). % Деревья отсутствуют: неприемлемое f-значение
mini X, Y, X) :-X =< Y, ! .
mint X, Y, Y) .
Параметры Р, Tree и Bound являются "входными" по отношению к процедуре expand; это означает, что при каждом вызове процедуры expand они уже конкретизированы. Процедура expand вырабатывает результаты трех типов, которые различаются по значению параметра Solved, как описано ниже.
1. Solved = yes.
Solution — путь решения, найденный в результате развертывания дерева Tree в пределах Bound.
Переменная Treel является неконкретизированной.
2. Solved = no.
Treel - дерево Tree, развернутое так, что его f-значение превысило Bound
(рис. 12,3).
Переменная Solution является неконкретизированной.
3. Solved = never.
Переменные Treel и Solution являются неконкретизированными.
Последний случай показывает, что дерево Tree - это бесперспективный (тупиковый) вариант и программе больше не следует предоставлять другого шанса на повторную активизацию его исследования. Такая ситуация возникает, если f-значение дерева Tree меньше или равно Bound, но дерево не может расти, поскольку в нем ни один узел больше не имеет преемника (т.е. является листом) или имеет преемника, но такого, который создает цикл.
Некоторые предложения, касающиеся отношения expand, заслуживают дополнительного описания. В частности, предложение, которое относится к наиболее сложному случаю, когда Tree имеет поддеревья, т.е. предложение Tree = t( к, F/G, [T | Ts)!
Глава 12.Эвристический поиск по заданному критерию
а, возможно, некоторое более низкое значение, в зависимости от f-значений других конкурирующих поддеревьев, Ts. Это позволяет гарантировать, что поддерево, растущее в настоящее время, всегда является наиболее перспективным. Затем процесс развертывания переключается с одного поддерева на другие в соответствии с их f-эначениями. После развертывания наилучшего поддерева из всех возможных вспомогательная процедура continue вырабатывает решение в отношении дальнейших действий; это решение зависит от типа результата, полученного на данном этапе развертывания. Если найдено решение, оно возвращается, в противном случае развертывание продолжается. Б предложении, которое касается данной ситуации, Tree = 1С N, F/G!
вырабатываются узлы-преемники уала N наряду со значениями стоимостей дуг между N и узлами-преемниками. Процедура succlist создает список поддеревьев, исходящих из данных узлов-преемников, вычисляя также их g- и f-значения (рис. 12.4), Затем результирующее дерево продолжает развертываться до тех пор, пока позволяет предел Bound. Если, с другой стороны, преемников не было, то происходит отказ от какого-либо дальнейшего использования данного листа путем конкретизации значения Solved = 'never'.
начальный узел |
Тгео1
Г-значекие> Bound
Рис. 12.3. Отношение expand развертывание дерева Tree до тех пор, пока {-значение не превысит Bound, приводит к созданию дерева Tree 1
Другие отношения описаны ниже.
5< Н, Мг С)
где м — узел-преемник узла К в пространстве состояний, С — стоимость дуги от N до Н.
И N,н,
где Н — эвристическая оценка стоимости наилучшего пути отузла N до целевого узла.
Часть II. Применение языка Prolog в области искусственного интеллекта
Примеры применения данной программы поиска по заданному критерию будут даны в следующем разделе. Но вначале приведем некоторые общие, заключительные комментарии к этой программе. Она представляет собой один из вариантов реализации эвристического алгоритма, известного в литературе как алгоритм А* (см. ссылки на дополнительные источники, приведенные в конце этой главы). Алгоритм А* заслуживает большого внимания, поскольку он представляет собой одиниз фундаментальных алгоритмов искусственного интеллекта. Ниже приведен один из важных результатов математического анализа алгоритма А*.
g(M) = g(N)H С
Рис: 12.4. Зависимости между g значением узла ы. а также f- и щ-зчаченияни его дочерних узлов в пространстве со стояний
Алгоритм поиска называется допустимым, если он всегда вырабатывает оптимальное решение (т.е. путь с минимальной стоимостью), при условии, что решение вообще существует. Рассматриваемая здесь реализация, в которой все решения вырабатываются с помощью перебора с возвратами, может считаться допустимой, если оптимальным является первое же из найденных решений. Предположим, что для каждого узла а в пространстве состояний как h* in) обозначена стоимость оптимального пути от г. до целевого узла. В теореме, касающейся допустимости алгоритма А*, утверждается следующее: допустимым является любой алгоритм А*, в котором используется эвристическая функция h, такая, что для всех узлов п в пространстве состояний справедливо следующее утверждение:
ь(п) < h* (л)
Этот результат имеет большое практическое значение. Даже если неизвестно точное значение h*, достаточно найти нижнюю границу h* и использовать ее в качестве h в алгоритме А*. Это служит достаточной гарантией того, что алгоритм Л* выработает оптимальное решение. В частности, может рассматриваться тривиальная нижняя граница, а именно:
ыы- О
для всех п в пространстве состояний.
Такой вариант действительно гарантирует допустимость. Но недостаток использования условия г. --■- С состоит в том, что оно но имеет эвристического потенциала и не обеспечивает какого-либо управления процессом поиска. Алгоритм А*, в котором используется h = 0, ведет себя аналогично алгоритму поиска в ширину. Мало того, он фактически сводит поиск в ширину к такому случаю, что функция стоимости дуг принимает значение . ;п, п') - 1 для всех дуг (п,п') в пространстве состояний. Такое отсутствие эвристического потенциала приводит к значительному увеличению потребности в ресурсах. Поэтому желательно иметь такое значение h, которое является нижним пределом h ■ (для обеспечения допустимости), а также в максимально возможной степени приближается к h* (для обеспечения эффективности). В идеале,
Глава 12.Эвристический поиск по заданному критерию
если была бы известна стоимость h*, то в алгоритме можно было бы использовать само значение h*» поскольку алгоритм А*, в котором используется значение h*, находит оптимальное решение непосредственно, вообще без какого-либо перебора с возвратами.
Упражнения
12.1. Определите отношения s, goal и h для задачи поиска маршрута, показанной! на рис. 12.2, с учетом особенностей рассматриваемой проблемы. Изучите поведение приведенной в данной главе программы А* при решении этой задачи.
12.2. Следующее утверждение на первый взгляд напоминает теорему допустимости:! "Для любой задачи поиска, если А* находит оптимальное решение, то Hi [п.) < h* (п) для всех узлов п в пространстве состояний". Является ли это утвержде- 1 ние правильным?
12.3. Предположим, что hu h2 и hj - три допустимые эвристические функции (h:. £ h*), которые поочередно применяются алгоритмом А* в одном и том же про-1 странстве состояний. Объедините эти три функции еще в одну эвристическую! функцию, h, которая также допустима и направляет поиск не хуже любой из! трех функций hi, отдельно взятых.
12.4. Подвижный робот перемещается на плоскости х-у между препятствиями. Все! препятствия представляют собой прямоугольники, выровненные вдоль осей у| и х. Робот может перемещаться только в направлениях з? и у и имеет такие] небольшие размеры, что может быть приближенно представлен в виде точки. Робот должен планировать пути перемещения без столкновений с препятствиями от его текущей позиции до некоторой указанной целевой позиции. Ро-. бот стремится свести к минимуму длину пути и количество изменений направления движения (допустим, что стоимость одной смены направления равна стоимости перемещения на одну единицу длины). В роботе для поиска оптимальных путей используется алгоритм А*. Определите предикаты. s( state, NewState, Cost) и hi State, 11) для использования в програмl ме А* в процессе решения этой задачи поиска (желательно, чтобы эти преди-' каты были допустимыми). Предположим, что целевая позиция для робота опре- деляется с помощью предиката goal {Xg/Yg) , где Xg и Yg — координаты х и у!' целевой точки. Препятствия представлены с помощью следующего предиката:
obstacle( Xmin/Ymin, Xmax/Ymax}
где xmin/Ymin — нижний левый угол препятствия, a Xmax/Ymax — его верхний правый угол.
12.2. Применение поиска по заданному критерию для решения головоломки "игра в восемь"
Чтобы можно было применить программу поиска по заданному критерию, приведенную в листинге 12.1, для решения некоторой конкретной задачи, необходимо определить отношения, характеризующие рассматриваемую проблему. Эти отношения характеризуют конкретную проблему ("правила игры"), а также воплощают в себе эвристическую информацию о том, как решить данную задачу. Такая эвристическая информация предоставляется в форме эвристической функции.
Предикаты, касающиеся конкретной проблемы, задаются в виде следующего отношения: s( Node, Model, Cost)
Часть II. Применение языка Prolog в области искусственного интеллекта
Это отношение является истинным, если в пространстве состояний между узлами Node и Nodel имеется дуга со стоимостью Cost. Отношение goal( Mode)
является истинным, если Node — целевой узел в пространстве состояний. А в отношении
h[ Node, H)
переменная Н — эвристическая оценка стоимости пути с минимальной стоимостью от узла Node до целевого узла.
В этом и следующем разделах такие отношения будут определены для двух примеров проблемных областей: головоломка "игра в восемь" (описанная в разделе 11.1) и задача составления расписаний.
Отношения, касающиеся проблемной области для головоломки "игра в восемь", приведены в листинге 12.2. Любой из узлов в пространстве состояний представляет собой некоторую конфигурацию фишек в коробке. В данной программе эта конфигурация представлена в виде списка текущих положений фишек. Каждая позиция обозначается парой координат, X/Y. Порядок элементов в списке является следующим.
1. Текущая позиция пустого квадрата.
2. Текущая позиция фишки 1.
3. Текущая позиция фишки 2.
4 . . . .
Целевая ситуация (см. рис. 11.3), в которой все фишки находятся на своих исходных клетках, определяется следующим предложением:
goal! [2/2,1/3,2/3,3/3,3/2,3/1,2/1,1/1,1/2]).
Листинг 12.2. Относящиеся к проблемной области процедуры для головоломки "игра в восемь", которые должны использоваться в программе поиска по заданному критерию, приведенной в листинге 12.1
{* Относящиесяк проблемной области процедуры для головоломки "игра в восемь"
Текущая позиция представлена списком координат фишек, в котором на первом месте указаны координаты пустой клетки
Пример
:■: | 13 | ||
[ | |||
Для представления этой позиции служит следующий список: [J2/2, 1/3, 2/3, 3/3, 3/2, 3/1, 2/1, 1/1, 1/2]
12 3
Принято считать, что пустая клетка - это "пустая" фишка, которая может передвигаться по горизонтали или г.о вертикали на место, занимаемое любой из ее соседних фишек; это означает, чхо "пустая" фишка и ее соседняя фишка могут поменяться местами V
% s t Mode, SuccessorNode, Cost)
S( [Empty I Tiles], [Tile ] Tilesl], 1) :- % Стоимости всех дуг равны 1 swap* Empty, Tile, Tiles, Tilesl). % Поменять местами пустую фишку
% Empty и фишку Tile в списке Tiles
swap С Empty, Tile, [Tile [ Ts], [Empty | Ts] ) :-
mandist{ Empty, Tile, 1) . % Манхэтгенское расстояние равно 1
Глава 12. Эвристический поиск по заданному критерию
- |
% D - это манхэттенское расстояние % между двумя клетками |
I D равно |А-В| |
snap! Empty, Tile, [Tl I Ts], [Tl I Tsl] Swap! Empty, Tile, Ts, Tsl).
: -
mandistC X/Y, Xl/Yl, D)
dif ( X, XI, Dx) ,
dif < Ч, Yl, Dy) ,
D is Dx + Dy.
dif( й, Б, D) :-D is A-B, D >= 0, !
D is В-А.
% Эвристическая оценка h представляет собой суммурасстояний от каждой фишки 4 до ее "исходной" клетки плис утроенное значение "оценки упорядоченности"
hi [Empty I Tiles] , H] :-
goal{ [Emptyl I GoalSquares] ), totdist{ Tiles, GoalSquares, D), seq( Tiles, S), H is D + 3*S,
Суммарное расстояние от исходных клеток i Оценка упорядоченности
totdist( [], [], 0) .
totdistt [Tile I Tiles], [Square ] Squares], D) mandist! Tile, Square, Dl), totdistt Tiles, Squares, D2) , D is Dl + D2.
-
% seq( TilePositions, Score) : оценка упорядоченности
seq( [First I OtherTiles], s) :-
seq( [First I OtherTiles ], First, 3).
seq( [Tilel, Tile2 I Tiles], First, S) :-score( Tilel, Tile2, El), seq( [Tile2 t Tiles), First, £2), S is SI + $ 2.
seq( [Last] , First, S} :-score( Last, First, SJ .
1 . |
score) 2/2, _, 1)
score! 1/3, 2/3, 0!
score! 2/3, 3/3, 0)
score! 3/3, 3/2, 0)
score! 3/2, 3/1, 0)
score! 3/1, 2/1, Q)
score! 2/1, 1/1, 0)
score( 1/1,1/2,0)
scoreC 1/2, 1/3, G)
: -
: - | ! . |
: - | ! . |
: - | ! . |
: - | [ , |
: - | ! . |
: - | ! . |
: - | ! . |
% Оценка фишки, стоящей в центре, равна 1
% Оценка фишки, за которой следует % допустимый преемник, равна 0
score! _, _, 2) . Ч Оценка фишкк, за которой следует
% недопустимый преемник, равна 2 goal С [2/2,1/3,2/3,3/3,3/2,3/1,2/1,1/1,1/2] ). % Исходные клетки для фишек
Ч Показать путь решения как список позиций на доске
showsolC [] ) .
showsol( [P I L] showsol( L),
)
-
258 Часть II. Применение языка Prolog в области искусственного интеллекта
al, write( '------- '),
showpost P]. i Показать позицию на доске
Showposf [S0,S1,S2,S3,S4,S5,S6,S7,S8] ) :-
member; Y, [3,2,1) >, % Последовательность координат Y
nl, member[ X, [1,2,3) ), % Последовательность коордкнат х
member! Tile-X/Y, % Фишка в клетке XY
[■ '-S0,1-S1,2-S2,3-S3,4-S4,5-S5,6-S6,7-S7,8-S8] ( , write! Tile),
fail I Выполнить перебор с возвратом к следующей клетке
true, % Обработка всех клеток закончена
* Начальные позиции для некоторых задач
stactll [2/2,1/3,3/2,2/3,3/3,3/1,2/1,1/1,1/2] ). I Требует 4 хода
start2( £2/1,1/2,1/3,3/3,3/2,3/1,2/2,1/1,2/3] ). % Требует 5 ходов
Start3( [2/2,2/3,1/3,3/1,1/2,2/1,3/3,1/1,3/2] ). % Требует 19 кодов
% Пример^запроса: ?- вТГгТГPos), beetHHt[ Pos, Sol), rtowsel t'Sol). .............................
При определении этих отношений применяется следующее вспомогательное отношение:
mandist( SI, 52, D).
где D — манхэттенскоерасстояние между клетками S1 и S2; оно измеряется как сумма расстояний между S1 и S2 в горизонтальном и вертикальном направлениях.
Необходимо найти путь к решению минимальной длины. Поэтому определим стоимость всех дуг в пространстве состояний как равную 1. В программе, приведенной в листинге 12.2, заданы также три примера начальных позиций, которые составлены по диаграммам, показанным на рис. 12.5.
л | Л | |
и |
а | ||
У. | ||
a) fi] в)
Рис, 12,5. Три начальные позиции для головоломки "игра е восемь": а) требует. 4 хода; б) требует. 5 ходов; в) требует 18 ходов
Эвристическая функция h определяется в программе следующим образом: hi Роз, К) где Pos — позиция на доске, Н — сочетание двух описанных ниже критериев,
1. totdist. Суммарное расстояние восьми фишек в позиции Роз от тех клеток, называемых исходными, в которых должны находиться фишки после решения головоломки. Например, в начальной позиции головоломки, приведенной на рис. 12.5, о, totdist = 4.
2. seq. Оценка упорядоченности, определяющая ту степень, в какой фишки, стоящие в текущей позиции, уже упорядочены по отношению к той последовательности, которая должна быть достигнута в целевой конфигурации. Значе-
Глэва 12. Эвристический поиск по заданному критерию 259
ние seq вычисляется как сумма оценок для каждой фишки в соответствии со следующими правилами:
• фишка в центре имеет оценку 1;
• фишка, стоящая на нецентральной клетке, имеет оценку О, если за ней в направлении по часовой стрелке следует соответствующий ей преемник (например, если за фишкой 1 следует фишка 2);
• такая фишка имеет оценку 2, если за ней не следует соответствующий ей преемник.
Например, для начальной позиции головоломки, приведенной на рис. 12.5, а, seq = 6.
Эвристическая оценка, Н, вычисляется как К = totdist + 3 * seq.
Эта эвристическая функция действует успешно в том смысле, что очень эффективно направляет поиск к цели. Например, при решении задач, показанных на рис. 12.5, а, б, не происходило даже развертывание ни одного узла, выходящего за пределы кратчайшего пути решения, до того, как было найдено первое решение. Это означает, что в таких случаях кратчайшие пути решения отыскиваются непосредственно, без какого-либо перебора с возвратами. Почти сразу же решается даже трудная задача, приведенная на рис. 12.5, в. Но недостаток этой эвристики состоит в том, что она не является допустимой: она не гарантирует, что кратчайший путь решения всегда будет найден до обнаружения какого-либо более длинного решения. Дело в том, что данная функция h не удовлетворяет условию допустимости, при котором h < h* для всех узлов. Например, для начальной позиции, приведенной на рис. 12.5, а, имеет место следующее:
h=4 + 3*6-22, Ъ* = 4
С другой стороны, допустимым является отдельно взятый критерий "суммарного расстояния", поскольку для всех позиций имеет место следующее:
totdist <_ h*
Допустимость этого отношения можно легко проверить с помощью таких рассуждений: если условия этой головоломки будут упрощены таким образом, что фишки можно будет переносить друг над другом, то каждая фишка сможет переходить к своей исходной клетке по траектории, длина которой точно равна манхэттенскому расстоянию между начальной клеткой фишки и ее исходной клеткой. Поэтому оптимальное решение в упрощенной головоломке будет точно равно длине totdist. Но в первоначальном варианте задачи фишки могут мешать друг другу и одна из них может находиться на пути другой, что препятствует движению фишек по кратчайшим траекториям, а это гарантирует, что длина оптимального решения равна или больше чем totdj sj-.
Упражнение
12.5. Модифицируйте программу поиска по заданному критерию, приведенную в листинге 12.1, таким образом, чтобы в ней подсчитывал ось количество узлов, выработанных в процессе поиска. Один из простых способов состоит в том, чтобы текущее значение количества узлов вносилось в базу данных как факт и обновлялось с помощью предикатов retract и assert после каждой выработки новых узлов. Проведите эксперименты с различными эвристическими функциями для головоломки "игра в восемь" для оценки их эвристического потенциала, который характеризуется количеством выработанных узлов.
260 Часть II. Применение языка Prolog в области искусственного интеллекта
Применение поиска по заданному критерию при планировании
Рассмотрим следующую проблему планирования заданий. Предположим, что дано множество заданий, tj, tj, ..., и соответствующих им значений продолжительности выполнения, Dj, D;, ... . Задания предназначены для выполнения множеством идентичных процессоров тт.. Любое задание может быть выполнено любым процессором, ко каждый процессор способен одновременно выполнять только одно задание. Между заданиями определено отношение предшествования, которое указывает, какие задания, если они имеются, должны быть завершены, прежде чем можно будет начать выполнение какого-то другого задания. Проблема планирования состоит в распределении заданий по процессорам таким образом, чтобы не нарушалось отношение предшествования и все задания в целом были обработаны за кратчайшее возможное время. Время окончания последнего задания в расписании называется временем завершения расписания. Среди всех возможных расписаний необходимо найти такое, при котором время завершения становится минимальным.
На рис. 12.6 показана такая задача планирования заданий и приведены два допустимых расписания, одно из которых является оптимальным. Этот пример демонстрирует интересное свойство оптимальных расписаний, которое состоит в том, что они могут включать время простоя для процессоров. В оптимальном расписании, приведенном на рис, 12.6, процессор 2 после выполнения задания -„,■ ожидает в течение двух единиц времени, хотя он мог бы сразу же начать выполнение задания t-?.
/7/П |
Время
s | 4 13 | 24 33 | ||||
fJ | h | и | ||||
ч | ч | |||||
h | и | '■ШШ | ||||
а
о
, | ! 1 | \ | ||||||
и | h | |||||||
^ | it Про-j | Г; | ■ ■ ■■ | |||||
h | и | Щ ■■:.: ■ i | ||||||
Рис. 12.6. Задача планирования заданий, в условия которой входят сечь заданий и три процессора, В верхней части, этого рисунка показаны отношение предшествования заданий и продолжительность заданий. Например, для задания £, требуется 20 единиц времени и его выполнение может качаться только после завершения трех других заданий, tL. t2 и £з. Показаны два допустимых расписания: оптимальное, с временем завершения 24, и неоптимальное, с временем завершения 33. При решении данной- задачи любое оптимальное расписание должно включать время простоя (см, [34], с. 86), Этот рисунок адаптирован и включен е настоящую книгу с разрешения издательства Prentice Hall, Englewood Cliffs, New Jersey
Глава 12.Эвристический поиск позаданному критерию
Один из способов формирования расписания, грубо говоря, состоит в следующем. Работа начинается с пустого расписания (с нераспределенными интервалами времени для каждого процессора), и в это расписание постепенно одно за другим вносятся задания до тех пор, пока не будут внесены все задания. Обычно на каждом из этих этапов внесения заданий в расписание имеется несколько вариантов, поскольку всегда ожидает обработки несколько возможных заданий. Поэтому задача составления расписания представляет собой задачу поиска. В соответствии с этим задачу составления расписания можно сформулировать как задачу поиска в пространстве состояний следующим образом:
• состояния представляют собой частично составленные расписания;
• состояние-преемник некоторого частично составленного расписания можно получить, введя в это расписание еще не запланированное задание; еще одна возможность состоит в том, что процессор, который выполнил свое текущее задание, может быть оставлен в состоянии простоя;
• начальным состоянием является пустое расписание;
• целевым состоянием является любое расписание, которое включает все задания, рассматриваемые в данной задаче;
• стоимость решения (которая должна быть минимизирована) представляет собой время завершения целевого расписания;
• согласно этим условиям, стоимость перехода между двумя (частично составленными) расписаниями, время завершения которых соответственно равно Fi и Ег, представляет собой разность Г2 - W\.
В этот ориентировочный сценарий необходимо внести некоторые уточнения. Во-первых, принято заполнять расписание по возрастанию значений времени таким образом, чтобы задания вносились в расписание слева направо. Кроме того, при внесении каждого задания следует проверять, соблюдается ли ограничение предшествования. К тому же нет смысла оставлять какой-либо процессор в состоянии простоя на неопределенно долгое время, если все еще имеются какие-то возможные задания, ожидающие выполнения. Поэтому решено оставлять процессор в состоянии простоя только до тех пор, пока какой-то другой процессор не завершит свое текущее задание, а затем снова рассматривать возможность назначения задания простаивающему процессору.
Теперь необходимо выбрать способ представления проблемных ситуаций, т.е. частично составленных расписаний. Для решения задачи составления расписания требуется следующая информация.
1. Список ожидающих заданий и значений времени их выполнения.
2. Текущие назначения процессоров.
Кроме того, для удобства можно также учитывать следующую информацию.
3. Время завершения (частично составленного) расписания, другими словами, по
следнее значение времени окончания обработки работы процессорами текущих
назначений.
Список ожидающих заданий и значений времени их выполнения будет представлен в программе в виде списка в следующей форме:
[ Taskl/Dl, Task2/D2, ... ]
Текущие назначения процессоров представляются в виде списка заданий, обрабатываемых в настоящее время; это означает, что должны использоваться пары с определением заданий и времени их завершения в следующей форме:
Task/FinishingTime
В списке имеется т таких пар, по одной для каждого процессора. Новое задание всегда вносится в расписание в тот момент, когда завершается выполнение первого предшествующего ему задания. Для этого список текущих назначений поддержива-
262 Часть II. Применение языка Prolog в области искусственного интеллекта
ется в отсортированном виде в соответствии с возрастающими значениями времени завершения. Три компонента частично составленного расписания (ожидающие задания, текущие назначения и время завершения) объединяются в программе в одно выражение: WaitingList * ActiveTasks * FinisbingTime
Кроме этой информации, имеется ограничение предшествования, которое задано в программе в виде отношения: prec( TaskX, TaskY)
Теперь рассмотрим эвристическую оценку. Для этого будет использоваться довольно простая эвристическая функция, которая не обеспечивает достаточно эффективного управления при осуществлении алгоритма поиска в условиях крупномасштабных задач. Тем не менее эта функция является допустимой и поэтому гарантирует получение оптимального расписания. Но следует отметить, что для решения большинства задач составления расписаний требуется гораздо более мощная эвристическая функция.
Рассматриваемая эвристическая функция представляет собой оптимистическую оценку времени завершения частично составленного расписания, дополненного всеми ожидающими в настоящее время заданиями. Эта оптимистическая оценка вычисляется исходя из предположения, что ослаблены следующие ограничения на действительные расписания.
1. Удалено ограничение предшествования.
2. Принято (нереальное) допущение, что задание может выполняться в режиме распределения по нескольким процессорам и что сумма значений времени выполнения этого задания всеми соответствующими процессорами равна первоначально заданному времени выполнения данного задания на одном процессоре.
Предположим, что значения времени выполнения ожидающих в настоящее время заданий равны Di, Dv, ..., а значения времени завершения текущих назначений процессоров равны Fi, F» . . . Такая оптимистическая оценка времени завершения, Finall, позволяющего выполнить все активные в настоящее время и все ожидающие задания, определяется по следующей формуле:
Finall = Уt!i £лЩ)/т
iJ
где m — количество процессоров. Предположим, что время завершения текущего частично составленного расписания определяется выражением: Fin = так (F-)]
В таком случае эвристическая оценка К (дополнительное время, требуемое для дополнения частично составленного расписания ожидающими заданиями) может быть определена следующим образом: если Finall > Fin, тс Н - Finall - Fin, иначе н = О
Полная программа, в которой в соответствии с описанными выше условиями дано определение отношений пространства состояний для задачи планирования заданий, приведена в листинге 12.3. Кроме того, в этом листинге имеется спецификация конкретной задачи составления расписания, показанной на рис. 12.6. Эти определения могут также использоваться в программе поиска по заданному критерию, приведенной в листинге 12.1. Одним из оптимальных решений, сформированных с помощью поиска по заданному критерию в проблемной области, определенной таким образом, является оптимальное расписание, показанное на рис. 12.6.
Глава 12.Эвристический поиск по заданному критерию
Листинг 12.3. Отношения, касающиеся рассматриваемой проблемной области, для задачи планирования заданий. Конкретная задача составления расписания, приведенная на рис. 12.6, определена также с помощью ее графа предшествования и начального (пустого) расписания, применяемого в качестве начального узла для поиска
/* Отношения, касающиеся рассматриваемой проблемной области, для задачи планирования заданий
Узлы в этом пространстве состояний представляют собой частичные расписания, заданные следующим образом:
[ WaitingTaskl/Dlr WaitingTask2/D2, ...] * К [ Taskl/Fl, Task2/F2, ...] * FinTime
Первый лист определяет ожидающие задания и значения их продолжительности; второй список определяет задания, выполняемые в настоящее время, и значения времени их завершения, упорядоченные так, что Fl =< F2 , F2 =< F3 ... Fintime — это самое последнее время завершения при текущем назначении процессоров */
4 s( Mode, SuccessorNode, Cost)
s{ Tasksl * (_/F I Activel] * Finl, Tasks2 * Active2 * Fin2, Cost) :-
del( Task/D, Tasksl, Tasks2), % Выбрать ожидающую задачу
not ( member! T/_, Tasks2], before( T, Task] }, % проверить правильность
% упорядочения, not ( member! Tl/Fl, Activel), F < Fl, befoxet Tl, Task} ), % в том числе
% активных задач Time is F + D, % Время завершения активных задач insert( Task/Time, Activel, Active2, Flnl, Fin2), Cost is Fln2 - Flnl.
s( Tasks * !_/F I Activel] * Fin, Tasks * Actlve2 * Fin, 0) :-
insertidle ( F, Activel, Active2}. % Оставить процессор в состоянии простоя
before! Tl, 12) : - % Согласно правилам упорядочения задание
% Т1 предшествует заданию Т2 prec( Tl, T2) .
before! Tl, 12) :-prec( T, T2), before { Tl, T) .
Insert,- S/A, [T/B j L], [S/A, Т/Б I L], F, F) :- % Списки заданий упорядочены A =< В, !.
insert t S/A, [T/B I L], [T/B | LI], Fl, Г2) :-
insert f S/A, L, U, Fl, F2).
insert t s/A, [] , [s/A] , _, A) .
insertidle( A, [T/B I L], [idle/B, T/B I L] ) :- % Оставить процессор в
A < В, ! , % состоянии простоя до наступления
% следующего, очередного времени завершения
lnsertldle( A, [T/B L], [Т/В 1 L1] ) :-insertidle ( A, L, L1) .
del ( А, [А | Ь] , LI . % Удалить элемент из списка
del( А, [3 [ L] , [Б I L1] ) :-del( A, L, L1).
goal { [] * *_ ) , % Целевое состояние ~ ни одно из заданий не находится % в состоянии ожидания
264 Часть И. Применение языка Prolog в области искусственного интеллекта
% Эвристическая оценка частичного расписания основана на оптимистической оценке % последнего времени завершения данного частично составленного расписания, % дополненного всеми ожидающими заданиями
Ъ{ Tasks * Processors * Fin,- HJ :-
totaltimeC Tasks, Tottime) , % Общая продолжительность ожидающих заданий sumriumC Processors, Ftime, К), % Ftime - сумма значений времени завершения
% для всех процессоров, N - количество этих значений Finall is ( Tottime + Ftime)/N, ( Finall > Fin, !, H is Finall - Fin
H = 0
) .
totaltime( [], 0) .
totaltime( [_/D | Tasks], T) :-totaltiraet Tasks, Tl) , T is II + D.
sumnurti( [] , 0, 0} .
suamum( [_/T I Procs], FT, N) :-sumrmrM Procs, FTlr Hit , II is HI + 1,
FT is FT1 + T.
% Граф предшествования заданий
prec( tl, t4). prec{ tl, t5).prec( tZ, t4). prec( t2, tS). prect t3, t5] . prec( t3, t6). prec( t3r t7>.
* Начальный узел
start( [tl/4, t2/2, t3/2,t4/20, t5/20, t6/ll, t7/ll]* [idle/0, idle/0, idle/0] * 0) .
% Пример запроса: start! Problem), bestfirst ( Problem, Sol).
Проект
Как известно, в целом задачи составления расписания характеризуются комбинаторной сложностью. Описанная выше простая эвристическая функция не может служить достаточно мощным средством управления процессом поиска, Предложите другие функции и проведите с ними эксперименты.