|
Documentazione del Programma |
Esistono
in rete diversi programmi di pianificazione che funzionano basandosi sui
concetti teorici di Graphplan e che, analizzando la quadrupla P(D,I,G,O),
forniscono in uscita la pianificazione di tutte le azioni da eseguire per
risolvere P dove D indica il dominio, I i fatti iniziali, G lo stato goal
e O l'insieme degli operatori del problema. Vediamo quindi come funziona
uno di questi , il pianificatore IPP versione 3.3 (Albert Ludwigs
University Freiburg, Institute of Computer Science), attraverso i principali
parametri d'ingresso che devo fornire al programma.
Primi per ordine di importanza sono -o e -f che servono per indicare al
pianificatore quali sono i files in cui sono contenuti gli operatori e
i fatti (c'è anche un parametro –p che serve per specificare il
path di questi files):
ipp -o operators -f facts -p path È importante notare che i files di specifica degli operatori e dei fatti (che dopo analizzeremo in dettaglio) hanno come estensione caratteristica, rispettivamente, .ops e .fct anche se questo non deve essere specificata perché viene aggiunta automaticamente durante l'esecuzione. Analizziamo ora la sintassi per specificare i fatti e gli operatori del mio problema commentando i files tratti dal dominio del mondo dei razzi Rocketsworld. Rocket.ops 'File degli operatori' |
Load | ------------> | 'nome che chiarisce la funzione dell'operatore (Carica l'oggetto cargo nel razzo da trasporto rocket entrambi situati a place)' |
:v 'object cargo 'rocket rocket 'place place | ------------> | 'specifica degli oggetti o variabili su cui agisce l'operatore Struttura: 'nome_oggetto tipo_oggetto' |
:p at('rocket 'place) at('object 'place) |
|
'precondizioni sotto le quali l'operatore può essere applicato cioè applico l'operatore se e solo se nel planning graph sono presenti questi fatti al suo stesso livello' |
:e ADD in('object 'rocket) |
|
'effetto additivo: aggiunge al grafo il fatto specificato' |
DEL at('object 'place) |
|
'effetto cancellante: indica nel grafo che il fatto specificato non è più vero' |
Unload |
|
|
:v 'object cargo 'rocket rocket 'place place | ||
:p at('rocket 'place) in('object 'rocket) | ||
:e ADD at('object 'place) | ||
DEL in('object 'rocket). |
È bene ricordare che l'operatore speciale NO-OP non deve essere
aggiunto in questi files perché il pianificatore lo utilizza comunque.
Rocket_a.fct 'File dei fatti' 'Questa prima parte specifica di quali oggetti (e a quale tipo appartengono) è composto il mio mondo o dominio' |
place: london paris jfk bos; |
|
'tipo: oggetto oggetto ….;' |
rocket: r1 r2; |
|
'r1 e r2 sono 2 oggetti di tipo rocket' |
cargo: mxf avrim alex jason pencil paper april michelle betty lisa; | ||
'La seconda parte specifica della situazione iniziale I attraverso
la lista dei fatti veri in quel momento'
initial: at(r1 jfk)
'specifica lo stato goal che deve essere raggiunto dalla situazione iniziale applicando una sequenza di operatori' goal:at(mxf bos) at(avrim jfk) at(pencil bos)
at(alex jfk)
Un altro importante parametro è -m MAX che indica al
programma il numero massimo di operatori possibili per ogni livello del
grafico. MAX è la quantità di
ipp -o operators -f facts -p path -m 512
Passiamo ora ad argomenti d'ingresso non fondamentali in quando il programma per funzionare correttamente non necessita di essi, ma possono sempre essere utili per analisi approfondite del problema in questione: -i<num>: specifica l'output a video da restituire durante l'esecuzione di Ipp. <num> è un intero da 0 a 6 che indica un grado crescente di informazioni da visualizzare (1 per default) 0: Informazioni sul tempo di CPU e sul numero
delle azioni
-W: segnala a Ipp che alla fine dell'esecuzione deve creare 2 files contenenti il grafo completo del mio problema. Ipp restituisce graph.opers e graph.facts che contengono livello per livello tutti gli operatori e tutti i fatti del grafo. -n<string> : cambia il nome graphin<string> quando Ipp genera i files del grafo ( con -W) Manca ora un accenno sugli ultimi 5 parametri d'ingresso non necessari per l'uso di base del programma,la cui conoscenza approfondita, però, potrebbe senz'altro servire per l'ottimizzazione dei problemi di pianificazione: -t <num>: numero del livello minimo del graph -I: non rimuovere l'inerzia dal problema -h <num> : fornire un'euristica di ordinamento degli archi di collegamenti fra fatti e operatori -rr<num> : Rifo :rimuovere fatti e operatori irrilevanti -S: non fare il check sul memoizing Vediamo brevemente, per concludere, l'output che fornisce il programma, durante e alla fine della sua esecuzione.Le informazionifornite sono veramente molte, e grazie alla modalità di distribuzione di Ipp,vengono fornitenel Web le sorgentiin C da compilare, tante altre possono essere estratte modificando il codice del programma.La prima operazione che il pianificatore esegue è la costruzione del planning Graph,fornendo a video livello per livello il numero di fatti e delle coppie mutuamente esclusive: time:1,21 facts and30 exclusive pairs
L'ultima riga indica a che livello è stata raggiunta la prima situazione di goal G. Ora comincia la ricerca lungo il grafo costruito, caratterizzata da un numero variabile di backtracks, ossia tornare indietro ed eseguire una nuova scelta quando raggiungo un ramo che non porta a nessuna soluzione. A questo punto non resta che aspettare che il programma abbia trovato la soluzione e fornisca in uscita il piano delle azione necessarie per la corretta risoluzione del problema P fornito: ipp: found plan as follows
Restano ora solo informazioni sui tempi impiegati per la creazione del grafico e per la ricerca della soluzione,sul numero di azioni provate dal pianificatore e sulla occupazione di memoria del programma: ipp: number of actions tried:1141981
Una breve nota per segnalare che esiste, disponibile in rete, un visualizzatore grafico del piano trovato, XGV (fornito come sorgente o eseguibile per ambiente X di Unix), per averne una visione più chiara e per comprendere a fondo il funzionamento di Ipp |