Come costruire un "traffico AI"?


21

Un progetto a cui sto lavorando in questo momento prevede un sacco di "traffico" nel senso di automobili che si muovono lungo le strade, aerei che si muovono intorno a un grembiule, ecc.

A partire da ora i percorsi disponibili sono precalcolati, quindi i nodi vengono generati automaticamente per incroci che sono essi stessi interconnessi da bordi. Quando un personaggio / agente si genera nel mondo, inizia da un nodo e trova un percorso verso un nodo bersaglio mediante un semplice algoritmo A *. L'agente segue il percorso e alla fine raggiunge la sua destinazione. Nessun problema finora.

Ora devo abilitare gli agenti per evitare collisioni e gestire situazioni di traffico complesse. Da quando sono nuovo nel campo dell'intelligenza artificiale, ho cercato diversi articoli / articoli sul comportamento dello sterzo, ma li ho trovati troppo bassi. Il mio problema consiste meno nell'effettiva prevenzione delle collisioni (che è piuttosto semplice in questo caso perché gli agenti seguono percorsi definiti in modo rigoroso) ma di situazioni come un agente che lascia un vicolo cieco mentre un altro vuole entrare esattamente nello stesso. O due agenti che si incontrano a un collo di bottiglia che consente a un solo agente di passare alla volta, ma entrambi devono passarlo (secondo il percorso ottimale trovato prima) e devono trovare un modo per lasciare passare l'altro. Quindi, sostanzialmente, l'aspetto principale del problema sarebbe la previsione del movimento del traffico per evitare blocchi.

Difficile da descrivere, ma immagino tu capisca cosa intendo. Hai qualche consiglio per me su dove iniziare a cercare? Documenti, progetti di esempio o cose simili che potrebbero iniziare?

Apprezzo il vostro aiuto!


La diffusione collaborativa potrebbe aiutarti con qualcosa. È un modo semplice come risolvere il percorso alla ricerca di più agenti contemporaneamente + agenti evitando se stessi. Per favore, condividi la tua esperienza con essa da qualche parte, grazie. ;)
user712092

Risposte:


12

Ci sono così tanti modi per affrontare questo problema che farei fatica a dare una risposta decente e completa qui. Ma qui ci sono alcuni punti di design di alto livello.

  • Stai costruendo una simulazione agente qui. L'individuazione del percorso è semplicemente un input nel sistema: l'agente ha un obiettivo e l'individuazione del percorso è solo un modo per raggiungere tale obiettivo. In realtà, pensandolo in termini reali, l'agente ha due obiettivi: l'obiettivo principale di un pilota è "non andare in crash", in secondo luogo è "arrivare dove voglio andare".
  • I tuoi sistemi dovrebbero basarsi su parallelismi reali. Il motivo per cui la maggior parte delle strade ha due o più corsie è perché è molto più facile organizzare il traffico con quel sistema, nessuno deve pensarci molto. In uno scenario a corsia singola, i conducenti devono risolvere vari problemi:

    rilevazione - riconoscendo che tu e la macchina in arrivo andrete in crash a meno che non vi evitiate a vicenda

    reazione - rallentamento ed entrare in una fase di negoziazione.

    negoziazione : uno dei piloti deve prendere l'iniziativa, l'altro deve cedere. Le regole su come decidere questo sono vaghe, ma sostanzialmente vuoi qualcosa in cui un guidatore arbitrariamente (o basato su un'euristica su quante macchine stanno arrivando nella direzione opposta) decide di prendere la priorità. Ad esempio, A ha la priorità al tempo 1, B vede A prendere la priorità e cede (allontanandosi e fermandosi). Se sia A che B tentano di avere la priorità, entrambi dovrebbero fermarsi, attendere una quantità casuale di tempo (o segnalarsi a vicenda) e riprovare. Alla fine l'uno cederà all'altro.

    Il bello di questa implementazione è che evita la necessità di mantenere code artificiali o altri falsi costrutti. La negoziazione si svolge in termini di percezioni del mondo reale: una volta che entrambe le parti sono in fase di negoziazione, qualsiasi movimento significativo in avanti viene facilmente rilevato come un tentativo di prendere la priorità. Dovrebbe inoltre reagire in modo appropriato all'utente, che molto probabilmente non aderirà a buone regole di guida.

  • Assumi il peggio. Anche in un sistema perfetto, possono sorgere situazioni strane e i tuoi attori dovrebbero agire in modo sensato. Ciò è ancora più probabile se il giocatore può interferire (bloccare artificialmente le aree, ecc.) Spesso, fermarsi del tutto è l'unica risposta sensata (blocco della griglia!) Girare sul posto o ovviamente essere in uno stato di rottura è un fallimento dell'IA. Fermarsi del tutto è almeno plausibile in termini reali.

    Più si modella l'IA del proprio attore su una semplice logica del mondo reale, più facile sarà creare un'IA convincente. Le persone reali non si fermano o oscillano avanti e indietro se non riescono a raggiungere il loro obiettivo. Se l'unica strada per la destinazione dell'IA è bloccata, dovrebbero riconoscerlo e scegliere una risposta (fermarsi del tutto, arrendersi e tornare a casa, arrendersi e guidare altrove).

  • Comportamenti a strati per ottenere ciò che desideri. Ricorda, il 1 ° obiettivo non è quello di schiantarsi. Quindi la logica di evitamento (sterzo) dovrebbe sempre dominare le azioni del guidatore. Stratificate la logica direzionale che deriva dalla ricerca del percorso ("Voglio prendere a destra al prossimo incrocio"). Sovrapponi a quella occasionale rivalutazione dei percorsi, con logica di livello superiore ("preferisco andare avanti, ma se non riesco a fare progressi, consenti un nuovo percorso che implichi un'inversione di marcia").

  • La ricerca del percorso viene dalla memoria, ma la consapevolezza situazionale si basa sulla percezione. Non cercare di rendere perfetti i tuoi agenti. Conoscono la strada da casa loro in ufficio, quindi sanno quali sono i passaggi da compiere. Ma non sanno che la strada a 2 miglia di distanza è bloccata. Non cercare di fare in modo che i tuoi agenti traccino un percorso perfetto, perché non ce ne sono - anche se inizia perfettamente, altri fattori potrebbero bloccare il loro percorso. Gli agenti dovrebbero solo pianificare alcune strade davanti a dove stanno andando.

  • Qualità delle informazioni. I tuoi comportamenti dovrebbero essere semplici, ma per ottenere ciò hai bisogno di una buona funzionalità di query. Devi essere in grado di porre domande sul tuo ambiente come "quella macchina in arrivo occupa la mia corsia?", "Quante macchine stanno arrivando?", "Ci sono macchine dietro di me", "posso fare un'inversione a U" .


Grazie per la tua elaborata risposta. Il tuo consiglio dovrebbe essere davvero utile quando arrivo al traffico stradale regolare. Ma probabilmente mi sono perso due importanti aspetti nel mio post iniziale: 1. Il giocatore non partecipa al traffico da solo. È più simile a una business sim e costruisce la rete. 2. I percorsi unidirezionali si verificano soprattutto negli aeroporti, ma sugli aeroporti gli agenti non sono "su se stessi" ma hanno una torre che dice loro dove andare. La torre deve identificare le situazioni difficili, ma ha anche una conoscenza totale Quindi suppongo che sia uno strato sopra le situazioni / comportamenti che hai descritto.
Lunikon,

5

Avendo visto alcuni orribili fallimenti nei giochi rilasciati, ho un paio di suggerimenti:

1) A meno che non ci sia una buona ragione altrimenti fare due corsie e per scopi di AI renderle prioritarie per una normale direzione del flusso - consentire un viaggio a due vie ma se qualcosa va dall'altra parte il ragazzo dalla parte sbagliata della strada sempre cede ad esso.

2) Una sorta di logica per sbloccare un ingorgo se si verifica. Ho visto situazioni in cui la gestione degli ingorghi stradali si applicava solo ai veicoli che stavano provando a incontrarsi ma fallendo completamente di fronte a un modello -> -> <- <-. Ricordo una mappa che era incline a questo: era un punto chiave per rendere più difficile attaccare la base di intelligenza artificiale, ma prima o poi sarebbero arrivati ​​due raccoglitori di risorse mentre un gruppo di attacco stava uscendo e basta. Le unità in contatto ruotavano intorno cercando di trovare una via d'uscita ma non avevano mosse legali. Non ha fatto marcia indietro e ha scoperto che qualche altra unità doveva muovere per prima, e quindi l'IA non ha intrapreso azioni utili fino alla rimozione del blocco stradale. (Potresti guardare le unità in contatto girare intorno e nient'altro fa nulla.)

Credo che ciò possa essere risolto facendo in modo che un'unità bloccata dica alle unità vicine di togliersi di mezzo - questo si propagherà fino a raggiungere un'unità non bloccata che potrebbe arretrare. Ciò dovrebbe comportare una sorta di logica per tenerli lontani fino alla risoluzione del problema.

Nota che cercare semplicemente un percorso alternativo è spesso una cattiva risposta. Ho visto una situazione di livelock di quel tipo - l'unità A nota che B sta bloccando la strada e quindi si gira per usare una strada diversa. Questo ora blocca la strada per B che si gira - ora la strada è sbloccata, quindi entrambi si voltano di nuovo. Ad ogni turno si alternano tra avanzamento e avanzamento all'indietro.

Lo stesso gioco ne ho visto una versione diversa, anche a causa della nebbia della guerra. C'era un'unità nemica a un chokepoint. Quando si sposta automaticamente, l'individuazione del percorso non combatte se non viene effettivamente presa di mira sull'unità nemica. Si sposterebbe in avanti e vedrebbe la strada bloccata. Quindi tornò indietro, non riuscì più a vedere il blocco e si sarebbe spostato di nuovo in avanti. Ripeti fino a quando l'umano si rese conto che non stava arrivando dove doveva andare.


2
Buona risposta - Mi piace l'idea di trasmettere messaggi "bloccati" in modo che chiunque possa uscirne lo faccia.
MrCranky,

4

Non ho molta esperienza con le simulazioni del traffico, ma mi vengono in mente alcune cose.

In primo luogo, per evitare colli di bottiglia in primo luogo avrei due corsie che consentono ai veicoli di spostarsi in direzioni opposte. sulla stessa "strada".

In secondo luogo, per le collisioni che possono verificarsi, è necessario evitare il comportamento dello sterzo per evitare collisioni. I comportamenti di guida possono essere di basso livello, ma sono molto utili per creare comportamenti emergenti dall'aspetto realistico.

Se non vuoi avere più di una corsia, dovrai archiviare più informazioni nel grafico. Ad esempio, se l'agente A è su una strada (rappresentato come un bordo grafico) e l'agente B è sulla stessa strada in movimento nella direzione opposta ad un'allora sarà collidere / deadlock / qualunque aver codificato per affrontare questo problema.

Tuttavia, se l'agente A si trova su una strada, potrebbe richiedere la proprietà di quella strada. Possedere la strada significherebbe che nessun altro agente può viaggiare lungo quel bordo (potresti farlo semplicemente cambiando il costo del bordo in un numero enorme per assicurarti che A * non scelga la strada durante il calcolo di un percorso). Quindi quando l'agente A è libero da quella strada, abbandona la proprietà.

Onestamente, è una soluzione caotica di cui non sono particolarmente affezionato e la maggior parte delle simulazioni del traffico (se non tutte?) Che ho visto usare un approccio a più corsie.


Sì, dovrebbero essere usate due corsie (perché ci sono semplicemente due corsie) ma ciò non risolve alcun problema relativo al cedimento (quali sono la maggior parte dei problemi descritti dal richiedente)
Bart van Heukelom,

4

Hai detto che hai cercato diversi articoli sul comportamento dello sterzo, anche se, nel caso, hai cercato il seguente?

http://www.red3d.com/cwr/steer/

In caso contrario, potrebbe fornirti alcune risposte, in quanto copre alcuni dei problemi che hai nominato, ad esempio il problema del collo di bottiglia (Accodamento).


0

Penso che ciò che devi fare sia implementare un algoritmo di ricerca del percorso.

Suddividi la mappa in più piccoli pezzi possibili (ad esempio quadrati) ma solo per luoghi validi per il traffico. Dovresti quindi determinare dove si trova il veicolo e dove sta andando e trovare un percorso, forse il più breve o il più diretto. Il percorso sarà costituito da una serie di quadrati, ogni passo del cammino verso la destimazione. Quello che vorresti quindi è calcolare non solo la posizione attuale di tutti i veicoli ma le posizioni future dei veicoli per un paio di passi in futuro. Se in futuro due veicoli si troveranno nella stessa piazza, dovrai cambiare la velocità di uno o entrambi.

A * (A star) è un algoritmo di ricerca di percorsi molto semplice che probabilmente puoi semplicemente tradurre facilmente il codice psuedo in wikipedia nella tua lingua preferita e funzionerà: http://en.wikipedia.org/wiki/A*_search_algorithm


4
Come ho già detto nel mio post iniziale, ho già implementato un algoritmo A * e ho anche strutture di dati corrispondenti. Inoltre, solo ridurre la velocità di uno degli agenti suona un po 'troppo "facile" per me.
Lunikon,

Questo non è un problema di ricerca del percorso, è un problema di simulazione dell'agente. La ricerca del percorso è solo il livello più basso di intelligenza che gli attori devono applicare.
MrCranky,

Troppo facile? haha. Bene, questo è quello che faccio quando guido! Se riesco a prevedere una collisione con il mio percorso attuale, cambio velocità.
justin.m.chase

E semafori? E cosa fare quando il tuo percorso è bloccato da un altro veicolo? Cosa fare quando il percorso dice andare avanti, ma la velocità è zero per evitare una collisione. Una collisione con un'altra macchina, il cui percorso dice andare avanti (attraverso di te), e anche la loro velocità è zero?
MrCranky,

In uno scenario a corsia singola, se si utilizza la velocità delle altre auto per calcolare le destinazioni future quando la prima auto rileva la collisione e si ferma, anche l'altra auto non dovrà arrestarsi poiché la velocità della prima auto è ora pari a 0. Ciò presuppone che si Sarò in grado di guardare abbastanza avanti in tempo per vedere le collisioni con le auto lungo le lunghe strade a senso unico. Un mio amico mi suggerisce di aggiungere un nodo STOP anche nel tuo algoritmo A *. Con quello dal punto di vista di ogni singola macchina considereresti le altre macchine un ostacolo. L'arresto potrebbe sbloccare il percorso se fatto abbastanza a lungo.
justin.m.chase

0

Quando ho implementato Enemy Nations, il mio ultimo fallimento è stato che se un veicolo è rimasto bloccato per oltre 2 secondi, l'ho saltato in avanti sul suo percorso. Quindi, quando rimasero bloccati, un'unità fu sostanzialmente trasportata. Nessuno si è mai lamentato, quindi immagino che poche volte è successo che nessuno stava guardando e non l'ha visto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.