Regresija ciljev

Comments

Transcription

Regresija ciljev
Planiranje z regresijo ciljev
Tu vam bomo na kratko predstavili metodo planiranja z regresijo ciljev. Ta dokument vam bo služil
tako kot uvod v domačo nalogo kot za lažje razumevanje metode.
V klasični metodi sredstva-cilj (angl. means-ends) se posamezni cilji rešujejo lokalno in videli smo, da
nam ta lokalnost mnogokrat onemogoča poiskati najkrajšo rešitev za doseganje cilja. Temu rečemo
tudi Sussmanova anomalija. Regresija ciljev se problema loti globalno oz. poskuša doseči vse cilje
hkrati / vzporedno in s tem omogoča iskanje optimalnih planov.
Osnovna ideja algoritma je, da si v vsakem koraku iz množice ciljev najprej izbere cilj in ustrezno
akcijo, s katero bi dosegel ta cilj. V naslednjem korako se vprašamo, kaj vse bi moralo veljati, da bi po
izbrani akciji vsi cilji (in ne samo izbrani) bili doseženi. Odgovor na to vprašanje je v regresiji ciljev, ki
iz prejšnjih ciljev, pogojev za akcijo in učinkov akcije izračuna nove cilje. Zdaj nas seveda zanimajo le
ti novi cilji, če jih uresničimo, bomo potem z izbrano akcijo ršili vse prejšnje cilje. Ta postopek se
rekurzivno ponavlja dokler ne dobimo množice ciljev, ki so že izpolnjeni v začetni poziciji. Kako izbira
cilje in akcije je odvisno od vrstnega reda preiskovanja. Mi bomo predpostavili, da gre po vrsti kot so
zapisani v seznamu / množici. Na začetku so cilji Goals(0) enaki končnim ciljem problema.
Algoritem (npr. na nivoju i):
(1) Če so vsi cilji v Goals(i) resnični v začetnem stanju, potem končamo in izvedemo vse akcije v
obratnem vrstnem redu.
Včasih se zgodi, da Goals(i) nikakor ne bo možno doseči – to je nemogoče. V takem primeru
se vrnemo v prostoru stanj in poskušamo najti rešitev po drugi poti.
(2) V drugem primeru izberemo cilj iz Goals(i), izberemo akcijo A, ki doda ta cilj in regresiramo
cilje po naslednji formuli:
Goals(i+1) = Goals(i) U Cond (A) – Adds(A)
Poleg tega moramo pri akciji paziti še, da A ne sme izbrisati trenutnega cilja (v del(A) ni cilja iz
Goals(i), oz. presek del(A) in Goals(i) je prazna množica).
Za zagotavljanje najkrajše rešitve bomo uporabljali iterativno poglabljanje.
V nadaljevanju bomo najprej opisali domeno kock in potem pokazali en primer reševanja z regresijo
ciljev. Povsod bomo uporabljali angleške oznake, ki so kar enake (ali zelo podobne) kot v
implementaciji planiranja v Pythonu.
Opis domene
Imamo naslednje začetno stanje v svetu kock:
c
a
1
b
2
3
4
To stanje opišemo z relacijami:
Initial_state = {clear(2), clear(4), clear(b), clear(c), on(a,1), on(b,3), on(c,a)}
Naši cilj v tej domeni bo sestaviti stolp, kjer je c spodaj in a na vrhu:
Goals = {on(a,b), on(b,c)}
Na voljo imamo samo eno akcijo:
move(X, From, To),
ki jo lahko izvedemo pri naslednjih pogojih:
Conditions(move) = {clear(X), clear(To), on(X,From)}
Po izvedbi akcije se v naše stanje dodajo naslednje relacije:
adds(move) = {clear(From), on(X,To)}
in izbrišejo:
dels(move) = {clear(To), on(X,From)}
Poleg osnovne definicije akcije bomo dodali še omejitve pri določanju vrednosti spremenljivk, saj s
tem lahko občutno zmanjšamo prostor preiskovanja.
Constraints(move) = {X != From, X != To, To != From, block(X)}
Primer reševanja z regresijo ciljev
Naj bo največja globina iskanja (trenutni korak v iterativnem poglablanje) 3, kar pomeni, da iščemo
rešitev v največ treh korakih. V manj korakih rešitve ne bi našli.
(1) Ali so cilji {on(a,b),on(b,c)} izpolnjeni v začetni poziciji? NE!
(2) Izberemo cilj: on(a,b)
akcija: move(a, From, b)
conditions: clear(a), clear(b), on(a,From), spremenljivke: From = 1
adds: clear(1), on(a,b)
dels: clear(b), on(a,1)
Akcijo lahko izvedemo, ker dels ne vsebuje cilja!
Regresija ciljev: Goals(1) = Goals(0) U P(A) – adds(A)
= {on(a,b),on(b,c)}U{clear(a),clear(b),on(a,1)}-{clear(1),on(a,b)}
= {clear(a), clear(b), on(a,1),on(b,c)}
(1) Ali so novi cilji Goals(1) = {clear(a), clear(b), on(a,1),on(b,c)} izpolnjeni v začetni poziciji? NE!
(2) Izberemo cilj: clear(a) iz Goals(1)
akcija: move(X, a, To)
conditions: clear(X), clear(To), on(X,a), vr. spremenljivk: X=c, To=2
adds: clear(a), on(c,2)
dels: clear(2), on(c,a)
Akcijo lahko izvedemo, ker clear(2) in on(c,a) nista v trenutni množici ciljev Goals(1)!
regresija: Goals(2) = Goals(1) U P(A) – adds(A)
= {clear(a), clear(b), on(a,1),on(b,c)} U {clear(c), clear(2), on(c,a)} – {clear(a), on(c,2)}
= {clear(c), clear(2), on(c,a), clear(b), on(a,1), on(b,c)}
Tu ustavimo iskanje in se vračamo po prostoru stanj nazaj, ker cilj ni izvedljiv! Ne moremo
hkrati doseči ciljev on(b,c) in clear(c)!
Algoritem bi zdaj poskušal druge vrednosti za spremenljivke X in To:
a) X=c, To = 4
b) X=c, To = b
c) X=c, To = 1, itd.
(Kako dejansko algoritem poskuša različne akcije, boste dobro spoznali, ko boste analizirali
delovanje programa za planiranje)
Vendar nič od tega nam ne bi dosti pomagalo, nikdar ne bi našli rešitve v treh korakih ali
manj. Vrnemo se še en korak nazaj: izbrati moramo nov cilj!
(3) Izberemo cilj: on(b,c) iz Goals(1)
akcija: move(b,From,c)
conditions: clear(b), clear(c), on(b,From), vr. spremenljivk: From = 3
adds: clear(3), on(b,c)
dels: clear(c), on(b,3)
Ni relacije v dels, ki bi bila hkrati tudi v trenutnih ciljih, torej lahko izvedemo akcijo!
regresija: Goals(2) = Goals(1) U P(A) – adds(A) =
= {clear(a), clear(b), on(a,1),on(b,c)} U {clear(b), clear(c), on(b,3)} – {clear(3), on(b,c)}
= {clear(a), clear(b), clear(c), on(a,1), on(b,3)}
(1) Ali so cilji {clear(a), clear(b), clear(c), on(a,1), on(b,3)} resnični v začetnem stanju? NE
(2) Izberemo cilj: clear(a)
akcija: move(X,a,To)
conditions: clear(X), clear(To), on(X,a), vr. spremenljivk: X=c, To=2
adds: clear(a), on(c,2)
dels: clear(2), on(c,a)
dels se ne tepe s trenutnimi cilji v Goals(2), gremo naprej.
Regresija: Goals(3) = Goals(2) U P(A) – adds(A) =
= {clear(a),clear(b), clear(c),on(a,1),on(b,3)}U{clear(c),clear(2), on(c,a)}–{clear(a), on(c,2)}
= {clear(b), clear(c), on(a,1), on(b,3), clear(2), on(c,a)}
(1) Ali so trenutni cilji Goals(3) resnični v začetnem stanju? DA! Zdaj lahko izvajamo
akcije v obratnem vrstnem redu.
Rešitev planiranja:
a. move(c,a,2)
b. move(b,3,c)
c. move(a,1,b)