Che tipo di strumenti / architettura funzionerebbe bene per una squadra di studenti che gareggia in una competizione di calcio robot?

-1

Lo scenario è il seguente. C'è un PC che esegue un complesso software AI che controlla in modalità wireless un certo numero di robot da calcio. Questo software è scritto e gestito da un team di studenti che cambia ogni anno.

Ciò significa che ogni anno un nuovo team di una dozzina di sviluppatori relativamente inesperti deve imparare a lavorare con questo sistema, mantenerlo e migliorarlo. Ciò significa che deve essere facile da imparare, ma anche difficile da sbagliare. Ad esempio, C ++ è facile da imparare, ma facile da sbagliare, mentre Haskell sarebbe difficile da imparare, ma difficile da sbagliare.

Nella mia mente, i contendenti per le lingue adatte sarebbero cose come Java, Python e Go. Dove Java e Python sono difficili da fotografare nel piede, ma forniscono una guida minima in termini di design. Anche se non ho mai usato Go me stesso, sembra che sia progettato con grandi team di programmatori inesperti, incoraggiando strongmente un particolare modello di astrazione e concorrenza.

Per il software stesso è importante che i sottogruppi possano lavorare sulle parti in modo relativamente indipendente, che sia abbastanza veloce da controllare una dozzina di robot in tempo reale in un gioco frenetico e che il sistema sia facile da debugare e mantenere.

Esiste una gerarchia di strategia di alto livello, azioni per robot e controllo di basso livello. Sembra naturale disaccoppiare questi in thread separati, ma questo offre delle sfide nell'avere un sistema riproducibile, osservabile, debuggibile.

Idealmente, vorrai essere in grado di creare un'istanza del sistema in un dato punto della storia e riprodurlo da lì, passando da una sola all'altra attraverso tutte le decisioni prese dall'IA. Non è del tutto chiaro per me come farlo.

Se tutti i nodi fossero completamente privi di stato e deterministici, potrebbe essere sufficiente riprodurre i dati del sensore. CSP può essere un modo ragionevole per avere processi deterministici. In caso di nodi con stato, sembra essere necessario un modello di stato transazionale. Penso che Datomic sia davvero interessante in quest'area, ma alla fine non sono sicuro di come affrontarlo.

Quindi forse la domanda più difficile e più obiettiva è: come architettare un'IA gerarchica e un sistema di controllo in un modo deterministico, riproducibile e debuggabile che è difficile sbagliare?

    
posta Pepijn 11.07.2018 - 21:07
fonte

1 risposta

1

Ideally you'd want to be able to instantiate the system at a given point in history and replay it from there,

Ciò significa che è necessario rendere lo stato dell'intero sistema portatile e parametrizzato.

Parametrizzato mi fa pensare all'iniezione di dipendenza. In questo modo puoi dire in quale stato stare. Cerca tell, do ask 1 , 2

Portable significa semplicemente che puoi salvarlo e caricarlo in seguito in qualcos'altro senza dover decodificare il layout perché il layout è ovvio quando lo guardi. json è il mio preferito in questo momento. Non è richiesto alcun editor esadecimale. Non andare cieco fissando i tag XML.

La parte difficile è catturare tutti gli stati. Lo stato ama sbucare negli angoli bui quando non stai guardando. Lavorare funzionalmente aiuta con questo. È difficile nascondere lo stato quando la maggior parte del tuo sistema è senza stato.

Per favore non prendi questo per dire che insisto su Haskell o su qualche altro linguaggio funzionale. Con un po 'di disciplina puoi essere funzionale in Java o C #. Cioè, puoi progettare la maggior parte del tuo codice per essere immutabile, quindi il tuo stato è più facile da trovare.

Prova ad insegnare agli studenti questi principi e vedi se non è più facile per loro sviluppare progetti che semplificano il debug.

    
risposta data 11.07.2018 - 23:07
fonte