[Java] Connect4ITU - Forza 4 con intelligenza artificiale

Stato
Discussione chiusa ad ulteriori risposte.

imported_BlackLight

Utente Silver
16 Agosto 2007
211
8
1
98
Progetto da presentare per il corso di efficient artificial intelligence programming all'ITU di Copenhagen. Si tratta di un gioco di Forza 4 in Java (l'interfaccia grafica era già pronta, il mio compito era sviluppare la logica dell'AI, che scegliesse le mosse di risposta a quelle del giocatore umano). Per l'uso, pasto il README:

Codice:
Connect 4 game made for a project of AI at the ITU of Copenhagen (DK).
To run it (of course you must have Java installed on your machine), simply type:

java ShowGame <GameLogic | human> <GameLogic | human> [board rows (default: 6)] [board columns (default: 7)] [AI skill level (default: 12)] [number of n-in-a-row winning coins (default: 4)]

For example, to start a 7x6 grid where a player wins when it places 4 coins in a row ("Forza 4"), and the artificial intelligence is on an average level, simply type
java ShowGame human GameLogic

Si può anche fare roba foga, tipo far giocare una logica contro un'altra (anche se questo potrebbe portare a un deadlock del gioco):

Codice:
java ShowGame GameLogic GameLogic

oppure sviluppare la propria logica semplicemente implementando l'interfaccia IGameLogic e modificando la classe GameState, e far giocare una logica contro l'altra.

L'AI usa un algoritmo di minimax con alpha-beta pruning per scegliere la migliore strategia in un certo momento, con una funzione euristica basata sullo score in un determinato stato se il livello di profondità raggiunto è pari al livello di abilità dell'AI stessa, per effettuare il cutoff. I dettagli implementativi sono contenuti nella directory mydoc, in formato JavaDoc.

Link:
http://0x00.ath.cx/prog/connect4itu.tar.gz
 
BlackLight ha detto:
Progetto da presentare per il corso di efficient artificial intelligence programming all'ITU di Copenhagen. Si tratta di un gioco di Forza 4 in Java (l'interfaccia grafica era già pronta, il mio compito era sviluppare la logica dell'AI, che scegliesse le mosse di risposta a quelle del giocatore umano). Per l'uso, pasto il README:

Codice:
Connect 4 game made for a project of AI at the ITU of Copenhagen (DK).
To run it (of course you must have Java installed on your machine), simply type:

java ShowGame <GameLogic | human> <GameLogic | human> [board rows (default: 6)] [board columns (default: 7)] [AI skill level (default: 12)] [number of n-in-a-row winning coins (default: 4)]

For example, to start a 7x6 grid where a player wins when it places 4 coins in a row ("Forza 4"), and the artificial intelligence is on an average level, simply type
java ShowGame human GameLogic

Si può anche fare roba foga, tipo far giocare una logica contro un'altra (anche se questo potrebbe portare a un deadlock del gioco):

Codice:
java ShowGame GameLogic GameLogic

oppure sviluppare la propria logica semplicemente implementando l'interfaccia IGameLogic e modificando la classe GameState, e far giocare una logica contro l'altra.

L'AI usa un algoritmo di minimax con alpha-beta pruning per scegliere la migliore strategia in un certo momento, con una funzione euristica basata sullo score in un determinato stato se il livello di profondità raggiunto è pari al livello di abilità dell'AI stessa, per effettuare il cutoff. I dettagli implementativi sono contenuti nella directory mydoc, in formato JavaDoc.

Link:
http://0x00.ath.cx/prog/connect4itu.tar.gz

ma è un sistema esperto?
 
Non è esattamente un sistema esperto, un sistema esperto opera generalmente sulla base di una logica pre-appresa facendo le sue inferenze logiche sui nuovi fatti. Questo è un sistema che valuta le mosse una per una, scegliendo in ogni momento la mossa che più aumenta le proprie probabilità di vittoria sulla base di tutti i possibili scenari.
 
BlackLight ha detto:
Non è esattamente un sistema esperto, un sistema esperto opera generalmente sulla base di una logica pre-appresa facendo le sue inferenze logiche sui nuovi fatti. Questo è un sistema che valuta le mosse una per una, scegliendo in ogni momento la mossa che più aumenta le proprie probabilità di vittoria sulla base di tutti i possibili scenari.

un sistema esperto di solito da spiegazioni sulla sua inferenza...quindi da come mi dici il tuo sistema sceglie la mossa adatta senza dare una spiegazione.

Complimenti comunque bel lavoro :birramg:
 
No no assolutamente, la differenza fra un sistema esperto e un algoritmo di minimax, per dire, non sta nel fatto che il sistema esperto giustifica le sue scelte e un algoritmo di minimax no. Il compito del sistema esperto è quello, partendo da una base di conoscenza composta da un insieme di predicati logici, stimare se una nuova proposizione, un nuovo stato o un nuovo comportamento può essere derivato dalla logica nota a priori (ad esempio se so che "se esco quando piove, mi bagno" e "domani piove", un sistema esperto è in grado di ricavare la relazione "se esco domani mi bagno"). Un algoritmo di ricerca come minimax (ma anche algoritmi non usati necessariamente nel contesto del "io-contro-avversario", come A* o BFS) invece non parte da nessuna base logica nota a priori. Semplicemente, per ogni stato del gioco, analizza tutte le possibili mosse che può operare, e da lì quali mosse può operare l'avversario, e così via fino a un livello di profondità arbitrario che fa "l'intelligenza" dell'algoritmo (a un certo punto ovviamente si taglia, usando una funzione euristica per stabilire il valore di quel nodo). Calcolando tutte queste combinazioni, sceglie la mossa "meno peggiore" per il suo gioco. Ma è un algoritmo dinamico, che crea il grafo di volta in volta in funzione dello stato attuale, mentre un sistema esperto si basa sul presupposto che una base di conoscenza è già nota a priori e sulla base di quella si valuta la veridicità di altre azioni o proposizioni (appunto, esperto perché qualcuno gli ha messo della conoscenza dentro a priori).
 
Come avevo già detto su altri forum, davvero un bel lavoro, però non sono riuscito a sentire la tua opinione a riguardo della scelta di optare per un MouseEvent che gestisse il termine del turno del giocatore!! Perchè non ha/avete utilizzato qualcosa di più immediato come uno sleep, magari visibile a mo di clessidra, che indicasse il tempo a disposizione per effettuare la mossa!! :)
 
Uhm perché l'interfaccia grafica non l'ho fatta io...e sinceramente non ho molta voglia di mettermi a lavorare per cambiarla, tanto la cosa importante in questo progetto è la logica della AI.
Vi farò comunque poi sapere come andrà al contest di AI, in cui la mia piccolina dovrà sfidare altre AI a forza 4...
 
BlackLight ha detto:
Uhm perché l'interfaccia grafica non l'ho fatta io...e sinceramente non ho molta voglia di mettermi a lavorare per cambiarla, tanto la cosa importante in questo progetto è la logica della AI.
Vi farò comunque poi sapere come andrà al contest di AI, in cui la mia piccolina dovrà sfidare altre AI a forza 4...

Ah beh certo, effettivamente il tuo ruolo era esclusivamente quello di mettere a punto l'AI, di conseguenza non era tuo compito realizzare l'interfaccia grafica, però il mio era essenzialmente un piccolo suggerimento per rendere magari più carino il gioco in se per se, impostando questa piccola opzione che avrebbe in tal caso rimosso il fastidioso obbligo di cliccare ogni volta in un punto vuoto della finestra di gioco!! ;)

[ot]
Subito dopo questo tuo ultimo programma che hai postato, sono rimasto ancor più affascinato dalle possibilità che si hanno di poter addestrare a proprio piacimento delle intelligenze artificiali e per tal argomento ho cercato subito di trovare più informazioni possibili per poterlo studiare appropriatamente e per questo ti vorrei chiedere, in particolare sono necessarie conoscenze matematiche approfondite? E questione più importante, ho trovato in libreria un libro piuttosto interessante questo.
Secondo te, sarebbe un buon manuale dal quale iniziare a dare un'occhiata per acquisire quantomeno un'infarinatura generale di cosa siano esattamente le AI ed in che modo poterne implementare qualcuna anche dalle capacità molto ridotte!! :)
[/ot]
 
Stato
Discussione chiusa ad ulteriori risposte.