Εργαστήριο Επεξεργασίας Πληροφορίας και Υπολογισμών Τομέας Ηλεκτρονικής και Υπολογιστών. ΤΗΜΜΥ Α.Π.Θ Πέμπτη 24 / 12 / 2015 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Σχετικά έγγραφα
Εργαστήριο Επεξεργασίας Πληροφορίας και Υπολογισμών Τομέας Ηλεκτρονικής και Υπολογιστών. ΤΗΜΜΥ Α.Π.Θ Πέμπτη 11 / 12 / 2014 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Εργαστήριο Επεξεργασίας Πληροφορίας και Υπολογισμών Τομέας Ηλεκτρονικής και Υπολογιστών. ΤΗΜΜΥ Α.Π.Θ Τρίτη 1 / 12 / 2015 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Εργαστήριο Επεξεργασίας Πληροφορίας και Υπολογισμών Τομέας Ηλεκτρονικής και Υπολογιστών. ΤΗΜΜΥ Α.Π.Θ Πέμπτη 19 / 12 / 2016 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Εργαστήριο Επεξεργασίας Πληροφορίας και Υπολογισμών Τομέας Ηλεκτρονικής και Υπολογιστών. ΤΗΜΜΥ Α.Π.Θ Δευτέρα 22 / 11 / 2017 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Εργαστήριο Επεξεργασίας Πληροφορίας και Υπολογισμών Τομέας Ηλεκτρονικής και Υπολογιστών ΤΗΜΜΥ Α.Π.Θ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ.

Εργαστήριο Επεξεργασίας Πληροφορίας και Υπολογισμών Τομέας Ηλεκτρονικής και Υπολογιστών ΤΗΜΜΥ Α.Π.Θ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. DS Gomoku.

Αυτόνομοι Πράκτορες. Εργασία εξαμήνου. Μάθηση του παιχνιδιού British square με χρήση Temporal Difference(TD) Κωνσταντάκης Γιώργος

Προγραμματιστικές Ασκήσεις, Φυλλάδιο 1

Αυτόνομοι Πράκτορες. Εργασία εξαμήνου. Value Iteration και Q- Learning για Peg Solitaire

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ. Πρώτη Σειρά ασκήσεων Ημερομηνία Παράδοσης: 24 Απριλίου 2018, 12 μ.μ.

Εργασία για το Facility Game Μάθημα: Δομές Δεδομένων Σωτήρης Γυφτόπουλος

ΑΥΤΟΝΟΜΟΙ ΠΡΑΚΤΟΡΕΣ. ΑΝΑΦΟΡΑ ΕΡΓΑΣΙΑΣ Othello-TD Learning. Βόλτσης Βαγγέλης Α.Μ

Δομές Δεδομένων. Σημειώσεις από το εργαστήριο για τον χειρισμό του προγράμματος Eclipse. 5ο εξάμηνο. v1.0

Δέντρα Απόφασης (Decision(

Οδηγίες Εργασίας 1 Facility-Game

AVL-trees C++ implementation

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Πανεπιστηµιο Πειραιως Σχολη Τεχνολογιων Πληροφορικης και Επικοινωνιων Τµηµα Ψηφιακων Συστηµατων οµές εδοµένων η Εργασία

DS - Pacman. 2.1 Η calculatenextpacmanposition... 3

1 η ΑΣΚΗΣΗ ΣΤΗΝ ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ. Ακ. έτος , 5ο Εξάμηνο, Σχολή ΗΜ&ΜΥ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Στατικές μέθοδοι και μεταβλητές Εσωτερικές κλάσεις

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ EPL035: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ

ΕΡΓΑΣΤΗΡΙΟ 6: Συναρτήσεις και Αναδρομή

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

53 Χρόνια ΦΡΟΝΤΙΣΤΗΡΙΑ ΜΕΣΗΣ ΕΚΠΑΙΔΕΥΣΗΣ Σ Α Β Β Α Ϊ Δ Η Μ Α Ν Ω Λ Α Ρ Α Κ Η

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Τι χρειάζεται ένας φοιτητής για τη σωστή παρακολούθηση και συμμετοχή στο μαθημα;

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

[ΠΛΗ 417] Τεχνητή Νοημοσύνη. Project Εξαμήνου ΠΟΛΥΤΕΧΝΕΙΟ ΚΡΗΤΗΣ

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΕΙΡΑΙΩΣ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΩΝ ΤΜΗΜΑ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ «ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ»

Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 12: Δέντρα ΙΙ Δυαδικά Δέντρα

Εργαστήριο 5. Εαρινό Εξάμηνο

Δομές Δεδομένων. Ενότητα 10: Πλήρη Δυαδικά Δέντρα, Μέγιστα/Ελάχιστα Δέντρα & Εισαγωγή στο Σωρό- Ο ΑΤΔ Μέγιστος Σωρός. Καθηγήτρια Μαρία Σατρατζέμη

ΗΥ240: Δομές Δεδομένων Εαρινό Εξάμηνο Ακαδημαϊκό Έτος 2017 Διδάσκουσα: Παναγιώτα Φατούρου Προγραμματιστική Εργασία - 2o Μέρος

Διάλεξη 22: Δυαδικά Δέντρα. Διδάσκων: Παναγιώτης Ανδρέου

Ενότητες 3 & 4: Δένδρα, Σύνολα & Λεξικά Ασκήσεις και Λύσεις

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

Διάλεξη 17: Δυαδικά Δέντρα. Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

ΘΕΜΑ 1ο. Μονάδες 10. Β. ίνεται το παρακάτω τμήμα αλγορίθμου: Όσο Ι < 10 επανάλαβε Εμφάνισε Ι Ι Ι + 3 Τέλος_επανάληψης ΑΡΧΗ 1ΗΣ ΣΕΛΙ ΑΣ

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

Διδάσκων: Κωνσταντίνος Κώστα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

Προγραμματισμός 2 Σημειώσεις εργαστηρίου

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

HY-252 Αντικειµενοστραφής Προγραµµατισµός. Χειµερινό Εξάµηνο 2010 ιδάσκων: Χριστοφίδης Βασίλης. Ηµεροµηνία Παράδοσης: 15/10/2010

Δομές Δεδομένων & Αλγόριθμοι

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

Δομές Δεδομένων - Εργαστήριο 5. Ουρές Προτεραιότητας

Αλγόριθμοι Αναζήτησης σε Παίγνια Δύο Αντιπάλων

Κεφάλαιο 6: Συναρτήσεις IΙΙ Αρθρωτός Προγραμματισμός. (Διάλεξη 14) Παράδειγμα: Αλλαγή τιμής μεταβλητής μόνο τοπικά

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

Κλάσεις και Αντικείµενα

Εργαστήριο 5 Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ με αλφαβητική σειρά

Βασικές Έννοιες Δοµών Δεδοµένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Υλοποίηση Δυαδικού Σωρού σε γλώσσα Java. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Κεφάλαιο 10 Ψηφιακά Λεξικά

Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών: Εργαστηριακή Άσκηση

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

Εργαστήριο 8: Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring

ΕΡΓΑΣΙΕΣ ΟΝΤΟΚΕΝΤΡΙΚΟΥ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

Γραφικά υπολογιστών Εργαστήριο 10 Εισαγωγή στα Sprites

Κεφάλαιο 6: Συναρτήσεις IΙΙ Αρθρωτός Προγραμματισμός. Δείκτες (Διάλεξη 14)

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ ΣΧΟΛΙΚΟΥ ΕΤΟΥΣ

Ημερομηνία Ανάρτησης: 08/1/2018 Ημερομηνία Παράδοσης: - Αρχές Γλωσσών Προγραμματισμού

Δομές Δεδομένων. Ενότητα 4: Ο ΑΤΔ Λίστα & Υλοποίηση Λίστας με σειριακή αποθήκευση- Ο ΑΤΔ Συνδεδεμένη Λίστα- Υλοποίηση ΑΤΔ Συνδεδεμένη Λίστα με πίνακα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Μονοδιάστατοι πίνακες Πολυδιάστατοι πίνακες Μέθοδοι Μέθοδοι Recursive Overloading

Δυαδικά Δένδρα Αναζήτησης, Δένδρα AVL

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ C ΣΕΙΡΑ 2 η

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπερφόρτωση Αντικείμενα σαν ορίσματα

Οικονοµικό Πανεπιστήµιο Αθηνών. Τµήµα Πληροφορικής. Φθινοπωρινό Εξάµηνο Δοµές Δεδοµένων - Εργασία 2. Διδάσκων: E. Μαρκάκης

3 ο Εργαστήριο Μεταβλητές, Τελεστές

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 8/4/2008. Πίνακες (Arrays)

ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ Η/Υ, ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές Δεδομένων. Ιωάννης Γ. Τόλλης Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης

Διάλεξη 26: Σωροί. Διδάσκων: Παναγιώτης Ανδρέου

Το Κ2 είναι ένα παιχνίδι για 1 έως 5 παίκτες, ηλικίας 8 ετών και άνω, με διάρκεια περίπου 60 λεπτά.

Απλές Δοµές Δεδοµένων Στην ενότητα αυτή θα γνωρίσουµε ορισµένες απλές Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε για την αποδοτική επίλυση του προβλή

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων

Εργαστήριο 02: Προγραμματισμός με Γενικούς Τύπους (JAVA Generics) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι

2.1 Αντικειµενοστρεφής προγραµµατισµός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

Transcript:

Εργαστήριο Επεξεργασίας Πληροφορίας και Υπολογισμών Τομέας Ηλεκτρονικής και Υπολογιστών 5 o Εξάμηνο ΤΗΜΜΥ Α.Π.Θ 2015-2016 Πέμπτη 24 / 12 / 2015 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ DS Proximity Part 3 MinMax Algorithm (0,5 βαθμοί) Στο τρίτο παραδοτέο καλείστε να υλοποιήσετε τον αλγόριθμο MinMax για τη βελτιστοποίηση του παίκτη σας. Σκοπός σας είναι να δημιουργήσετε ένα δέντρο βάθους 2 κινήσεων (τουλάχιστον), το όποιο, σε συνδυασμό με τη συνάρτηση αξιολόγησης που είχατε δημιουργήσει στην δεύτερη εργασία, θα αξιολογεί τις διαθέσιμές κινήσεις σε βάθος χρόνου και θα επιλέγει την καλύτερη δυνατή για τον επόμενο γύρο. Εικόνα 1: Το περιβάλλον του παιχνιδιού DS-Proximity. Ο νέος κώδικας της πλατφόρμας περιέχει την υλοποίηση ενός Random Player, καθώς και έναν Heuristic Player με μια τυπική υλοποίηση συνάρτησης αξιολόγησης, η οποία θα είναι ίδια για όλους. Για τη δημιουργία του MinMax Player που καλείστε να σε φέρετε σε πέρας σε αυτό το παραδοτέο, θα χρησιμοποιήσετε τη συνάρτηση αξιολόγησης που υλοποιήσατε στα πλαίσια της δεύτερης εργασίας.

Αλγόριθμος MinMax AB Pruning Όπως σε πολλά παιχνίδια, έτσι και στο δικό μας, για τον υπολογισμό της βέλτιστης κίνησης δεν είναι εφικτό να υπολογίσουμε όλες τις διαθέσιμες κινήσεις (μέχρι το τέλος του παιχνιδιού) σε εύλογο χρονικό διάστημα. Εξαιτίας αυτού του γεγονότος, το δένδρο των πιθανών συνδυασμών αναπτύσσεται μέχρι ενός βάθους (π.χ. για βάθος 2 κινήσεων έχω όλες τις δυνατές κινήσεις μου και όλες τις πιθανές κινήσεις-απαντήσεις του αντιπάλου). Σε κάθε φύλλο του δένδρου (στο τέλος της απάντησης του αντιπάλου) εξετάζω τη συνάρτηση αξιολόγησης που υλοποιήθηκε στη δεύτερη εργασία. Σε περίπτωση που ένας κόμβος του δένδρου είναι τελικός (το παιχνίδι τελειώνει), μπορούμε να υπολογίσουμε τον νικητή και να σταματήσουμε εκεί. Το δένδρο που θα φτιαχτεί θα έχει τη δομή του Σχήματος 2, δίνοντας σε κάθε φύλλο του το αποτέλεσμα της συνάρτησης αξιολόγησης. Η δική μας νίκη συμβολίζεται με +, ενώ η νίκη του αντιπάλου με -. Με τετράγωνα εμφανίζονται οι κινήσεις μας, ενώ με κύκλους οι κινήσεις του αντιπάλου. Θεωρούμε πάντα ότι ο αντίπαλος θα παίξει τη χειρότερη για εμάς κίνηση. Για αυτό επιλέγουμε το ελάχιστο (Minimum) της συνάρτησης αξιολόγησης (γραμμές 1 και 3). Εμείς φυσικά θα παίξουμε την κίνηση που μεγιστοποιεί (Maximum) τη συνάρτηση αξιολόγησης (γραμμές 0 και 2), λαμβάνοντας ως δεδομένο ότι ο αντίπαλος θα παίξει την καλύτερη κίνηση για αυτόν. Στο Σχήμα, λοιπόν, θα επιλέξουμε τη δεξιά κίνηση γιατί μεγιστοποιεί τη συνάρτηση αξιολόγησης, ασχέτως με το τι θα επιλέξει να παίξει ο αντίπαλος. Το βάθος του δέντρου μας δείχνει πόσες κινήσεις μπροστά κοιτάμε, και κάθε επίπεδο του δείχνει ακριβώς ποια από τις μελλοντικές κινήσεις εξετάζουμε. Σχήμα 2: Ο αλγόριθμος MinMax για βάθος 4 κινήσεων. Δομές Δεδομένων 2 2015

Κλάση Αποθήκευσης Διαθέσιμων Κινήσεων Για την υλοποίηση ενός δέντρου διαθέσιμων κινήσεων προτείνεται η δημιουργία μιας κλάσης με το όνομα NodeΑΕΜ1ΑΕΜ2 1. Η κλάση αυτή θα έχει ως μεταβλητές: 1. NodeAEM1AEM2 parent: Ο κόμβος-πατέρας του κόμβου που δημιουργήσατε. 2. ArrayList<NodeAEM1AEM2> children: Ο δυναμικός πίνακας που περιλαμβάνει τα παιδιά του κόμβου που δημιουργήσατε. 3. int nodedepth: το βάθος του κόμβου στο δέντρο του MinMax Αλγορίθμου. 4. int[] nodemove: Την κίνηση που αντιπροσωπεύει το Node, σαν πίνακας ακεραίων που περιλαμβάνει το x, το y (και την τιμή του πλακιδίου). 5. Board nodeboard: το ταμπλό του παιχνιδιού για τον συγκεκριμένο κόμβο-κίνηση. 6. double nodeevaluation: Την τιμή της συνάρτησης αξιολόγησης που έχετε δημιουργήσει για αυτή τη κίνηση. Οι συναρτήσεις της κλάσης που θα πρέπει να υλοποιηθούν είναι: 1. NodeAEM1AEM2(): Ένας ή περισσότεροι constructors για την κλάση σας, με διαφορετικά ορίσματα. 2. Κατάλληλες συναρτήσεις get και set. 3. double evaluate(): η συνάρτηση αυτή θα αξιολογεί την κατάσταση του ταμπλό μετά από την κίνηση (μπορείτε να χρησιμοποιήσετε αυτή που υλοποιήσατε στην δεύτερη εργασία ή μια βελτιωμένη έκδοση της). Οι συναρτήσεις που είχατε υλοποιήσει στη δεύτερη εργασία ως βοηθητικές για την evaluate() θα αποτελέσουν τη βάση σας και για αυτήν την εργασία, με όσες αλλαγές χρειάζονται για να συμπεριληφθούν και οι νέες μεταβλητές. Στο package node βρίσκεται μια πρότυπη κλάση με το όνομα Node. Θα πρέπει να τη μετονομάσετε (δεξί κλικ Refactor Rename) σύμφωνα με την εκφώνηση και να υλοποιήσετε τις κατάλληλες συναρτήσεις. 1 Όπου AEM1 και ΑΕΜ2 ο αριθμός μητρώου των δύο ατόμων κάθε ομάδας. Δομές Δεδομένων 3 2015

Χρήσιμες Μεταβλητές και Συναρτήσεις Για την υλοποίηση των συναρτήσεων που θα σας ζητήσουμε πολύ πιθανόν να χρειαστεί να χρησιμοποιήσετε κάποιες μεταβλητές / συναρτήσεις που υπάρχουν ήδη υλοποιημένες στην πλατφόρμα. Κλάση ProximityUtilities: Στατικές Μεταβλητές της κλάσης ProximityUtilities Αριθμός Γραμμών και Στηλών: NUMBER_OF_ROWS = 10; NUMBER_OF_COLUMNS = 12; Κατευθύνσεις: Enum Direction{EAST, SE, SW, WEST, NW, NE} Χρησιμοποιήστε τις μεταβλητές αυτές όταν θέλετε να βρείτε τον γείτονα ενός πλακιδίου προς μια συγκεκριμένη κατεύθυνση. Δείτε την συνάρτηση getneighbor για περισσότερες λεπτομέρειες. Στατικές Συναρτήσεις της κλάσης ProximityUtilities int[][] getneighborscoordinates(int x, int y, Board board): Επιστρέφει έναν πίνακα 6x2 με τις συντεταγμένες των πλακιδίων που είναι γειτονικά στο πλακίδιο [x,y]. Η σειρά με την οποία αποθηκεύονται τα πλακίδια-γείτονες στον πίνακα είναι αυτή που περιγράφεται στην εκφώνηση της πρώτης εργασίας. Tile[] getneighbors (int x, int y, Board board): Επιστρέφει έναν πίνακα 6x1 με τα πλακίδια που είναι γειτονικά στο πλακίδιο [x,y]. Η σειρά με την οποία αποθηκεύονται τα πλακίδια-γείτονες στον πίνακα είναι αυτή που περιγράφεται στην εκφώνηση της πρώτης εργασίας. Σε αντίθεση με την προηγούμενη συνάρτηση, getneighborscoordinates(), αυτή η συνάρτηση επιστρέφει έναν πίνακα που περιέχει αντικείμενα τύπου Tile. Σε περίπτωση που κάποιος από του γείτονες βρίσκεται εκτός ταμπλό, ο πίνακας στην συγκεκριμένη θέση θα περιέχει την τιμή null. Tile getneighbor (int x, int y, Board board, Direction dir): Επιστρέφει ένα αντικείμενο τύπου Tile το οποίο αναπαριστά τον γείτονα του πλακιδίου στην θέση [x,y] που βρίσκετε στην κατεύθυνση dir. Η μεταβλητή dir παίρνει συγκεκριμένες τιμές οι οποίες ορίζονται μέσα στο enumeration Direction, όπως περιγράφεται παραπάνω. Παράδειγμα: Για να πάρω τον βόρειο-δυτικό γείτονα του πλακιδίου στην θέση [8,7] καλώ την συνάρτηση ως εξής: Tile tile = ProximityUtilities.getNeighbor(8,7,board,Direction.NW) boolean isinsideboard(int x, int y): Επιστρέφει true αν η θέση [x,y] είναι εντός των ορίων του ταμπλό. Σε διαφορετική περίπτωση επιστρέφει false. Δομές Δεδομένων 4 2015

void printneighbors(int x, int y): η συνάρτηση αυτή εκτυπώνει στην κονσόλα το παιχνιδιού τις συντεταγμένες, το χρώμα και το σκορ των πλακιδίων που βρίσκονται γειτονικά του πλακιδίου [x,y]. Αν κάποιος γείτονας δεν υπάρχει εκτυπώνει την τιμή -1. public static double calculatemeanforpool(hashmap <Integer, Integer> pool): Δέχεται σαν όρισμα ένα HashMap με το σύνολο των διαθέσιμων κινήσεων ενός παίκτη και επιστρέφει τον μέσο όρο τους. public static double calculatemedianforpool(hashmap <Integer, Integer> pool): Δέχεται σαν όρισμα ένα HashMap με το σύνολο των διαθέσιμων κινήσεων ενός παίκτη και επιστρέφει τον διάμεσό τους. public static Board boardaftermove(int playerid, Board board, int x, int y, int s): Η συνάρτηση αυτή προσομοιώνει την κίνηση στις συντεταγμένες x,y με τιμή πλακιδίου s από τον παίκτη με id ίσο με playerid σε ένα αντίγραφο του ταμπλό board. Στο τέλος επιστρέφει ένα αντικείμενο τύπου board που αναπαριστά το πώς θα ήταν το ταμπλό μετά την ολοκλήρωση της κίνησης και αφού γίνουν όλοι οι απαραίτητοι υπολογισμοί στο χρώμα και στην ιδιοκτησία των πλακιδίων που βρίσκονταν ήδη στο ταμπλό. public static Board boardaftermove(int playerid, Board board, int[] move): Λειτουργεί όπως και η προηγούμενη συνάρτηση με την διαφορά πως οι συντεταγμένες x,y καθώς και το σκορ s δίνονται σαν όρισμα στην μορφή ενός πίνακα 3 θέσεων της μορφής [x,y,s]. Συναρτήσεις της κλάσης Board Tile gettile(int x, int y): η συνάρτηση αυτή επιστρέφει το πλακίδιο που βρίσκεται στην θέση [x,y] του ταμπλό. void printboard(): η συνάρτηση αυτή εκτυπώνει στην κονσόλα το ταμπλό του παιχνιδιού με τη μορφή πίνακα δυάδων-αριθμών της μορφής α/β, όπου α το χρώμα του πλακιδίου όπως φαίνεται στην οθόνη και β το σκορ του πλακιδίου. HashMap<Integer,Integer> getmypool(): Η συνάρτηση αυτή επιστρέφει ένα αντικείμενο τύπου HashMap που αναπαριστά το σύνολο των διαθέσιμων τιμών που είναι πιθανό να έρθουν για την επόμενη κίνηση. Αν θεωρείτε πως ο παίκτης σας μπορεί να παίξει σωστά χωρίς να λαμβάνετε υπόψη στην αξιολόγησή σας τις τιμές που θα έχετε διαθέσιμες σε επόμενες κινήσεις, μπορείτε κάλλιστα να μην χρησιμοποιήσετε την συγκεκριμένη συνάρτηση. HashMap<Integer,Integer> getopponentspool(): Λειτουργεί όπως και η getmypool() με την διαφορά πως επιστρέφει το σύνολο των διαθέσιμων κινήσεων του αντιπάλου. Δομές Δεδομένων 5 2015

int[] getopponentslastmove(): η συνάρτηση αυτή επιστρέφει έναν πίνακα ακεραίων 3 θέσεων της μορφής [x,y,s] όπου x,y οι συντεταγμένες και s το σκορ της προηγούμενης κίνησης του αντιπάλου. Αν δεν υπάρχει προηγούμενη κίνηση, όπως συμβαίνει κατά την πρώτη κίνηση του παιχνιδιού, επιστρέφει την τιμή [-1, -1, -1]. int[] getnexttennumberstobeplayed(): Η συγκεκριμένη στατική συνάρτηση επιστρέφει έναν πίνακα 10 θέσεων στον οποίο βρίσκονται αποθηκευμένα τα 10 επόμενα νούμερα που θα παιχτούν. Στην θέση 0 βρίσκεται το νούμερο που καλείται να τοποθετήσει στο ταμπλό ο παίκτης που παίζει και καλεί την συνάρτηση. Στην θέση 1 βρίσκεται το νούμερο που θα παίξει ο αντίπαλος στην επόμενη κίνηση και ούτω κάθ εξής. Χρησιμοποιήστε την για να αξιολογήσετε σωστά τις κινήσεις σε βάθος μεγαλύτερο του 1. Εισαγωγή Δεύτερου Παίκτη Κλάση SecondPlayer Αν θέλετε να εισάγετε τον δικό σας παίκτη Heuristic από το δεύτερο παραδοτέο ή τον παίκτη κάποιου φίλου σας για να παίξετε αντίπαλοι ακολουθήστε τα εξής βήματα: Αντικαταστήστε τον κώδικά της κλάσης SecondPlayer με τον κώδικά σας. Σε περίπτωση που ο παίκτης που θέλετε να εισάγετε είναι τύπου MinMaxPlayer θα πρέπει να δημιουργήσετε άλλη μια κλάση με το όνομα NodeAEM1AEM2 και να αντιγράψετε σε αυτήν τον κώδικα της αντίστοιχης κλάσης τύπου Node. Αλγόριθμος Δημιουργίας Δέντρου για βάθος 2 κινήσεων Δομές Δεδομένων 6 2015

int[] getnextmove (Board board, int randomnumber) Use current board to create a new node which corresponds to the root of the tree. Call createmysubtree(root, 1) // The tree is now finished Call the chooseminmaxmove(node root)to choose the best available move. Return the best move. void createmysubtree(node parent, int depth) Find the empty tile spots of the board of the parent. For each empty tile spot on the board: Create a clone of the parent node s board and simulate putting a tile on this spot by using boardaftermove() on the parent node board. Create a new node as child of the parent node using new board state. Add the node as child of the parent node. Complete the tree branches by calling createopponentsubtree(newnode, depth+1) void createopponentsubtree(node parent, int depth) Find the empty tile spots of this new state of the board. For each empty tile spot for the opponent s turn: Create a clone of the parent node s board and simulate putting a tile on this spot by using boardaftermove() on the parent node board. Create a new node as child of the parent node using the new board state. Evaluate the new leaf node. Add the node as child of the parent node. int chooseminmaxmove(node root) Implement a minmax algorithm to find the best available move. Return the index of the best available move. Οδηγίες Τα προγράμματα θα πρέπει να υλοποιηθούν σε Java, με πλήρη τεκμηρίωση του κώδικα. Το πρόγραμμά σας πρέπει να περιέχει επικεφαλίδα σε μορφή σχολίων με τα στοιχεία σας (ονοματεπώνυμα, ΑΕΜ, τηλέφωνα και ηλεκτρονικές διευθύνσεις). Επίσης, πριν από κάθε κλάση ή μέθοδο θα υπάρχει επικεφαλίδα σε μορφή σχολίων με σύντομη περιγραφή της λειτουργικότητας του κώδικα. Στην περίπτωση των μεθόδων, πρέπει να περιγράφονται και οι μεταβλητές τους. Είναι δική σας ευθύνη η απόδειξη καλής λειτουργίας του προγράμματος. Παραδοτέα για κάθε μέρος της εργασίας 1. Ηλεκτρονική αναφορά που θα περιέχει: εξώφυλλο, περιγραφή του προβλήματος, του αλγορίθμου και των διαδικασιών που υλοποιήσατε και τυχόν ανάλυσή τους. Σε καμία περίπτωση να μην αντιγράφεται ολόκληρος ο κώδικας μέσα στην αναφορά (εννοείται ότι εξαιρούνται τμήματα κώδικα τα οποία έχουν ως στόχο τη διευκρίνιση του αλγορίθμου) Προσοχή: Ορθογραφικά και συντακτικά λάθη πληρώνονται. 2. Ένα αρχείο σε μορφή.zip με όνομα ΑΕΜ1_ΑΕΜ2_PartC.zip, το οποίο θα περιέχει όλο το project σας στον eclipse καθώς και το αρχείο της γραπτής αναφοράς σε pdf (αυστηρά). Το αρχείο Δομές Δεδομένων 7 2015

.zip θα γίνεται upload στο site του μαθήματος στην ενότητα των ομαδικών εργασιών και μόνο. Τα ονόματα των αρχείων να είναι με λατινικούς χαρακτήρες. Προθεσμία υποβολής Κώδικας και αναφορά Παρασκευή 15 Ιανουαρίου, 23:59 (ηλεκτρονικά) Δε θα υπάρξει καμία παρέκκλιση από την παραπάνω προθεσμία. Δομές Δεδομένων 8 2015