12.6. Folytonos tervkészítés

Ebben az alfejezetben olyan ágenst tervezünk, amely meghatározatlanul sokáig kitart egy környezetben. Így ez nem egy „problémamegoldó”, ami egyetlen célt szeretne elérni és ezt tervezi, és addig cselekszik, amíg a célt el nem éri, hanem folyamatosan változó célok, tervkészítési és cselekvési fázisok sorozatát éli meg. Ahelyett hogy a tervkészítőt és a cselekvésmonitorozót mint különálló, de egymásnak eredményeket szolgáltató folyamatokat tekintetnénk, a folytonos tervkészítő ágensben (continuous planning agent) ezeket egyetlen folyamatként képzeljük el.

Az ágensre mindig úgy gondolunk, mint ami része egy terv végrehajtásának, az élete nagy tervének. Cselekvései tartalmazzák a végrehajtásra készen álló terv lépéseinek végrehajtását, a nyitott előfeltételek kielégítésére vagy a konfliktusok feloldására szolgáló tervfinomítást, a végrehajtás során nyert új információk fényében a terv módosítását. Nyilvánvaló, hogy amikor először új célt formál, az ágensnek nincsenek végrehajtásra kész cselekvései, ezért egy kis időt a részleges terv elkészítésével tölt. Nagyon is lehetséges azonban, hogy az ágens a terv teljes befejezése előtt elkezdi a végrehajtást, különösen ha független részcélokat kell elérni. A folytonos tervkészítő ágens folyamatosan monitorozza a világot, az új megfigyelések alapján módosítja ennek modelljét, még akkor is, ha elképzelései még mindig változnak.

Először egy példán haladunk végig, majd bemutatjuk az ágens programját, amelyet FOLYTONOS-RRT-ÁGENS-nek nevezünk, mivel a tervezett cselekvések reprezentálására részben rendezett terveket használ. Hogy a leírást egyszerűsítsük, teljesen megfigyelhető környezetet feltételezünk. Ugyanezen technikák kiterjeszthetők a részben megfigyelhető esetre is.

A példánk a kockavilág problémakörből származik (lásd 11.1. alfejezet). A kiinduló állapot a 12.15. (a) ábrán látható. A Mozgat(x, y) cselekvésre van szükségünk, ami az x kockát az y kockára mozgatja, amennyiben mindketten szabadok. A cselekvés sémája:

Cselekvés(Mozgat(x, y),

Előfeltétel:Tiszta(x) ∧ Tiszta(y) ∧ Rajta(x, z)

Következmény:Rajta(x, y) ∧ Tiszta(z) ∧ ¬Rajta(x, z) ∧ ¬Tiszta(y)

Az ágensnek először egy célt kell megfogalmaznia. Itt nem tárgyaljuk a célkialakítást, helyette feltételezzük, hogy az ágensnek valahogy megmondták (vagy saját maga eldöntötte), hogy a Rajta(C, D) ∧ Rajta(D, B) célt kell elérnie. Az ágens ehhez a célhoz kezdi a tervezést. Ellentétben minden másik ágensünkkel, amelyek lekapcsolják érzékelőiket, amíg a tervkészítő egy teljes megoldást nem ad a problémára, a folytonos tervkészítő ágens inkrementálisan épít egy tervet, ahol a terv minden bővítése egy korlátos időtartamot vehet igénybe. Minden bővítés után az ágens egy NoOp cselekvést ad vissza, és ellenőrzi az érzékeléseit. Feltételezzük, hogy az érzékelt adatok nem változnak, és az ágens gyorsan megalkotja a 12.16. ábrán látható tervet. Vegyük észre, hogy bár mindkét cselekvés előfeltételeit teljesíti az Indít állapot, van egy követési megkötés, ami a Mozgat(D, B) cselekvést a Mozgat(C, D) elé helyezi. Erre azért van szükség, hogy a Tiszta(D) igaz maradjon, amíg a Mozgat(D, B) befejeződik. A folytonos tervkészítési folyamat alatt az Indít mindig az aktuális állapot címkéje. Az ágens minden cselekvés után módosítja az állapotot.

A terv készen áll a végrehajtásra, de még mielőtt az ágens cselekedhetne, a környezet közbeszól. Egy külső ágens (talán az ágens tanítója vált türelmetlenné) a (d) kockát a (b)-re helyezi, a világ most a 12.15. ábra (b) állapotának felel meg. Az ágens ezt érzékeli, észreveszi, hogy a Tiszta(B) és a Rajta(D, G) már nem igaz az aktuális állapotban, és ennek megfelelően módosítja az aktuális állapot modelljét. Az okozati kapcsolatok, amelyek a Mozgat(D, B) cselekvés Tiszta(B) és Rajta(D, G) előfeltételeit adták, már nem helyesek, el kell távolítani őket a tervből. Az új tervet a 12.17. ábra mutatja. Minden pillanatban az Indít az aktuális állapotot reprezentálja, így ez az Indít különbözik az előző ábra hasonló állapotától. Vegyük észre, hogy a terv most nem teljes: a Mozgat(D, B) előfeltételei közül kettő nyitott, és a Rajta(D, y) most nem példányosított, mert már nincs okunk feltételezni, hogy a lépés a G-ről indul.

Az ágens most kihasználhatja a „segítő” közbeavatkozást, észrevéve, hogy a okozati kapcsolat helyettesíthető az Indít-ból a Befejez állapotba mutató direkt kapcsolattal. Ezt a folyamatot az okozati kapcsolat kiterjesztésének (extension) nevezzük, és akkor alkalmazzuk, amikor egy feltétel egy későbbi helyett egy korábbi lépéssel biztosítható, új ütközés okozása nélkül.

12.15. ábra - Az állapotok sora, amint a folytonos tervkészítő ágens megpróbálja a (d)-nek megfelelő Rajta(C, D) ∧ Rajta(D, B) célállapotot elérni. A kiinduló állapot az (a). A (b) állapotnál egy másik ágens közbelépett és (d)-t (b)-re helyezte. A (c) állapotban az ágens a Mozgat(C, D) cselekvést hajtotta végre, ami sikertelen volt, (c)-t az (a)-ra ejtette. Újrapróbálja a Mozgat(C, D) cselekvést, amivel eléri a (d) célállapotot.
Az állapotok sora, amint a folytonos tervkészítő ágens megpróbálja a (d)-nek megfelelő Rajta(C, D) ∧ Rajta(D, B) célállapotot elérni. A kiinduló állapot az (a). A (b) állapotnál egy másik ágens közbelépett és (d)-t (b)-re helyezte. A (c) állapotban az ágens a Mozgat(C, D) cselekvést hajtotta végre, ami sikertelen volt, (c)-t az (a)-ra ejtette. Újrapróbálja a Mozgat(C, D) cselekvést, amivel eléri a (d) célállapotot.

12.16. ábra - A folytonos tervkészítő ágens által készített kiinduló terv. A terv egyelőre nem különbözik egy átlagos részben rendezett tervkészítő által készítettől.
A folytonos tervkészítő ágens által készített kiinduló terv. A terv egyelőre nem különbözik egy átlagos részben rendezett tervkészítő által készítettől.

12.17. ábra - Miután valaki más elmozdította a D kockát a B-re, a Tiszta(B) és a Rajta(D, G) biztosítására szolgáló kapcsolatokat eldobjuk, ami ezt a tervet eredményezi
Miután valaki más elmozdította a D kockát a B-re, a Tiszta(B) és a Rajta(D, G) biztosítására szolgáló kapcsolatokat eldobjuk, ami ezt a tervet eredményezi

Miután a régi Mozgat(D, B) és Befejez közötti okozati kapcsolatot eltávolítottuk, a Mozgat(D, B) továbbiakban nem forrása egyetlen okozati kapcsolatnak sem. Ez most egy redundáns lépés (redundant step). Minden redundáns lépést és bármely ezt biztosító kapcsolatot kitörlünk a tervből. Ez a 12.18. ábrán látható tervet eredményezi.

Most a Mozgat(C, D) lépés készen áll a végrehajtásra, hiszen az Indít lépés kielégíti minden előfeltételét, nincs szükség más megelőző lépésre, és nem ütközik a terv egyetlen másik kapcsolatával sem. A lépést eltávolítjuk a tervből, és végrehajtjuk. Sajnos az ágens ügyetlen, és a C-t az A-ra ejti a B helyett, ami a 12.15. ábra (c) állapotát eredményezi. Az új tervállapotot a 12.19. ábra mutatja. Vegyük észre, hogy bár most nincsenek cselekvések a tervben, a Befejez lépésnek még mindig van egy nyitott feltétele.

Az ágens úgy dönt, hogy a nyitott feltételhez készít tervet. Újra a Mozgat(C, D) elégíti ki a célfeltételt. Ennek előfeltételeit az Indít lépésből induló új okozati kapcsolatok teljesítik. Az új tervet a 12.20. ábra mutatja.

12.18. ábra - A Mozgat(C, D) által létrehozott kapcsolatot helyettesítettük az Indít kapcsolatával, a most már redundáns Mozgat(D, B) lépést pedig elhagytuk
A Mozgat(C, D) által létrehozott kapcsolatot helyettesítettük az Indít kapcsolatával, a most már redundáns Mozgat(D, B) lépést pedig elhagytuk

12.19. ábra - A Mozgat(C, D) végrehajtása és a tervből való eltávolítása után az Indít lépés következményei azt a tényt tükrözik, hogy a C a várt D helyett az A kockára került. A Rajta(C, D) cél előfeltétel még minding nyitott.
A Mozgat(C, D) végrehajtása és a tervből való eltávolítása után az Indít lépés következményei azt a tényt tükrözik, hogy a C a várt D helyett az A kockára került. A Rajta(C, D) cél előfeltétel még minding nyitott.

12.20. ábra - A nyitott előfeltételt a Mozgat(C, D) ismételt hozzáadásával oldjuk fel. Vegyük észre az előfeltételekhez szükséges új kapcsolatokat.
A nyitott előfeltételt a Mozgat(C, D) ismételt hozzáadásával oldjuk fel. Vegyük észre az előfeltételekhez szükséges új kapcsolatokat.

A Mozgat(C, D) újra készen áll a végrehajtásra. Ez alkalommal működik, ami a célállapotot eredményezi, melyet a 12.15. ábra (d) része mutat. Miután egy lépést elhagyunk a tervből, a Rajta(C, D) célfeltétel újra nyitottá válik. Mivel az Indít lépést frissítettük, hogy tükrözze az új állapotot, a célfeltétel azonnal kielégíthető egy kapcsolattal az Indít lépésből. Ez az események normális folyása, ha egy cselekvés sikeres. A végleges tervállapotot a 12.21. ábra mutatja. Mivel az Indít lépés az összes célfeltételt kielégíti, és nincsenek hátralevő cselekvések, az ágens szabadon eltávolíthatja a Befejez állapot céljait, és új célokat fogalmazhat meg.

12.21. ábra - A Mozgat(C, D) végrehajtása és tervből eltávolítása után a Rajta(C, D) megmaradt nyitott feltételt az Indít lépésből induló okozati kapcsolat hozzáadásával oldjuk fel. A terv most teljes.
A Mozgat(C, D) végrehajtása és tervből eltávolítása után a Rajta(C, D) megmaradt nyitott feltételt az Indít lépésből induló okozati kapcsolat hozzáadásával oldjuk fel. A terv most teljes.

Ebből a példából látható, hogy a folytonos tervkészítés nagyban hasonlít a részben rendezett tervkészítéshez. Minden iterációban az algoritmus talál valami tervsérülésnek (plan flaw) nevezett javítanivalót a tervben, és megjavítja. A részben rendezett tervkészítő algoritmus egy sérüléseltávolító algoritmusnak tekinthető, ahol a kétféle sérülés a nyílt előfeltétel és az okozati ütközés lehet. A folytonos tervkészítő ágens másrészről sérülések egy jóval szélesebb körét kezeli:

  • Hiányzó cél: az ágens eldöntheti, új célt vagy célokat ad a Befejez állapothoz. (Folytonos tervkészítésben értelmesebb lenne a Befejez állapot nevét Örökkévalóság-ra és az Indít-ét Aktuális-ra változtatni, de ragaszkodunk a hagyományokhoz.)

  • Nyílt előfeltétel: egy okozati kapcsolatot ad a nyílt előfeltételhez, egy meglévő vagy egy új cselekvést választva (mint a részben rendezett tervkészítőben).

  • Okozati ütközések: adott az ok-okozati kapcsolat és a ¬p következményű C cselekvés. Válasszunk az ütközés feloldásához egy rendezési megkötést vagy egy változómegkötést (mint a részben rendezett tervkészítésben).

  • Nem támogatott kapcsolat: ha van egy ok-okozati kapcsolat, ahol a p nem igaz az Indít állapotban, akkor távolítsuk el a kapcsolatot. (Ez megóv minket attól, hogy végrehajtsunk egy olyan cselekvést, melynek előfeltételei hamisak.)

  • Redundáns cselekvések: ha egy A cselekvés nem eredményez ok-okozati kapcsolatokat, akkor távolítsuk el a kapcsolataival együtt. (Ez lehetővé teszi számunkra, hogy kihasználjuk a szerencsés helyzeteket.)

  • Végrehajtatlan cselekvés: ha egy (a Befejez-től eltérő) A cselekvésnek, melynek az előfeltételeit az Indít kielégíti, nincs (az Indít-tól eltérő) cselekvés elé sorolva, és nem ütközik okozati kapcsolatokkal, akkor távolítsuk el A-t és ok-okozati kapcsolatait, majd adjuk vissza mint a végrehajtandó cselekvést.

  • Szükségtelen történelmi cél: ha nincsenek nyílt előfeltételek és nincsenek a tervben cselekvések (azaz minden ok-okozati kapcsolat közvetlen az Indít-ból a Befejez állapotba mutat), akkor elértük az aktuális célhalmazt. Távolítsuk el a célokat és az ezekbe mutató kapcsolatokat, hogy új célokat tegyünk lehetővé.

A 12.22. ábra a Folytonos-RRT-Ágens-t mutatja be. Ennek ciklusa az „érzékelés, eltávolítás a folyamatból, cselekvés”. Tudásbázisában egy állandó tervet tart, és minden lépésben eltávolít egy folyamatot ebből a tervből. Ezután cselekszik (bár gyakran ez a cselekvés a NoOp) és ismétli a ciklust. Ez az ágens az 12.5. szakasz - Végrehajtás monitorozása és újratervezése részben tárgyalt újratervező ágenshez felsorolt problémák nagy részét képes kezelni. Nevezetesen valós időben cselekszik, kezeli a kedvező helyzeteket, saját célokat fogalmaz meg, és kezeli a váratlan eseményeket, melyek a jövőbeli terveket érintik.

12.22. ábra - A FOLYTONOS-RRT-ÁGENS, egy folytonos, részben rendezett tervkészítő ágens. Egy érzékelés után az ágens eltávolít egy lépéssorozatot a folytonosan javított tervéből, és visszaad egy cselekvést. Gyakran számos cselekvéssor-eltávolító tervkészítési lépésre van szükség, mialatt csak a NoOp-ot adja vissza, mielőtt készen állna egy valós cselekvés végrehajtására.
A FOLYTONOS-RRT-ÁGENS, egy folytonos, részben rendezett tervkészítő ágens. Egy érzékelés után az ágens eltávolít egy lépéssorozatot a folytonosan javított tervéből, és visszaad egy cselekvést. Gyakran számos cselekvéssor-eltávolító tervkészítési lépésre van szükség, mialatt csak a NoOp-ot adja vissza, mielőtt készen állna egy valós cselekvés végrehajtására.