Представление действий
Пример задачи планирования приведен на рис. 17.1. Ее можно решить по методу поиска в пространстве состояний (см. главу 11). Но в данной главе эта задача будет представлена таким образом, что появится возможность явно рассуждать о результатах возможных действий, среди которых планировщик может выбирать наиболее приемлемые.
а | Ь | ||
Рис, 17.1. Проблема планирования в мире блоков — найти последовательность действий, которые позволяют достичь следующих целей: блок з должен стоять на блоке Ь. а блок Ь - на блоке С. Такие действия должны преобразовать начальное состояние (показанное слева) в конечное состояние (справа)
Действия изменяют текущее состояние планируемого мира, вызывая тем самым переход в новое состояние. Но ни одно действие обычно не изменяет все в текущем состоянии; затрагивается только отдельный компонент (компоненты) этого состояния. Поэтому в качественном представлении должна учитываться такая "локализация" результатов действий. Для упрощения рассуждений о подобных локальных результатах действий состояние удобнее всего представлять в виде списка связей, которые в данный момент являются истинными. Безусловно, при этом следует упоминать лишь такие связи, которые касаются данной задачи планирования. Если речь идет о планировании в мире блоков, то подобными связями являются следующие: оп( Block, object) и clear( Object)
В последнем выражении утверждается, что верхняя грань объекта Object открыта (на ней нет других блоков). При планировании в мире блоков такая связь является важной, поскольку блок, подлежащий перемещению, должен быть открытым сверху, а другой блок (или место), на который перемещается этот блок, также должен иметь открытую верхнюю поверхность. Открытый сверху объект obiect может представлять собой блок или место на плоскости. Е данном примере а, Ь и с — блоки, а 1, 2, 3 и '■■ — места. В таком случае начальное состояние мира (см. рис. 17.1} можно представить с помощью следующего списка связей: [ clear( 2), ciear( 4), cleart b), Cleart с), on [ a, I), on( b, 3), on f c, a)]
Обратите внимание на то, что мы проводим различие между отношением и связью. Например, on ( с, а) — это связь, т.е. конкретный экземпляр отношения on, Отношение on, с другой стороны, является множеством всех связей он.
Каждое возможное действие определяется в терминах его предпосылок и результатов. Точнее, каждое действие задается с помощью трех информационных структур.
1. Предпосылки - условия, которые должны соблюдаться в некоторой ситуации для того, чтобы данное действие стало возможным.
2. Список добавления - список связей, установленных данным действием в текущей ситуации; это — условия, которые становятся истинными после выполнения этого действия,
3. Список удаления — список связей, разрушаемых в результате данного действия.
Предпосылки будут определяться с помощью следующей процедуры:
can( Action, Cond)
Эта процедура содержит информацию о том, что действие Action может быть выполнено только в той ситуации, в которой соблюдается условие Cond. Результаты действия определяются следующими процедурами:
где AddReis — список связей, установленных в результате выполнения действия Action. После выполнения действия Action в некотором состоянии к этому состоянию добавляются связи AddRels для получения нового состояния. С другой стороны, DelRels - это список связей, уничтожаемых действием Action. Эти связи удаляются из состояния, к которому применяется действие Action.
В рассматриваемом мире блоков возможно действие только следующего типа: move ( Block, From, ты
где Block - это перемещаемый блок, From - текущая позиция блока, а То - его новая позиция. Полное определение этого действия приведено в листинге 17.1.
384 Часть II.Применение языка Prolog в области искусственного интеллекта
Листинг 17.1. Определение пространства планирования для мира блоков
% Определение действия move ( Block, From, To) в у_мре блоков
I can( Action, Condition!:
% действие Action возможно, если условие Condition является истинным
can( move{ Block, From, To), [ Clear! Block), clear! To), on [ Block, From!] ) :-
is_block( Block) , % Перемещаемый блок
objects To), % To - это блок или место
То \== Block, % Блок ие может быть поставлен сам на себя
object(From) , % From - это блок или место
From \== То, % Перемещение происходит в новую позицию
Block \==From. % Блок не может быть снят сам с себя
% addst Action, Relationships):
% в результате действия Action устанавливаются связи Relationships
adds( move(X,From,To), [ on(xrTo), clear(From)]).
I deletest Action, Relationships):
% в результате действия Action уничтожаются связи Relationships
deletes( move(X,From,To) , [ on (X, Fro.".:), clear(To)]) .
object ( X) : - % X является одним из объектов, если
placet X) % х - место
; 4 или
is_block( X) . 'i x - елок
i Мир блоков
is_block ( а) . is_blockt b) .
is_block( с) .
place ( 1) . place ( 2) . place( 3) . place( 4) .
% Состояние в мире блоков
i
% с
fe a b
% места 123 4
statel ( [ clear(2), clear(4), cleat(b), clearCc), on(a,l), on(b,3), on[c,a) ] ) .
Определение возможных действий для задачи планирования неявно содержит определение пространства всех возможных планов, поэтому такое определение называют также пространством планирования.
Планирование в мире блоков представляет собой традиционную область экспери
ментов по планированию, которая обычно связана с задачей составления программ
для роботов при использовании роботов для построения конструкций из блоков. Но
можно легко найти много примеров задач планирования и в нашей повседневной
жизни. В листинге 17.2 приведено определение пространства планирования для ма
нипулирования фотокамерой. В этой задаче планирования речь идет о подготовке
фотокамеры к работе, т.е. вставке новой пленки и замене аккумулятора в случае не
обходимости. План вставки новой пленки в данном пространстве планирования со-
стоит в следующем: открыть футляр и вынуть фотокамеру, перемотать трую плен-
Глава 17. Планирование 385
ку,открыть отсек для пленки, вынуть старую пленку, вставить новую пленку, закрыть отсек для пленки. Состояние, в котором фотокамера готова для получения снимков, определяется следующим образом:
[ slot_closed< battery), slot_closed{ film), in< battery), ok( battery), in! film), film_at_start, film_unused]
Листинг 17.2. Определение пространства планирования для манипулирования фотокамерой
% Пространство планирования для подготовки фотокамеры к работе
% Открытьфутляр
can{ open_casef [camera__in_case] ) .
adds ( open_case, [camera_o"utside_case] ) .
deletes ( open_case, [camera_in_case]).
% Закрыть футляр
сап ( close_case, [camera_outside_case, slot_closed( film),
slot closed! battery)]) . addM clo~e_case, [earnera_in_case]) . deletesf close_case, icamera_outside_case]).
i Открыть отсек для пленки
cant open_slot( X) , [camera_outside_case, slot_closed( X)]). adds[ cpen_slc::; X) , :slot_open { X)]) . deletes! open_slot ( X) , "!slot_closed ( X) ] ) .
% Закрыть отсек для пленки
cant close_slot( x) , [canera_cutside_case, slot_open{ X)]). adds! close_slot£ x), [slot_closed ( X) ] } . deletes! close_slot( X) , [slot_open( X)]).
I Перемотать одаику
cani rewind, [camera_cutside_case, ln( film), iilm_at_end]). adds [ rewind, [ f iim_at_start] ) . deletes! rewind, [ f ilm_at_end] ) .
% Вынуть аккумулятор или пленку-can ( remove! battery), [slot_open С battery) , in!battery)]). can! remove! film), [slot_open ( film!,in! film), film_at_start]) . adda( remove! x} , (slot_empty( X)]) . deletes! remove* x), [in(X) ] ) .
% Бстазкть новый аккумулятор или пленку
can! insert_new< X) , [slot_open! X!, slot_empty( X)]) .
adds! ir.sert_new; battery) , [in ( battery) , ok ( battery) ]) .
adds [ insert_new( film) , [in( film) , f ilm at_start, film_unused] ) -
deletes! ir.sert_new( x) , [slot_empty{ x) |J.~
% Снять фотографии
can! t»ke_piCtures, [in film), film at_start, fi.lm_unused,
in[ battery), ok< battery), siot_cTosed[ film), slot_closed { battery)]). adds ( take__pictures, [ film_at_endj) . deletes! take_pictures, [film_at_start, film_urmsed] ) .
% Состояние, в котором пленка израсходована, а аккумулятор разряжен * (Примечание. Аккумулятор считается разряженным, потому что связь % ok; battery) ке включена в это состояние.)
statel( [canera_in_case, slot_clOSed( film), slot_closed( battery), inf film!, film_at_endr in E battery)]).
386
Часть II. Применение языка Prolog в области искусственного интеллекта
Цель плана определяется в терминах связей, которые должны быть установлены после его выполнения. Для задачи мира блоков (см. рис. 17.1) задачу можно поставить как следующий список связей: 1 on! а, Ь) , оп( b, с}]
Для задачи с фотокамерой список связей, который гарантирует, что фотокамера готова к съемке, состоит в следующем:
[ in[ film), film at start, film unused, in( battery), ok< battery), Slot_cTo3ed< film)7 slot_closed< battery)]
В приведенном ниже разделе будет показано, как можно воспользоваться таким представлением в процессе, известном как "анализ целей и средств", с помощью которого может быть разработан план.
Упражнения
17.1. Расширьте определение мира прямоугольных блоков, приведенное в листинге 17.1, для включения в него объектов других типов, таких как пирамиды, шары и ящики. Введите соответствующее дополнительное условие "допускает установку в столбик" в отношение сап. Например, установка на пирамиде прямоугольного блока для построения столбика не допускается; шар можно класть в ящик, но не ставить на блок (поскольку он скатится с верхней поверхности блока).
17.2. Определите пространство планирования для задачи с обезьяной и бананом (см. главу 2), в которой применяются действия "walk" (перейти), "push" (передвинуть), "climb" (залезть) и "grasp" (схватить).
Разработка планов с помощью анализа целей и средств
Рассмотрим начальное состояние задачи планирования (см. рис. 17.1). Предположим, что цель состоит в следующем; on ( а, b}. Задача планировщика заключается в том, что он должен найти план {т.е. последовательность действий), который позволяет достичь этой цели. Типичный планировщик формирует свои рассуждения, как описано ниже.
1. Найти действие, которое позволит достичь состояния on ( а, Ь). Изучение от
ношения adds показывает, что такое действие имеет форму
move( a, From, b)
для любой позиции From. Соответствующее действие, безусловно, должно быть частью плана, но его не всегда возможно осуществить немедленно в указанном начальном состоянии.
2. Теперь создадим возможность выполнения действия move ( a, From, Ь). Рас
смотрим отношение сап, чтобы найти предпосылки этого действия. Они состо
ят в следующем:
[ clear( a), clearf b), on( a. From)]
В этом начальном состоянии уже имеются связи clear( b) и on ( a, From) (где From = 1), но нет связи clear { а) . Теперь планировщик сосредоточивается на связи clear ( а) как новой цели, которая должна быть достигнута.
3. Снова рассмотрим отношение adds, чтобы найти действие, позволяющее дос
тичь цели clear { а) . Это - любое действие в следующей форме:
move ( Block, a, To!
Предпосылки этого действия состоят в следующем: [ clear С Block), clear (To), on; Block, a}]
Глава 17. Планирование
Эти предпосылки удовлетворяются в рассматриваемой начальной ситуации, если имеет место:
Block = с -л То = 2
Поэтому в начальном состоянии может быть выполнено действие move ( с, а, 2), которое приводит к новому состоянию. Это новое состояние получено из начального состояния следующим образом:
• удаление из начального состояния всех связей, которые разрушаются в результате действия move ( с, а, 2);
• добавление в итоговый список всех связей, которые создаются в результате этого действия.
При этом создается такой список:
[ clear[ a), clear { Ь), clear [ с ) , clea{ А), o n { а, 1), on ( b, 3), о п ( с-, 2)]
Теперь может быть выполнено действие move ( а, 1, Ь), в результате которого достигается конечная цель on { а, Ь). Найденный план можно представить в виде следующего списка:
[ move ( с, а, 2), move ( а, 1, b) ]
Такой стиль формирования рассуждений называется анализом целей и средств. В качестве средств рассматриваются возможные действия, а в качестве целей — достигаемые состояния. Обратите внимание на то, что в приведенном выше примере правильный план был найден немедленно, без какого-либо перебора с возвратами. Таким образом, этот пример показывает, что данный способ формирования рассуждений о целях и результатах действий ориентирует процесс планирования в правильном направлении. К сожалению, нельзя утверждать, что при использовании такого способа всегда можно избежать перебора с возвратами. Справедливо противоположное утверждение, что комбинаторная сложность и поиск — это типичные атрибуты планирования.
Принцип планирования с применением анализа целей и средств иллюстрируется на рис. 17.2. Он может быть сформулирован, как описано ниже.
Condition GoalGoals
O |
PrePlar j^~nAc lion /"""ч PostPlan----------- /■—\
---------- 4J———<J----------- -O
State MnlSialel MidStote2 FinalStale
Рис.. 17.2. Принцип планирования с применением анализа целей и средств
Чтобы найти в состоянии State решения для списка целей Goals, ведущие к состоянию FinalState, необходимо применить описанную ниже процедуру.
Если все цели Goals в состоянии State являются истинными, то FinalState = State. В противном случае выполнить следующие действия.
1. Выбрать в списке Goals цель Goal, для которой все еще не найдено решение.
2. Найти действие Action, которое добавляет цель Goal к текущему состоянию.
3. Обеспечить возможность выполнения действия Action, решив задачу создания предпосылок Condition действия Action, что приводит к созданию промежуточного состояния MidStatel.
4. Применить действие Action к состоянию MidStatel и получить состояние Midstate2 (в состоянии MidState2 цель Goal является истинной).
5. Найти решения для целей в списке Goals в состоянии MidState2, что приведет к конечному состоянию FinalState.
388 Часть II. Применение языка Prolog в области искусственного интеллекта
Этот принцип может быть реализован в программе на языке Prolog, приведенной в листинге 17.3, в виде следующей процедуры: plan( State, Goals, elan, FinalState)
где State и FinalState начальное и конечное состояния плана, Goals — список достигаемых целей, a Plan — список действий, позволяющих достичь этих целей. Следует отметить, что в этой программе планирования предполагается использовать определение пространства планирования, в котором все действия и цели являются полностью конкретизированными, т.е. не содержат каких-либо переменных. Для переменных требуется более сложная организация программы. Эта тема рассматривается ниже.
Листинг 17.3. Простой планировщик с применением анализа целей и средств
% Простой планировщик с применением анализа целей и средств % plant State, Goals, Plan, FinalState)
plant State, Goals, [], State! ; - % План пуст
satisfied! State, Goals). % E состоянии Stale цели Goals истинны
& На основании того, какой способ декомпозиции плана на этапы используется
% в предикате cone, можно считать, что поиск плана Preplan, создающего
'.- предпосылки для действия Action, осуществляется в режиме поиска в ширину,
% Ко длина остальной части плана не ограничена, и достижение целей происходит
% по принципу поиска в глубину
-Ian! State, Goals, Plan, FinalState) :-
conc( Preplan, [Action ] PostPlan], Plan), % Выполнить декомпозицию плана
select ( State, Goals, Goal), Is Выбрать цель
achieves; Action, Goal), 4 Соответствующее действие
can( Action, Condition),
plant State, Condition, Preplan, MidStatel), \ Создать предпосылки для
% действия Action
apply! MidStatel, Action, MidState2), \ Применить действие Action
plan( Mid5tate2, Goals, PostPlan, FinalState). % Достичь остальных целей
% satisfied! State, Goals}: в состоянии State цели Goals являются истинными
satisfied ( State, [] ) .
satisfied ( State, (Goal | Goals!) :-
member ( Goal, State) , satisfied( State, Goals) .
select( State, Goals, Goal) :-
membert Goal, Goals) ,
not member; Goal, State) , % Цель Goal еще не достигнута
% achieves! Action, Goal) : цель Goal - это список добавления для действия Action
achieves! Action, Goal) :-adds! Action, Goals) , member! Goal, Goals) .
% apply! State, Action, NewState):
% действие Action, выполненное в состоянии State, создает
I новое состояние NewState
apply! State, Action, NewState) :-deletes! Action, DelList), delete_ali( State, DelList, Statel), !, adds! Action, AddList) , cone! AddList, Statel, NewState),
% delete_all{ LI, L2 , Diff) :
Глава 17. Планирование
% Diff - это разность множеств, которыеопределены Б виде списков L1 и Ы
delete_all< [ ] ,_, []).
delete all I [X | LI], L2, Diff) :-member! X, L2), !, deiete_ailf Ll, L2, Diff).
delete_all(PJ.1®: L2, [X 'Diff]) :-
Теперь этим планировщиком можно воспользоваться для поиска плана по установке блока а на блок Ь, начиная с начального состояния, показанного на рис. 17.1, следующим образом:
?- Start - [ clear( 2), clear{ 4) , Clear( Ь), clear) с), оп( а, 1), on ( Ь, 3),
oni с, а) ] , plan! Start, ( on { а, b)],Plan, FinState).
Plan - [ move ( с, a, 2), nove { a, 1, to}1
FinState- [ on! a, b), clear( 1), on[ c, 2).clear{ a), clear [ 4), clear{ c),
on fb, 3 ) ]
Для того чтобы применить данный планировщик в мире пользователей фотокамеры, представим себе начальное состояние, в котором аккумулятор разряжен, а пленка в фотокамере уже использована. Ниже приведены запросы для поиска плана замены аккумулятора, FixBattery, и плана подготовки фотокамеры для получения снимков, FixCamera.
?- Start = [ camera in case, slot closed! film;, slot closed ( battery),
in( film), film at e"nd," in{ battery)],
plan( start, [ ok ("battery)!, FixBattery, _) .
FixBattery = [ open_case, open_slot( battery), remove ( battery),
?-SStarte= [ acame7a in case, slot c.lo5ed( film), slot closed( battery),
in< film), film_at_e-nd,-in[ battery)],
can [ takejictures, CameraReady), 1 Условие для фотографирования
plant Start, CameraReady, FixCamera, FinState).
CameraReady = [ in ( film), filM_at_Start, film_unused, in! battery),
ok( battery), slot closed( film), slot closed* battery)]
FixCamera - [ open_case, rewind, oPen_slot< film), remove! film),
insert new! film), open slot! battery), remove! battery),
insert>w( battery), close slot ( film,,, close slot! battery)]
Finstate = [ slot_closed( battery), slot closed! film), in! battery),
okf battery), in{ film), film_at_start, film_unused, camera_outside_case;
Весь этот процесс прошел очень гладко, и в обоих случаях найдены кратчайшие планы. Но в дальнейших экспериментах с этим планировщиком обнаруживаются некоторые сложности. Недостатки рассматриваемой программы и возможные пути ее усовершенствования описаны в следующем разделе.