Regresija ciljev
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)