Τσάπελη Φανή ΑΜ: 243113 Ενισχυτική Μάθηση για το παιχνίδι dots Τελική Αναφορά Περιγραφή του παιχνιδιού Το παιχνίδι dots παίζεται με δύο παίχτες. Έχουμε έναν πίνακα 4x4 με τελείες, και σκοπός του κάθε παίχτη είναι να ενώνει ανά δύο τις τελείες με γραμμές έτσι ώστε να σχηματίσει ένα τετράγωνο. Οι παίχτες παίζουν διαδοχικά τραβώντας κάθε φορά μία γραμμή από μία τελεία σε μία άλλη διπλανή. Ο παίχτης που καταφέρνει να σχηματίσει ένα τετράγωνο το σημειώνει με κάποιο χρώμα που σηματοδοτεί ότι είναι δικό του, και έχει δικαίωμα να ξαναπαίξει (δηλαδή ο αντίπαλος χάνει τη σειρά του). Το παιχνίδι τελειώνει όταν δεν υπάρχουν άλλες επιτρεπτές κινήσεις ( δηλαδή όλες οι τελείες έχουν ενωθεί σχηματίζοντας τετράγωνα) και κερδίζει ο παίχτης που θα σχηματίσει τα περισσότερα τετράγωνα. Κατά τη λήξη του παιχνιδιού ο συνολικός αριθμός των τετραγώνων που έχουν σχηματιστεί είναι περιττός (9 τετράγωνα), άρα είναι προφανές ότι το παιχνίδι δεν μπορεί να λήξει με ισοπαλία. Υλοποίηση του αλγορίθμου TD-learning για την εύρεση μιας συνάρτησης αξιολόγησης Η συνάρτηση αξιολόγησης που χρησιμοποίησα είναι γραμμική της μορφής: U = w[]*f[]+w[1]*f[1]+w[2]*f[2]+w[3]*f[3]+w[4]*f[4]+w[]*f[] + w[6]*f[6] με f[] τον αριθμό των τετραγώνων που δεν έχουν καμία ακμή, f[1] τον αριθμό αυτών που έχουν μία, f[2] για δύο, f[3] για τρείς, f[4] ο αριθμός των συμπληρωμένων τετραγώνων που ανήκουν σε εμένα, f[] o αριθμός των συμπληρωμένων τετραγώνων που ανήκουν στον αντίπαλο και τέλος κρατάω την τιμή του f[6] σταθερή και ίση με 1. Ο σταθερός αυτός όρος χρειάζεται ώστε να επηρεάζονται οι τιμές των βαρών με συντελεστές f[], f[1] και f[2] από τις αλλαγές που γίνονται στα υπόλοιπα βάρη (και το αντίστροφο) καθώς στην αρχή του παιχνιδιού οι τιμές των f[3], f[4] και f[], είναι μηδενικές ενώ στο τέλος είναι μηδενικές οι f[], f[1] και f[2]. Όταν το παιχνίδι τερματίσει λαμβάνεται μια ανταμοιβή R ίση με την διαφορά των τετραγώνων που συμπλήρωσα 'εγώ' με τα τετράγωνα του αντιπάλου. Η επιλογή της επόμενης κίνησης γίνεται με τον αλγόριθμο minimax και κλάδεμα a-b. Κάθε φορά που πρέπει να αποφασιστεί η επόμενη κίνηση, δημιουργείται μια λίστα με αντικείμενα τύπο GameState, τα οποία αντιπροσωπεύουν όλα τα boards που μπορούν να προκύψουν δεδομένης της κατάστασης που βρισκόμαστε. Με βάση τον αλγόριθμο minimax επιλέγουμε ένα από αυτά σαν την επόμενη κατάσταση. H αναζήτηση minimax φτάνει σε βάθος 4 (δύο ζεύγη κινήσεων εγώ αντίπαλος). Φυσικά σε περίπτωση που ένας από τους δύο παίκτες πρέπει να ξαναπαίξει, η αναζήτηση συνεχίζεται σε μεγαλύτερο βάθος μέχρι να παίξουν και οι δύο παίκτες από δύο φορές. Τέλος υλοποιήθηκε ο αλγόριθμος TD learning με βάση τον οποίο ενημερώνονται τα βάρη. Πιο συγκεκριμένα τα βάρη ενημερώνονται με βάση την εξίσωση
w[i] = w[i] + a*( NextState.getUtility - CurrentState.getUtility)*f[i], για μη τερματικές καταστάσεις και w[i] = w[i]+a*(currentstate.getr()-currentstate.getutility())*f[i]; To a ενημερώνεται με βάση τη συνάρτηση a =./N όπου N η συχνότητα εμφάνισης μιας συγκεκριμένης κατάστασης στην οποία βρισκόμαστε. Για την ενημέρωση του a δημιούργησα έναν Vector όπου αποθηκεύεται κάθε νέος πίνακας f που συναντάται, μαζί με έναν αριθμό που δείχνει πόσες φορές εμφανίστηκε. Αν και διαφορετικά board μπορούν να έχουν τον ίδιο πίνακα f, θεωρώ ότι δεν με ενδιαφέρει το ποια τετράγωνα έχουν πόσες ακμές αλλά το πόσα τετράγωνα έχουν έναν αριθμό ακμών και έτσι καταστάσεις που προκαλούν ίδιο πίνακα f θεωρούνται ίδιες. Προβλήματα που παρουσιάστηκαν Αρχικά είχα πει πως το board θα αποτελούνταν από 6x6 τελείες. Χρειαζόταν όμως αρκετός χρόνος για να τρέξει η εφαρμογή ώστε να συγκλίνουν τα βάρη για τον εξής λόγο: αν και με το κλάδεμα α-β η ο χρόνος αναζήτησης της επόμενης κίνησης μειώνεται πολύ, όταν παίζει ο ίδιος παίκτης διαδοχικά επειδή συμπλήρωσε κάποιο τετράγωνο δεν είναι δυνατόν να γίνει κλάδεμα αφού χάνεται η ιδιότητα αυτή του αλγορίθμου. Έτσι ο χρόνος αναζήτησης αυξάνεται πολύ και το πρόβλημα γίνεται πολύ εντονότερο όταν κάποιος από τους παίχτες κάνει συνέχεια διαδοχικές κινήσεις. Το πρόβλημα αυτό υπάρχει βέβαια και για το board που υλοποίησα τελικά, αλλά δεν γίνεται τόσο αισθητό λόγο του μικρότερου αριθμό κινήσεων. Δοκίμασα επίσης να υλοποιήσω και ένα board x περιορίζοντας λίγο το βάθος της αναζήτησης μόνο σε περιπτώσεις που εμφανιζόταν η προβληματική κατάσταση που ανέφερα παραπάνω, έτσι ο χρόνος αναζήτησης ήταν σχετικά ικανοποιητικός. Υπήρχε ένα άλλο πρόβλημα όμως : χρησιμοποιώντας την συνάρτηση ενημέρωσης για το α που ανέφερα παραπάνω, τα βάρη δε συγκλίνουν αλλά κάνουν μια ταλάντωση. Αυτό οφείλεται (μάλλον) στο ότι ο ρυθμός που μειώνεται το α είναι μικρότερος σε σχέσει με αυτόν για το 4x4 board καθώς έχω μεγαλύτερο αριθμό κινήσεων οπότε το Ν (συχνότητα εμφάνισης μιας κατάστασης) αυξάνεται με μικρότερο ρυθμό. Δοκίμασα κάποια διαφορετικά α και βάρη και έτρεξα τον αλγόριθμο για περισσότερα παιχνίδια, αλλά δεν είχε αποτέλεσμα και επιπλέον ήταν πολύ χρονοβόρο οπότε το άφησα. Αποτελέσματα Αρχίζοντας με τα βάρη : [.1137499999999999, -.199837,.1999966299999996,.312796911, -.12468174, -.2823268893999999,.4126867] καταλήγω στα: [-.211834811991761,.1238388188748348, -.284896979262,.6421911688,.792698699782, -.696428397647,.89381618123737] Η σύγκλιση των βαρών γίνεται βάζοντας τον υπολογιστή να παίζει 6 παιχνίδια μετ τον εαυτό του και η εξέλιξη των βαρών στο χρόνο φαίνεται παρακάτω:
w [ ] 4 3 2 1-1 - 3 w [ 1 ] 4 3 2 1-1 - 3
1 2 w [ 2 ] 1 8 6 4 2-4 - 6 2 w [ 3 ] 1 1 - - 1-1
1 w [ 4 ] - - 1-1 1 w [ ] 1 - - 1
1. w [ 6 ] 1. -. - 1-1.. Οδηγίες για την εκτέλεση Αν εκτελέσετε την εφαρμογή θα εμφανιστεί το παράθυρο που εμφανίζεται στα video. Επιλέξτε μια από τις δύο επιλογές : Human to play first ή Computer to play first για να εμφανιστεί το board. Σε οποιαδήποτε στιγμή κατά τη διάρκεια του παιχνιδιού μπορείτε να πατήσετε new game για να ξεκινήσετε ένα νέο παιχνίδι. Τα τετράγωνα που συμπληρώνεται εσείς σημειώνονται με μια κόκκινη κουκκίδα ενώ του αντιπάλου (υπολογιστή) με μια πράσινη. Όταν παίζεται ο υπολογιστής δε μαθαίνει, αλλά χρησιμοποιεί τα βάρη στα οποία έχει ήδη καταλήξει. Σε περίπτωση που θέλετε να τρέξετε τον αλγόριθμο TD-learning για να δοκιμάσετε κάποια άλλα βάρη (ή να δείτε πως τρέχει) πρέπει να αλλάξετε τη μεταβλητή learning που υπάρχει στη main από σε 1.