DIREWOLF BOT For Battlecode 2016 Παπαδόπουλος Θοδωρής, 2010030098 Τι είναι το Battlecode Το battlecode είναι ενας Artificial Intelligence διαγωνισμος, που διοργανωνεται από το MIT κάθε χρονο. Απευθυνεται κυριως σε φοιτητες και αρχικα ηταν μονο αυτους που σπουδαζουν εκει. Εδώ και καποια χρονια όμως είναι ανοιχτο και δεχεται συμμετοχες από ολο τον κοσμο. Link: http://www.battlecode.org/contestants/about/
Αρχικα πρεπει να επισημανω, πως υπαρχουν στο διαδικτυο οι εκδοσεις ολων των προηγουμενων ετων. Για αυτην την εργασια διαλεξα να ασχοληθω με την πιο προσφατη εκδοση, την Battlecode 2016 με σκοπο ο πρακτορας μου να παρει μερος στον φετινο διαγωνισμο. Kανονες του παιχνιδιου Κατά τη διαρκεια του παιχνιδιου δημιουργουνται zombie τα οποια επιτιθενται στους παικτες. Κάθε παικτης ξεκιναει με ένα συγκεκριμενο αριθμο απo archons, και αυτος που θα χασει πρωτος όλα του τα archons χανει και το παιχνιδι. Ετσι ο κάθε παικτης προσπαθει να εξερευνησει τον χαρτη για resources και να αντιμετωπισει τα zombie και τον αντιπαλο. Αν περασει ένα συγκεκριμενο χρονικο περιθωριο, και δεν εχει χασει κανεις, μετρανε κανονισμοι tie break ( ποιος εχει πιο πολλα archons, αν εχουν ισα ποια εχουν πιο πολύ healrth κ.ο.κ). Το παιχνιδι είναι turn-based και παιζεται σε γυρους. Κατά τη διαρκεια κάθε γυρου, το κάθε ρομποτ εχει ένα turn κατά το οποιο τρεχει κωδικα και εκτελει κινησεις. Ο κωδικας που χρησημοποιουν τα ρομποτ κοστιζει bytecodes, και κάθε ρομποτ εχει συγκεκριμενα bytecodes που μπορει να χρησημοποιησει σε κάθε γυρο. Ενας άλλος παραγοντας του παιχνιδιου, είναι ότι κάθε φορα που το robot θελει κανει μια κινηση, ειτε να προχωρήσει ειτε να επιτεθει, πρεπει να είναι ετοιμα τα αντιστοιχα cooldowns. Πχ για να επιτεθει το ρομποτ πρεπει να τσεκαρω πρωτα αν Core is ready, Weapon is ready. Οποτε ο κωδικας μας πρεπει να
λαμβανει υπ οψη τα cooldowns αυτά, αλλιως δεχομαι ποινη και το ρομποτ καταστρεφεται. Το πληρες εγχειριδιο για τους κανονες : http://s3.amazonaws.com/battlecode-releases- 2016/releases/specs-1.0.0.html#bcd01 Τα Ρομπότ που έχουμε στη διάθεση μας Archons Ξεκινας με καποια αρχικα robot, τα archons, τα οποια είναι και το κεντρικο σου unit και το ποιο σημαντικο. Χανεις το παιχνιδι μολις καταστραφουν όλα σου τα archon. Ιδιοτητες: Μπορουν φτιαξουν αλλα unit, όχι όμως αλλα archons Δεν μπορουν να επιτεθουν Μπορουν να κανουν activate neutral units ( ουδετερα units τα οποια αν κανεις activate γινονται δικα σου και τα χειριζεσαι ως τετοια ) Μπορουν να κανουν repair αλλα unit Μπορουν να στειλουν message signals Soldiers Οι soldiers είναι ranged units, με καλο attack και μετριo range, και σχετικα μετριο health
Guards Units με μικρο range, εξτρα attack απεναντι σε zombie, πολύ health Vipers Ειδικα ρομποτ τα οποια μπορουν να «μολυνουν» αλλα ρομποτ, και όταν τα σκοτωσουν τα μετατρεπουν σε zombie. Turrets Robot πυργοι, όπως σε κάθε strategy game εχουν δυνατο attack μεγαλο range, αλλα δεν κουνιουνται. Για να τα μετακινησεις πρεπει να περασουν καποιοι γυροι και να τα μετατρεψεις σε TTM (turret transport mode ), και μετα να τα ξαναμετατρεψεις σε turret. Scouts Ρομποτ που δεν εχουν attack, αλλα είναι γρηγορα με μεγαλο scan radius. Μπορουν επισης να στελνουν μηνυματα όπως τα archons.
Neutrals Ουδετερα ρομποτ που υπαρχουν στην πιστα, ιδιες κατηγοριες και ιδιοτητες με αυτά που ειπαμε μεχρι τωρα. Τα ρομποτ αυτά, μπορεις να τα εντοπισεις, να πας διπλα τους και να τα κανεις activate. Ετσι μπορεις να τα παρεις στην κατοχη σου και να πολεμησουν για σενα. Η στρατηγικη μου Η στρατηγικη που διαλεξα να εφαρμοσω ηταν ένα μιγμα δυνατης αμυνας εναντιων των zombie, οσο παραλληλα κινουμαι στο χαρτη ψαχνωντας για resources, neutral robots, αλλα και τον αντιπαλο. Θεωρησα καλη ιδεα, τα unit μου να κινουνται ολα μαζι σαν ομαδα, οποτε εκανα το εξης, στον 1 ο γυρο, θετω ένα από τα archons μου ως αρχηγο. Ο αρχηγος οριζει την κατευθυνση κινησης και όλα τα υπολοιπα ακολουθουν. Σε μεγαλους χαρτες, οπου τα archons είναι πολύ μακρια μεταξυ τους, δημιουργουνται πανω από ενας αρχηγοι, αρα και ομαδες από ρομποτ, αυτονομες μεταξυ τους. Αυτό το κανω πρωτον για να μην χασω πολύ χρονο μεχρι να βρεθουν μεταξυ τους, δευτερον ετσι μπορω να εξερευνησω μεγαλο μερος του χαρτη, και τριτον αν μια ομαδα πεθανει, να μην χασω το παιχνιδι. Σε μικροτερους χαρτες εκ πειρας αποφασισα να υπαρχει μια ομαδα. Ο στρατος μου, αποτελουνταν κατά 2/3 εως 3 /4 από guards ουτος ώστε να εχω ένα δυνατο περιβλημα αμυνας γυρω
από τα archons μου, για να αποθω τις στρατιες από zombie, και το υπολοιπο απο soldiers, ετσι ώστε να μπορουν αυτοι να κανουν σχετικα καλο damage υπο την προστασια των soldiers. Κινηση Εστω ότι εχουμε ενα στρατιωτη σε μια θεση του χαρτη. Οι κινησεις που μπορει να κανει είναι οι εξης : Τωρα, εστω ο τι ο στρατηωτης αυτος δεχεται εντολες από το κεντρικο μου archon πως πρεπει να κινηθει NorthEast, και εστω πως εκει υπαρχει καποιο εμποδιο, το οποιο είναι η καποιο κομματι της πιστας η καποιο άλλο ρομποτ. Δηλαδη ειμαστε καπως ετσι :
Για να ξεπερασω λοιπον το εμποδιο αυτό, εφτιαξα μια συναρτηση, η οποια εχει τη λογικη να τσεκαρει πρωτα αν μπορω να κινηθω στο τετραγωνο που θελω. Αν δεν μπορω, κοιταω πρωτα τα 2 διπλανα του κ.ο.κ. Στο συγκεκριμενο παραδειγμα θελω να κοιταξω τις θεσεις με τη σειρα : NE, E, N, SE, NW, S, W, και τελος SW. Για να το κανω αυτό, πρωτα χρησιμοποίησα μια συναρτηση που μετατρεπει τις θεσεις από ονοματα σε νουμερα, αρα εχουμε αυτό : Επειτα ορισα έναν πινακα Possible Directions = [ 0, 1, -1, 2, -2, 3, -3, 4 ]. Ετσι κάθε φορα που θελω να παω προς μια κατευθυνση, παιρνω τη θεση που είναι να κινηθω ( πχ NE = 1 ) προσθετω με μια επαναληψη κάθε τιμη του πινακα possible directions, προσθετω 8 και από αυτό το αθροισμα κραταω το mod του με το 8. Ετσι κινειται κάθε φορα σιγα σιγα προς την κατευθυνση που πρεπει. Ένα άλλο θεμα που επρεπε να αντιμετωπισω, ηταν τα pockets. Αν ειμαστε σε αυτην την κατασταση
Τοτε συμφωνα με την δικια μου λογικη, θα εκανε συνεχεια τις ιδιες κινησεις, και θα ελεγχε τα ιδια κουτια, ξανα και ξανα, με αποτελεσμα να μην μπορεσει να βγει ποτε. Αυτό γιατι κάθε φορα που απομακρυνεται από την κατευθυνση που θελει να παει, γυρναει παλι πισω και ξαναπροσπαθει. Το προβλημα αυτό το ελυσα με τον πολύ απλο τροπο, του να κραταω σε ένα πινακα τις προηγουμενες θεσεις από τις οποιες περασα, και να μην τις υπολογιζω σαν επιτρεπτες νεες θεσεις. Επιθεση Για να επιτεθει το καθε ρομποτ, κανω scan την περιοχη γυρω του ( καθε ρομποτ εχει δικο του scan range ) και επιτιθεται στο πρωτο εχθρικο ρομποτ, η zombie, βρει. Ειχα δοκιμασει στην αρχη να βρισκουν και να κανουν επιθεση στο ρομποτ με το πιο λιγο health, αλλα με πειραμματισμο κατα τη γνωμη μου φανηκε οτι ειναι πιο αποτελεσματικος ο πρωτος τροπος. Επισκευή Τα archons εχουν την δυνατοτητα να κανουν repair ενα μικρο ποσο του health απο αλλα ρομποτ. Εχω στον κωδικα μου λειτουργια μετα απο καποια rounds, ενα απο τα archons να σταματαει να παραγει αλλα ρομποτ, να ψαχνει το πιο αδυναμο απο την ομαδα και να το κανει repair. Στην πραξη ουτε αυτο αποδειχτηκε να ειναι τοσο αποτελεσματικο καθως επιβραδυνε την παραγωγη νεων ρομποτ, καθως το repair χρησιμοποιει το κεντρικο cooldown και πρεπει να περιμενεις τον καινουριο γυρο για να ξανακανεις καποιο action. Τον κωδικα που κανει repair τον εχω σε σχολια.
Σύμμαχοι Οπως προανεφερα, εχεις τη δυνατοτητα να κανεις activate τα neutral ρομποτ του παιχνιδιου.αυτην την δυνατοτητα την εχουν μονο τα archons. Ετσι εχω και μια συναρτηση η οποια ψαχνει στο range για τετοια ρομποτ, παει διπλα τους ( σε αποσταση ενος block ) και τα κανει activate. Αποτελεσματα Στο πρωτο τουρνουα που ηταν «αναγνωριστικο» και εστειλε ο καθενας οποιαδηποτε αρχικη δουλεια ειχε κανει, εκανα 1 νικη και 1 ηττα. Link : https://www.battlecode.org/tournaments/bracket/final/ Στο δευτερο τουρνουα, εκανα 4 νικες και 2 ηττες πριν αποκλειστω. Link : https://www.battlecode.org/tournaments/bracket/seeding/ Στο τριτο και τελευταιο τουρνουα, από το οποιο μπορουσες να προκριθεις στους τελικους, εκανα 3 νικες και 2 ηττες. Link https://www.battlecode.org/tournaments/bracket/qualifying/ Τελος, σαν μπονους, υπηρχε και το Zombie Armageddon στο οποιο επαιζε ο καθενας μονος του εναντια σε hard mode zombies. Το νικησε μονο ενας παιχτης και η καταταξη των υπολοιπων προεκυψε από το ποσους γυρους αντεξαν πριν
χασουν. Ο δικος μου τερματισε σε αρκετα καλη θεση, περιπου 35 από τους 200. Link : https://www.battlecode.org/tournaments/bracket/zombie%20ar mageddon/ *Σημειωση : Για να δει κανεις τα δικα μου παιχνιδια, κανει search στα link που εχω δωσει. Το ονομα του πρακτορα μου είναι direwolf. Ενδεικτικοι αγωνες : https://www.battlecode.org/tournaments/watch/qualifying/2432 https://www.battlecode.org/tournaments/watch/seeding/1150 Ενας αγωνας κρινεται στις 2 νικες. Χρσησιμοποιωντας τα μπλε βελακια πας στην προηγουμενη/επομενη πιστα. Εικονες & βιντεο Στους αντίστοιχους φακέλους, και φυσικά στην ιστοσελίδα. Το αρχείο RobotPlayer.java Κωδικας
Δυσκολιες 1) Η νεα εκδοση δεν ηταν διαθεσημη μεχρι και τις 4 Ιανουαριου 2016 και ετσι αναγκαστηκα να κανω «εξασκηση» σε παλαιοτερη εκδοση ( αυτή του 2015 ), η οποια εν τελει ευτυχως ειχε αρκετα κοινα χαρακτηριστικά 2) Ο διαγωνισμος αυτος αφορα κυριως ομαδες ατομων, και η εργασια μας στο μαθημα ηταν ατομικη, οποτε όπως είναι κατανοητο, μιας και την εκανα μονος μου, ειχα περισσοτερο φορτο εργασιας σε σχεση με τους υπολοιπους 3) Ο διαγωνισμος ηταν ιδιες ημερομηνιες με την χειμερινη εξεταστικη, οποτε δεν μπορεσα να αφιερωσω οσο χρονο θα ηθελα στο project αυτό. Πχ στο 2 ο τουρνουα τα πηγα πολύ καλα και σημειωσα 4 νικες πριν αποκλειστω, αλλα όμως δεν προλαβα να κανω την παραμικρη αλλαγη για το τελικο τουρνουα λογω πολλων μαθηματων στην εξεταστικη.