L'intelligenza artificiale simile agli scacchi è davvero inapplicabile nei giochi di strategia a turni?


13

Ovviamente, provare ad applicare l'algoritmo min-max sull'intero albero delle mosse funziona solo per piccoli giochi (chiedo scusa a tutti gli appassionati di scacchi, per "piccolo" non intendo "semplicistico"). Per i tipici giochi di strategia a turni in cui il tabellone è spesso più largo di 100 tessere e tutti i pezzi di un lato possono muoversi simultaneamente, l'algoritmo min-max è inapplicabile.

Mi chiedevo se un algoritmo min-max parziale che si limitasse alle configurazioni della scheda N ad ogni profondità non potesse essere abbastanza buono? Utilizzando un algoritmo genetico, potrebbe essere possibile trovare una serie di configurazioni della scheda che sono adatte alla funzione di valutazione. Si spera che queste configurazioni possano essere utili anche per obiettivi a lungo termine.

Sarei sorpreso se questo non è stato pensato e provato prima. Vero? Come funziona?


1
Puoi sperimentare la diffusione collaborativa . Funziona in base al valore di diffusione nella griglia, i nemici quindi scalano la griglia. Funziona almeno per il pathfinding. Se hai creato più valori per diffondere (separatamente?) E una salita più sofisticata (seleziona dove andare in base a diversi valori) ...
user712092

Che dire di Alpha-Beta Prunning ? È la versione migliore di min-max.
user712092

Vedo Alpha-Beta Prunning come una specie di min-max.
Joh,

Sì. Ma dovrebbe essere più veloce. Non so se ti aiuta ...
user712092

In un certo senso ho rinunciato a quell'idea. Mi sto inclinando verso un'intelligenza artificiale "vagamente" in cui uso vincoli anziché istruzioni specifiche su come reagire a eventi diversi. Spero che un GA o qualche altro algoritmo di ottimizzazione possa fornire un comportamento decentemente intelligente.
Joh,

Risposte:


5

Dipende dalla meccanica del gioco. L'albero di gioco min-max potrebbe non essere complessivamente applicabile, ma forse si applica in alcune aree. È comune che alcune posizioni su una mappa siano strategicamente importanti. Min-max può applicarsi a un livello strategico per quale di queste posizioni controllare. A livello tattico, per i quadrati x attorno a ogni posizione strategica, min-max potrebbe essere usato per decidere come schierare le unità per catturarlo e difenderlo.


9

Questo non è un algoritmo minimax, tuttavia i ragazzi responsabili dell'IA di Killzone hanno pubblicato un documento basato sulle funzioni di valutazione della posizione che utilizza anche un'intelligenza artificiale di scacchi.

È molto semplice in quanto tutto ciò che fa è scegliere una posizione sulla scacchiera in base alle conoscenze attuali dell'agente. Quindi, se l'agente ha poca salute, alle posizioni più lontane dal suo nemico verrà assegnato un punteggio più alto in quanto è più desiderabile essere fuori dalla portata del nemico.

L'articolo può essere trovato in AI Game Programming Wisdom 3 e ha il titolo Dynamic Tactical Position Assessment.

Una bozza del documento è disponibile online qui:
http://www.cgf-ai.com/docs/straatman_remco_killzone_ai.pdf

Spero possa aiutare.


2

Non penso che sarebbe abbastanza buono. Scegliere le configurazioni N specifiche, quante e quali, sarebbe praticamente impossibile in qualcosa di così complesso. Ricorda che se il tuo gioco presenta infinite risorse o qualcosa di simile, potrebbero esserci dei cerchi su come giocare, rendendo relativamente semplice lo sfruttamento di tale IA.


2

Suggerirei almeno di implementare min-max con potatura alfa-beta.

Senza provarlo e decidere che non è pratico (cioè prestazioni terribili), e senza più background sulla meccanica di gioco, non vedo perché pensi che min-max sia inapplicabile.

La dimensione della scheda è potenzialmente un problema, ma con la potatura, scartando i percorsi perdenti consente una ricerca più approfondita con la stessa quantità di calcolo, quindi forse le aree della scheda più grandi non saranno un problema quando vengono potate? Inoltre, supponendo che la dimensione della scheda stessa sia un problema potrebbe essere prematura, non è tanto la dimensione della scheda quanto la complessità della meccanica e quante mosse sono possibili da ogni posizione della scheda. Se il tuo gioco ha un'area ampia ma scarsamente popolata, il numero di mosse possibili da ogni stato del tabellone potrebbe non essere molto diverso da quello se il tabellone fosse abbastanza grande da contenere tutti i pezzi. Ovviamente se hai una tavola gigantesca che è piena al 90% e tutto può muoversi ovunque in ogni turno, ciò richiederà molta ricerca.

Inoltre, non sono sicuro del perché il movimento simultaneo sia intrinsecamente un problema. Finché si passa da uno stato di scheda discreto a un altro e si dispone di una funzione di valutazione, è necessario applicare l'algoritmo.

Presumo che tu debba comunque avere una funzione di valutazione e, indipendentemente dalla ricerca che usi, la funzione di valutazione è dove è probabile che vada la maggior parte del lavoro. L'algoritmo min-max con potatura è di per sé molto semplice da implementare, qualcosa che puoi probabilmente fare in un'ora o due e gran parte dell'infrastruttura funziona come archiviazione dello stato della scheda, valutazione, generazione di spostamenti, sarà probabilmente la stessa indipendentemente dal ricerca su cui ti accontenti.


per quanto riguarda il movimento simultaneo: all'inizio non ho visto come trasporre min-max, che in genere viene spiegato usando giochi a turni come gli scacchi, nel caso di movimento simultaneo. Penso che sto iniziando a vedere come farlo, ma non è banale.
Joh,

Nel mio post ho fornito una soluzione al tuo problema di movimenti simultanei (intestazione "Possibili spostamenti in ogni posizione"). Puoi semplicemente gestirlo facendo una sola mossa in ogni iterazione combinata con una mossa esplicita "ora finisco il mio turno", che dà il turno all'avversario. Ciò consente alla potatura intermedia alpha-beta di abbattere la complessità di questi movimenti simultanei.
SDwarfs,

1

Il vincitore della sfida AI di Google del 2011 ha utilizzato min-max (di profondità 1). Un altro dei migliori concorrenti ha usato il campionamento casuale . Questo concorrente ha affermato che un mix di min-max e campionamento casuale, che è sostanzialmente quello che ho descritto nella mia domanda, ha funzionato male. Questo lo risolve, immagino.

D'altra parte, mostra che è possibile utilizzare min-max in giochi di grandi dimensioni. Sembra tuttavia che fosse necessario limitarlo a piccoli gruppi di formiche, lavorare con l'insieme completo di tutte le formiche sarebbe stato probabilmente troppo lento. Un'altra osservazione interessante è che una profondità di 1 era sufficiente. Noi (umani) siamo diventati abbastanza bravi a giocare a scacchi e un'intelligenza artificiale per questo gioco ha bisogno di alberi di ricerca molto più profondi per essere impegnativi. Nuovi giochi più complessi non sono stati giocati e studiati per così tanto tempo e gli IA più stupidi possono avere un valore di intrattenimento sufficiente.


1

L'idea di base di un'intelligenza artificiale di scacchi è quella di fare un elenco di tutte le mosse possibili dalla mossa migliore attualmente stimata, quindi di valutarle e di ripetere il processo. Lascia cadere quelli con troppe possibilità in quanto non verranno presi (o si può presumere che non vengano presi in quanto non sembrano dare un vantaggio).

L'idea di base richiede di fare un elenco di tutte le mosse possibili e di ripetere quel processo per tutte quelle mosse ecc. Ciò è possibile negli scacchi (dove l'elenco delle probabili mosse successive è effettivamente enumerabile; una scacchiera iniziale ha 20 mosse possibili ) e fino ad un certo punto per altre cose come backgammon, dama e risoluzione di un cubo di Rubik.

Se prendo ad esempio un semplice gioco a turni (Civilization 2), ciascuno dei tuoi ragazzi può spostarsi su un totale di 8 quadrati (o 24) in un singolo turno. Se hai 10 ragazzi (il che non è molto, in genere ne hai di più quando inizia a diventare un po 'interessante) il numero totale di possibili "mosse" dallo stato attuale (quindi un singolo livello) è già 8 ^ 10 o circa 4 miliardi. Anche se poti il ​​99,99% di quelli, non puoi ancora andare in profondità sull'albero poiché il numero di mosse possibili esplode molto rapidamente.

Aggiungete a ciò che il gioco è un po 'come il problema del cubo di Rubik, in cui si vedono progressi solo dopo circa 10 o 12 mosse, il problema esplode a un punto in cui i vantaggi di un min / max standard sono prevalenti solo con una capacità di memoria di più di quanto avrà il tuo tipico computer.

In altre parole, le strategie che troverà saranno riproducibili ma non valide.

Per il vero problema, come realizzare un'intelligenza artificiale decente, andrei nella direzione di movimenti casuali sostanzialmente orientati (muovi ogni ragazzo con un po 'di intelligenza di base), valutazione e messa a punto. Fallo in parallelo per 100 o 1000 diversi e scegli quello che finisce per essere il migliore. È possibile inviare un feedback dei risultati da questo allo sterzo intelligente originale per sintonizzarlo di nuovo. Un po 'come la simulazione monte-carlo.


0

Per applicare con successo min / max a un gioco di strategia a turni, devi applicare correttamente tutte le tecniche di scacchi disponibili ...

Funzione di valutazione

Anche i motori di scacchi hanno una forza pessima, se le tue funzioni di valutazione sono cattive. La versione più semplice di una funzione di valutazione è: 1 = partita vinta dal bianco, -1 = partita vinta dal nero, 0 = tutti gli altri casi; Ma questo ti darebbe una performance pessima. Lo stesso accade al tuo gioco a turni! Se vuoi usare min / max (con potatura alfa / beta e roba simile) come negli scacchi, devi anche implementare una ragionevole funzione di valutazione! Altrimenti, non è possibile confrontare le prestazioni di tali algoritmi quando viene applicato al gioco di strategia con il caso in cui viene applicato agli scacchi.

Ciò che fanno le funzioni di valutazione dei motori di scacchi è valutare cose come:

  • Quanto è buona la posizione di un pezzo sulla scacchiera?
  • Quante volte viene attaccato un pezzo?
  • Quante volte il pezzo è protetto?
  • In che misura ogni pezzo può "muoversi" liberamente sulla scacchiera? (oppure: quante tessere "controlla")

Le parti della funzione di valutazione devono prima essere "tradotte" nel tuo gioco:

  • Posizione del pezzo: è ad esempio su una collina che sta estendendo il suo campo di tiro?
  • Attaccato: quanto è in pericolo ogni pezzo? (es. somma dei valori di attacco di unità in grado di attaccare un'unità speciale moltiplicata per una certa probabilità di essere attaccata da essa; la probabilità aumenta, se l'unità è già danneggiata; diminuisce se molte altre unità si trovano nel raggio di azione dell'unità attaccante)
  • Proprio attacco: quante unità possono essere attaccate da questo ogni unità?
  • Protezione: quanti pezzi ci sono accanto (per aiutare)? Forse un'unità non può attaccare le unità a una distanza minima ed è preferibile proteggerla dall'unità che ha la possibilità di attaccare le unità vicine.
  • Mobilità: quanto è mobile la tua unità? (può fuggire?)

Le diverse classificazioni devono essere riassunte in base alla funzione di ponderazione (fattore_a * valutazione_a + fattore_b * ranting_b + ...) per tutte le unità ...

Nei giochi di strategia anche le risorse (oro, legno, ...) rimaste devono essere prese in considerazione.

Se la tua funzione di valutazione è abbastanza buona, nella maggior parte dei casi non è necessario cercare "in profondità" nella struttura. Quindi probabilmente dovrai solo dare un'occhiata più da vicino alle 3 o 10 scelte più promettenti. Vedi il prossimo capitolo ...

Mosse possibili in ogni posizione

La cosa più problematica nell'uso di min / max per i giochi di strategia è che puoi comandare più unità in un turno, mentre negli scacchi ti è permesso comandare solo un'unità (eccetto per il castling, ma questa è una combinazione di mosse chiaramente definita). Ciò provoca 5 ^ N possibili mosse per N unità per ogni "posizione" (termine di scacchi), se si deciderà solo tra "sposta nord, sud, ovest, est O fermata" per ogni unità. Puoi risolverlo suddividendo il comando complesso nei comandi di basso livello: ad es. Scegli l'azione per l'unità A, vai in profondità e decidi per l'unità B .... decidi per l'unità N ... e poi termina questo turno. Ma questo da solo non cambia la complessità! È necessario ottimizzare l'ordine in cui le azioni sono assegnate alle unità (ad esempio prima unità B, C, D e quindi unità A). È possibile registrare l'impatto della decisione per ciascuna unità durante l'ultimo calcolo e quindi ordinare per importanza. In questo modo la potatura alfa-beta può essere utilizzata molto presto per eliminare qualsiasi cattiva combinazione dall'albero di ricerca. La massima priorità dovrebbe essere sempre "non fare più nulla e terminare il tuo turno" (potatura con mossa nulla) in ogni iterazione. In questo modo è possibile "saltare" assegnando la maggior parte delle attività alla maggior parte delle unità e lasciarle semplicemente continuare ciò che hanno fatto prima. In questo modo la ricerca andrà rapidamente in profondità semplicemente dando un'occhiata alle unità "critiche" (ad esempio quelle realmente in combattimento in questo momento). Assicurati di comandare ogni unità solo una volta ... Puoi anche usare un po 'di casualità per assicurarti che anche le unità "importanti" ricevano un comando di volta in volta. In particolare, le unità stanno finendo un lavoro (ad es

Approfondimento iterativo + cache / tabella hash

Quindi, puoi "approfondire l'interazione" per approfondire sempre di più fino a quando non viene raggiunto un limite di tempo. Quindi cercherai più a fondo se ci sono meno unità e avrai sempre qualche "risultato" se smetti di cercare una soluzione migliore. L'approfondimento iterativo richiederebbe l'uso di una tabella hash per memorizzare nella cache i risultati precedenti delle ricerche. Ciò consente anche di riutilizzare alcuni dei risultati della ricerca dell'ultima svolta (il ramo dell'albero di ricerca che copre i comandi effettivamente eseguiti nell'ultima svolta). Per implementarlo, hai bisogno di un'ottima funzione di hashing (dai un'occhiata al "tasto zobrist"), che può essere aggiornato iterativamente. Aggiornare la chiave hash significa che puoi semplicemente prendere la chiave hash della vecchia "posizione" e puoi semplicemente dare il calcio nella modifica della posizione (es. togliere l'unità in posizione x e metterla in posizione y). In questo modo il calcolo della chiave hash è rapido e non è necessario elaborare l'intera situazione delle schede per calcolarla, solo per verificare se l'hash contiene una voce precedente per questa posizione. In un certo senso è necessario assicurarsi che non si verifichino collisioni di hash.

Comportamento non deterministico

Il comportamento non deterministico è un problema per le ricerche min / max. Ciò significa che non è sicuro se colpirai un bersaglio attaccato (ad es. La probabilità è del 10%). Quindi non puoi semplicemente pianificare questo accada. In tal caso, è necessario modificare l'algoritmo e inserire uno strato "probabilty". È un po 'come "è il turno delle probabilità". Ogni risultato indipendente deve essere considerato separatamente. La valutazione attraverso questo "strato" di profondità deve quindi essere campionata (campionamento monte carlo) e il risultato della valutazione approfondita deve essere ponderato dalla probabilità dell'evento. Risultati diversi del livello di probabilità devono essere considerati come mosse avversarie diverse (ma invece di min / max deve essere calcolata la "media"). Ciò ovviamente aumenterà la complessità dell'albero di ricerca.

Sommario

Quando si applicano tutte quelle tecniche (che sono tutte utilizzate dagli attuali motori di scacchi) a un gioco deterministico, si sarà sicuramente in grado di ottenere risultati ragionevoli anche per un gioco. Per i giochi non deterministici, questo sarà probabilmente più complicato, ma penso che sia comunque gestibile.

Una buona risorsa per la spiegazione di tali tecniche (per gli scacchi) è http://chessprogramming.wikispaces.com/

Puoi persino implementare una sorta di casualità diretta nelle ricerche min / max. Invece di investigare deterministicamente i risultati migliori prima in ogni iterazione, puoi semplicemente randomizzare questo e lasciare che il suo ordine sia deciso da una distribuzione di probabilità basata sulle valutazioni correnti ...

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.