Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
5.7 KiB
Implementazione Agente DRL Recurrent-SAC (SAC-GRU) Nativo per Robocode TankRoyale
Bot nativo basato sull'algoritmo Recurrent Soft Actor-Critic (SAC-GRU) addestrato per combattere nell'ambiente Robocode TankRoyale.
Il bot deve connettersi direttamente al server WebSocket di TankRoyale tramite un'interfaccia client API nativa, senza l'uso di middleware o socket intermediari extra. Il sistema deve garantire il rispetto del limite rigido di 30 ms per turno imposto dal simulatore, eseguendo l'inferenza e l'addestramento in modo concorrente all'interno dello stesso processo.
1. Architettura Multi-Thread e Concorrenza (30 ms Tick Constraint)
Per evitare il fenomeno degli "skipped turns", l'applicazione deve essere suddivisa in due thread principali coordinati nello stesso processo:
-
Thread 1: Realtime Async Event Loop (WebSocket Client)
- Riceve i messaggi di evento dal server TankRoyale via WebSocket ad ogni tick.
- Estragga e normalizza il vettore di stato a 17 dimensioni (
S_t). - Esegue l'inferenza rapida dell'Actor (
< 2 \text{ ms}) fornendo lo statoS_te lo stato nascosto corrente della GRU (h_{t-1}). - Mappa le azioni restituite e invia immediatamente il
BotIntental server WebSocket. - Invia la transizione
(S_t, A_t, R_t, S_{t+1}, D_t)a una coda/canale thread-safe (Thread-safe Channel).
-
Thread 2: Background Trainer Thread (SAC-GRU Engine)
- Preleva le transizioni dal canale e le accumula in un Sequential Replay Buffer.
- Quando il buffer contiene un numero sufficiente di esperienze, estrae mini-batch di sequenze temporali.
- Esegue l'addestramento in background (Forward/Backward Pass dell'Actor, dei Dual Critic e dell'Alpha autotuning) sfruttando l'accelerazione hardware (GPU/CPU).
- Aggiorna periodicamente i pesi della rete Actor usata dal Thread 1 in modo thread-safe (es. scambio atomico di puntatori o mutua esclusione leggera).
2. Specifiche dell'Ambiente DRL (POMDP)
2.1 Vettore di Stato (S \in \mathbb{R}^{17}, Normalizzato in [-1, 1])
s[0]: Posizione X propria (X / \text{width})s[1]: Posizione Y propria (Y / \text{height})s[2]: Orientamento scafo ([-\pi, \pi] / \pi)s[3]: Velocità lineare propria ([-8, 8] / 8)s[4]: Orientamento cannone ([-\pi, \pi] / \pi)s[5]: Orientamento radar ([-\pi, \pi] / \pi)s[6]: Temperatura del cannone ([0, 3] / 3)s[7]: Energia propria ([0, 100] / 100)s[8]: Distanza dal muro NORD ((\text{height} - Y) / \text{height})s[9]: Distanza dal muro SUD (Y / \text{height})s[10]: Distanza dal muro EST ((\text{width} - X) / \text{width})s[11]: Distanza dal muro OVEST (X / \text{width})s[12]: Ultima distanza rilevata del nemico ([0, \text{max\_dist}] / \text{max\_dist})s[13]: Angolo relativo (bearing) del nemico ([-\pi, \pi] / \pi)s[14]: Orientamento del nemico ([-\pi, \pi] / \pi)s[15]: Velocità del nemico ([-8, 8] / 8)s[16]: Energia residua del nemico ([0, 100] / 100)
2.2 Vettore delle Azioni Continuo (A \in \mathbb{R}^4, Output [-1, 1])
a[0]: Rotazione scafo\rightarrowMappato su[-10^\circ, +10^\circ]per tick.a[1]: Traslazione\rightarrowMappato su[-8, +8]px/tick.a[2]: Rotazione cannone\rightarrowMappato su[-20^\circ, +20^\circ]per tick.a[3]: Potenza di sparo\rightarrow\text{ReLU}(a_3) \times 3.0(Spara solo se> 0.1).
2.3 Reward Function
R_t = R_{\text{danno\_inflitto}} - R_{\text{danno\_subito}} + R_{\text{vittoria/sconfitta}} - R_{\text{muri}} - R_{\text{sparo\_vuoto}}
- Danno inflitto:
+ (4p + 2(p - 1))conp \le 3. - Danno subito:
- (4p_{\text{nemico}} + 2(p_{\text{nemico}} - 1)). - Muri:
-5.0per tick di impatto. - Sparo a vuoto:
-0.1 \times p. - Vittoria/Sconfitta:
+20.0/-10.0.
3. Modelli Neurali e Meccanismi di Addestramento
Tutte le reti devono integrare una cella ricorsiva GRU (Gated Recurrent Unit) per gestire la parziale osservabilità dell'arena (radar in rotazione):
-
Recurrent Actor Network
\pi_\phi(a_t | s_{:t}, h_{t-1}):- Feature Extractor: Linear/Dense (
17 \rightarrow 128) + Attivazione - Memory: GRU Layer (Input:
128, Hidden:128) - Heads: Linear/Dense (
128 \rightarrow 64)\rightarrowOutputs:\mu \in \mathbb{R}^4e\log \sigma \in \mathbb{R}^4(Clamped[-20, 2]) - Sampling: Reparameterization Trick con squashing
\tanh.
- Feature Extractor: Linear/Dense (
-
Recurrent Dual-Critic Networks
Q_{\theta_1, \theta_2}(s_{:t}, a_{:t}, h_{t-1}):- Fusion: Concatenazione di Stato e Azione (
17 + 4 = 21) - Feature Extractor: Linear/Dense (
21 \rightarrow 128) + Attivazione - Memory: GRU Layer (Input:
128, Hidden:128) - Q-Head: Linear/Dense (
128 \rightarrow 64)\rightarrowOutput Q-Value scalare.
- Fusion: Concatenazione di Stato e Azione (
-
Sequential Replay Buffer & Burn-in Strategy:
- Campionamento di sequenze temporali contigue di lunghezza
L = 24. - Burn-in (
L_{\text{burn}} = 8step): I primi 8 step vengono usati unicamente per aggiornare lo stato nascostohdella GRU, senza calcolo di loss o backpropagation. - Training (
L_{\text{train}} = 16step): I successivi 16 step calcolano le loss dell'Actor, dei Critic e l'autotuning del parametro di temperatura\alpha(con targetH_{\text{target}} = -4.0).
- Campionamento di sequenze temporali contigue di lunghezza
4. Requisiti di Strutturazione del Codice
Fornisci il codice sorgente completo, modulare e pronto all'uso articolato nelle seguenti componenti:
- Model Definitions: Classi/Strutture per Actor, Critic e Target Networks basate su GRU.
- Sequential Replay Buffer: Struttura dati thread-safe con supporto per estrazione di sequenze e gestione Burn-in.
- SAC-GRU Trainer Engine: Algoritmo di aggiornamento, calcolo loss, gradient clipping (
1.0) e soft update (\tau = 0.005).