MI PDDL házi segédlet

A VIK Wikiből
Ugrás a navigációhoz Ugrás a kereséshez

Ez az oldal a korábbi SCH wiki-ről lett áthozva. Az eredeti változata itt érhető el.

Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor kérlek javíts rajta egy rövid szerkesztéssel.

Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót


Gyűjtsük ide azokat a tanácsokat, bugfixeket, amik megkönnyítik a háziírást.

Hivatalos FAQ

http://www.mit.bme.hu/oktatas/targyak/vimia313/tervkeszitesi-feladat-faq

Régi FAQ: http://portal.mit.bme.hu/oktatas/hf/vimia313/faq.php

Tanácsok

  • típusoknál, leszármaztatásnál pontosan egy szóközt kell tenni a '-' jel elé és után
  • PDF-ből copy-paste-elés során figyelni kell rá, hogy a szóköz szóköz legyen, a mínuszjel pedig mínuszjel. A Word hajlamos többféle kötőjelet használni, ami bekeverhet.
  • öröklést csak egybe, sose külön külön, mert elvileg mindkettő jó, gyakorlatilag nem
    • (:types cargo - object city - object)
      helyett
      (:types cargo city - object)
  • ugyanígy az action-ök paraméterlistáiban is
    • :parameters (?c – cargo ?from ?to - cargocontainer)
  • a változónév ne egyezzen a típusnévvel
    • ?cargo - cargo
      helyett
      ?c - cargo
  • ne használj nagybetűs típusneveket
    • ?c - Cargo
      helyett
      ?c - cargo
  • a változót jelentő kérdőjel után nincs szóköz, mert konstansnak nézi a változódat
    • ? c
      helyett
      ?c

Bugfixek

Probléma:

domain.pddl: syntax error in line 16, 'CARGO': action definition is not correct

Megoldás:

Meg kell nézni, hogy a szóközök száma a mínusz előtt és után pontosan 1 db-e és hogy a leszármaztatást jelző mínuszjel tényleg mínuszjel-e és nem valami Word-ös kötőjel.


Probléma:

predicate IN is declared to use unknown or empty type CARGOCONTAINER

Megoldás:

  • Ellenőrizd a szóközöket és mínuszjeleket a fentiek szerint
  • Nézd meg, hogy jól építetted-e föl a típushierarchiát
  • Gondot okozhat az is, hogy az adott típusból nem létezik példány (mert pl. csak a leszármazottakat használod), ekkor célszerű lehet létrehozni egy példányt még ha nem is használod fel.

-- Velias - 2008.12.14.


Probléma:

unknown constant TO in literal EQ. check input files

Megoldás: Nálam ez a sor okozta, szóköz volt a to előtt:

(not (= ?from, ? to))

És így javítottam:

(not (= ?from, ?to))

Ez ugyanaz a hiba, mint a hivatalos FAQ 17-es kérdése. Az EQ az az "=" predikátumot jelenti.

-- Böbe - 2011.11.16.

Numerikus változók, a :fluents

A tárgyhonlapon és a segédletben is azt írják, hogy a :fluents használata nem elvárás, nincs rá szükség a házikban. Ennek ellenére nem egy házi leírásában szerepelnek ilyen kitételek, mint pl. "[A szeméttelep] 20 adag szemét tárolására alkalmas", vagy "egy vonatnak maximum 7 kocsija lehet". Ezeket "elméletben" le lehet írni predikátumokkal, de gyakorlatban kínszenvedés.

A nagyobbik gond az, hogy az LPG, amiben dolgozni kell, egy bughalmaz, amihez (2010-ben) hat éve senki nem nyúlt hozzá. Ezért írtam ezt a kis segédletet, hogy másoknak ne kelljen végigszenvedni (vagy legalább kisebb mértékben).


Exception: STATUS_ACCESS_VIOLATION vagy linux alatt Segmentation fault

Definiáltál egy numerikus változót, de nem adtál meg :metric-et a problem.pddl-ben.
Ha nincs változód, amire optimalizálni szeretnél, akkor is meg kell adnod valamit (teljesen mindegy, hogy mit).

Vagy például definiáltál egy :action-t :effect nélkül.


Generation of neighborhood for EQUAL_OP not yet implemented

A :goal megadásakor nem használhatsz = műveletet. Használj helyette "<= és >=" -t, azaz:

(and (<= (valtozo) 5)
	  (>= (valtozo) 5))

Operator not yet supported in expression evaluation

precondition részben jöhet elő, ha összeadunk/kivonunk/... Véletlenszerűen jön elő, pl. a (+ 1 1)-et megeszi, a (+ 1 2)-t már nem.

Ezt nem tudtam megoldani, ha találsz megoldást, szívesen várjuk.
Addig is próbáld másképpen értelmezni a feladatot.


op ACTION-NAME has illegal precondition
LPG: this is an ADL problem!
can't be handled by this version.

precondition részben valami hasonlót adtál meg:
(not (= (val) 0))

vagy

(not (<= (val1) (val2)))

Azaz egy not-on belüli összehasonlítást. "not <=" helyett írhatsz ">"-t, "not =" helyett "!="-t.


Computing mutex... és itt lefagy, ki kell lőni

Ezzel nem jutottam semmire, én átszerveztem a saját programomat és valahogy megoldódott...

Itt egy példakód, ami előhozza:

"Egy szobát akkor tudunk kitakarítani, ha üres (benne lévő dolgok száma 0).
Rendet rakni viszont akkor tudunk, ha nem üres (benne lévő dolgok száma > 0).
Kezdetben a szoba nem üres, nincs kitakarítva és nincs benne rend. A feladat, hogy legyen benne rend, és legyen kitakarítva."

domain.pddl:

(define (domain rendrakas)
 (:requirements :strips :equality :fluents)
 
 (:functions
  (dolgok-szama ?hol))
  
 (:predicates
  (kitakaritva ?hol)
  (rend-van ?hol))
  
(:action		 takarit
 :parameters	(?szoba)
 :precondition (= (dolgok-szama ?szoba) 0)
 :effect		 (kitakaritva ?szoba))

(:action		 rendet-rak
 :parameters	(?szoba)
 :precondition (> (dolgok-szama ?szoba) 0)
 :effect		 (rend-van ?szoba))

(:action		 kidob-egy-dolgot
 :parameters	(?szoba)
 :precondition (> (dolgok-szama ?szoba) 0)
 :effect		 (decrease (dolgok-szama ?szoba) 1)))

problem.pddl:

(define (problem rendrakas-problem)
 (:domain rendrakas)
 (:objects haloszoba)
 (:init	  (= (dolgok-szama haloszoba) 5))
 (:goal	  (and (rend-van haloszoba)
					  (kitakaritva haloszoba)))
 (:metric minimize (dolgok-szama haloszoba)))

-- Hali - 2010.12.05.

Cél megadásánál kvantorok használatának elkerülése

http://portal.mit.bme.hu/oktatas/hf/vimia313/faq.php#02_01 STATUS_ACCESS_VIOLATION, "az LPG nem képes a célfeltételek közt több változó kvantifikálását lekezelni"

Ez a hiba a legtöbb esetben megkerülhető a következő módon: létre kell hozni egy "munkaBefejezesenekErzekelese" actiont, aminek megadni preconditionben az eredeti kvantifikált változókat és az effectben igazzá tenni egy "keszVagyunk" predikátumot, majd ezt vizsgálni a problem goaljában.

Nem feltétlen szép megoldás (a probléma és a domain összemosódása), de nálam működött és őszintén: LPG mellett ez már maga egy csoda.

-- KoczkaTamas - 2010.12.05.