-
Notifications
You must be signed in to change notification settings - Fork 0
Funzionamento generale
Il sistema è una semplice simulazione di traffico stradale scritta in Java.
Ogni automobile nella simulazione è in grado di calcolare e di seguire percorsi verso la propria destinazione sottomettendo query ad una base di conoscenza definita in Prolog. Le automobili sono in grado di scambiare informazioni tra loro allo scopo di migliorare il pathfinding.
Si immaginino le strade di una città percorse da automobilisti ognuno con una destinazione (assunta casuale). Ogni automobilista è interessato a seguire il percorso più veloce che viene calcolato con l’ausilio di un navigatore che conosce la topologia delle strade.
Alcuni automobilisti dispongono di un tipo diverso navigatore, in grado di calcolare percorsi tenendo anche conto di informazioni sul traffico. Ognuno di questi navigatori ottiene tali informazioni scambiandole con le automobili vicine che dispongono dello stesso navigatore.
La simulazione opera su uno scenario (classe com.patterson.world.Scenario
) che definisce:
- un insieme di strade (classe
com.patterson.entity.Road
) - un insieme di incroci tra strade (classe
com.patterson.entity.Intersection
) - un insieme di automobili (classe
com.patterson.entity.Car
)
Uno scenario può essere disegnato dall'utente sfruttando un apposito editor e serializzato sotto forma di file JSON. Insieme allo scenario viene creata automaticamente una base di conoscenza Prolog con clausole che descrivono lo scenario stesso.
Ogni automobile segue un percorso (Car.path
) costituito da una sequenza di strade. Giunto alla fine di una strada (viene eseguito il metodo Car.endRoad()
), l’automobile estrae la strada successiva da Car.path
e la segue. Ogni automobile rileva la presenza di altre automobili nella stessa strada (con il metodo Car.isNearCar()
) e rallenta, eventualmente fino a fermarsi del tutto, per evitare collisioni.
Giunta ad un incrocio, ogni macchina attende di ricevere da quest’ultimo il permesso di passare in base alle regole della precedenza e all'eventuale presenza di semafori e di stop.
Ogni incrocio determina se può essere o meno concesso il permesso di passare ad una determinata macchina “c1” interrogando la base di conoscenza con una query del tipo: precedenza(c1).
L’incrocio, prima di eseguire la query, asserisce nella base di conoscenza un certo insieme di fatti relativi alla posizione e al percorso delle automobili in prossimità dell’incrocio, nonché allo stato di eventuali semafori. Tali fatti asseriti, a differenza della topologia delle strade, sono accessibili esclusivamente al singolo incrocio e gestiti tramite la classe com.patterson.utility.Knowledgebase
, che provvederà ad asserirli e ritrattarli opportunamente prima e dopo le query.
Quando un’automobile completa un percorso, sceglie casualmente una nuova strada come destinazione e calcola il percorso più veloce con una chiamata ai metodi dell’interfaccia com.patterson.entity.INavigator
.
Si sono fornite più implementazioni per l’interfaccia INavigator
associabili ad ogni automobile:
-
NavigatorAStar
: implementazione basata su A* -
NavigatorProlog
: percorso definito in Prolog con il predicatopiubreve/3
- ?
NavigatorIDA*
: implementazione basata su IDA*
Si è definita una sottoclasse di automobili in grado di scambiarsi informazioni (com.patterson.entity.CarIE
). Quando due automobili di questo tipo si avvicinano ciascuna invia all'altra informazioni (codificate in Prolog) relative alle proprie posizioni e velocità correnti (raccolte ad intervalli di tempo regolari) insieme a tutte le altre informazioni ricevute in precedenza da altre macchine. Tali informazioni verranno usate per ridefinire in Prolog i pesi delle strade (usati dagli algoritmi di pathfinding) in modo da tener conto del traffico.
Ogni informazione scambiata è rappresentata come un “pacchetto” (classe com.patterson.utility.Packet
, sottoclasse di Knowledgebase
), ossia una piccola base di conoscenza alla quale è associato un TTL, ossia un intervallo di tempo oltre il quale è scartata.
Ogni automobile di classe CarIE
gestisce un certo numero di “pacchetti” attraverso un oggetto CarIE.kb di classe com.patterson.utility.KnowledgebaseIE
(sottoclasse di Knowledgebase
). Come nel caso degli incroci, ogni automobile può accedere esclusivamente alle informazioni del proprio CarIE.kb
. Le informazioni presenti in CarIE.kb
e nei suoi pacchetti vengono opportunamente asserite e ritrattate prima e dopo ogni query, in modo da non essere visibili nelle query delle altre automobili.