Send a PR on GitHub

progintro @ dit


Στόχος της τρίτης και τελευταίας εργασίας είναι να εξοικειωθούμε με την υλοποίηση μεγαλύτερων και πιθανώς πιο πολύπλοκων προγραμμάτων, ολοκληρώνοντας την εισαγωγή μας στην γλώσσα C. Συγκεκριμένα, στοχεύουμε σε εμπειρία με τα ακόλουθα:

  1. Γραφή μεγαλύτερων προγραμμάτων, αποτελούμενα από πολλά αρχεία.

  2. Χρήση όλων των βασικών προγραμματιστικών δομών.

  3. Αναζήτηση σε χώρο καταστάσεων.

Υποβολή Εργασίας.

Όλες οι υποβολές των εργασιών θα γίνουν μέσω GitHub και συγκεκριμένα στο github.com/progintro (DIT, χ.χ.a). Προκειμένου να ξεκινήσεις, μπορείς να δεχτείς την άσκηση με αυτήν την: πρόσκληση (DIT, χ.χ.b). Σε αντίθεση με τις προηγούμενες εργασίες, αυτή είναι προαιρετικά ομαδική με ομάδες μέχρι 2 άτομα. Εάν θέλετε να δουλέψετε ως ομάδα, πρέπει ένας/μία από εσάς να αποδεχτεί την πρόσκληση και να δημιουργήσει την ομάδα σας με συγκεκριμένο όνομα. Αφού η ομάδα δημιουργηθεί ο/η συνεργάτης σας μπορεί να αποδεχτεί την πρόσκληση και να επιλέξει να προστεθεί στην ομάδα σας. Προσοχή: μην επιλέξετε λάθος ομάδα, βεβαιωθείτε ότι κάνατε join την σωστή. Αν επιλέξετε να εργαστείτε ως ομάδα, τo repository για την εργασία θα είναι κοινό ανάμεσά σας και θα μπορέσετε να συνεργαστείτε σαν επαγγελματίες software engineers - προσοχή στα conflicts! Τέλος, για να είναι ξεκάθαρο ποια άτομα συνεργάστηκαν για την εργασία, κάθε repository πρέπει να έχει ένα AUTHORS αρχείο το οποίο θα περιέχει τα στοιχεία σας στην ακόλουθη μορφή:

$ cat AUTHORS
sdi2400998,mourmourakis-2006,ΘΑΝΟΣ ΜΟΥΡΜΟΥΡΑΚΗΣ
sdi2400999,xifias-2006,ΚΩΣΤΑΣ ΞΙΦΙΑΣ

δηλαδή μία γραμμή για κάθε άτομο, με πρώτο το sdi σας, μετά το github username και τέλος το όνομά σας. Υποβολές χωρίς σωστό AUTHORS αρχείο δεν θα εξεταστούν. Αυτό ισχύει και για ατομικές υποβολές.

Νέα Μηχανή Σκακιού (chess engine - 100 Μονάδες)

Τα περισσότερα παιχνίδια έχουν παρεμφερή δομή: (1) το παιχνίδι ξεκινάει σε μια αρχική κατάσταση, (2) ένας από τους παίκτες παίζει πρώτος επιλέγοντας μια από τις δυνατές κινήσεις που έχει στην διάθεσή του αλλάζοντας την κατάσταση του παιχνιδιού και (3) στην συνέχεια δίνει την σειρά του στον επόμενο παίκτη. Η εναλλαγή των παικτών συνεχίζεται μέχρι κάποιο κριτήριο (διαφορετικό για κάθε παιχνίδι) να μας υποδείξει ότι το παιχνίδι τελείωσε με νίκη, ισοπαλία ή ήττα για την κάθε πλευρά.

Η πολυπλοκότητα του κάθε παιχνιδιού (Wikipedia, χ.χ.g) έχει άμεση σχέση με δύο παραμέτρους: (1) πόσες δυνατές κινήσεις έχει σε κάθε γύρο ο παίκτης και (2) πόσους γύρους μπορεί να έχει ένα παιχνίδι. Αυτές οι δύο παράμετροι μας επιτρέπουν να υπολογίσουμε τον χώρο καταστάσεων του παιχνιδιού (δηλαδή σε πόσες διαφορετικές καταστάσεις μπορεί να βρεθεί το παιχνίδι μας). Ένας τρόπος να φανταστούμε αυτόν τον χώρο καταστάσεων είναι σαν ένα m-αδικό δέντρο βάθους n, όπου m οι επιλογές μας σε κάθε θέση και n ο αριθμός των επιλογών (γύρων) του παιχνιδιού. Ένα m-αδικό δέντρο βάθους n έχει περίπου mn διαφορετικές καταστάσειςόμως πόσο γρήγορα μεγαλώνει ένα τέτοιο δέντρο; Για να δούμε μερικά παραδείγματα παιχνιδιών.

Ίσως έχετε παίξει τρίλιζα. Στην τρίλιζα ξεκινάμε με ένα πλέγμα 3x3 και στην αρχή έχουμε 9 επιλογές για το που θα τοποθετήσουμε το ο ή το x. Στην χειρότερη περίπτωση, μετά από 9 γύρους το παιχνίδι μας θα έχει τελειώσει καθώς και οι 9 θέσεις θα έχουν γεμίσει. Επομένως, ένα απλοϊκό άνω όριο για τον χώρο καταστάσεων είναι 99 = 387.420.489 (στην πραγματικότητα ο χώρος καταστάσεων είναι πολύ μικρότεροςγύρω στις 765 (Gary Fredericks, χ.χ.)καθώς σε κάθε κίνηση μειώνεται ο αριθμός των επιλογών μας, τα παιχνίδια μπορεί να ολοκληρωθούν πολύ πιο γρήγορα από 9 κινήσεις και κάποια παιχνίδια καταλήγουν στην ίδια κατάσταση με διαφορετική αρχική σειρά κινήσεων). Παρόλο που ο αριθμός αυτός είναι αρκετά μεγάλος για έναν άνθρωπο - θα μας έπαιρνε πολλές ώρες να παίξουμε όλες τις δυνατές παρτίδες τρίλιζας και να υπολογίσουμε τα αποτελέσματά τους - ο ίδιος υπολογισμός μπορεί να γίνει σε λιγότερο από ένα δευτερόλεπτο από έναν σύγχρονο υπολογιστή. Εάν διατρέξουμε ολόκληρο τον χώρο καταστάσεων ενός παιχνιδιού τότε μπορούμε να πούμε στην επιστήμη των υπολογιστών ότι το “λύσαμε” (Wikipedia, χ.χ.l), δηλαδή για οποιαδήποτε θέση του παιχνιδιού μπορούμε να πούμε με βεβαιότητα ποια είναι η βέλτιστη κίνηση.

Χάρη στην εξέλιξη των υπολογιστών, έχουμε καταφέρει να λύσουμε αρκετά δημοφιλή παιχνίδια με μεγάλους χώρους καταστάσεων. Για παράδειγμα η “ντάμα” (Checkers / Draughts) με χώρο καταστάσεων γύρω στο 1020 έχει λυθεί επίσημα από το 2007, όπου ερευνητές κατάφεραν να ολοκληρώσουν τον υπολογισμό ύστερα από δεκαετίες προσπάθειας (Wikipedia, χ.χ.c). Φυσικά κανένας δεν θυμάται την καλύτερη κίνηση για όλες τις 1020 καταστάσεις οπότε παρόλο που το πρόβλημα λύθηκε οι άνθρωποι μπορούν ακόμα να απολαμβάνουν αυτό το παιχνίδι σε παρτίδες μεταξύ τους.

Το 1996, ο Garry Kasparov αντιμετώπισε για πρώτη φορά τον υπερυπολογιστή Deep Blue της IBM σε ένα αγώνα σκακιού. Παρά την ήττα του σε ένα παιχνίδι, ο Kasparov κέρδισε πειστικά τον αγώνα με σκορ 4-2. Την επόμενη χρονιά (1997), αντιμετώπισε την ανανεωμένη έκδοση του Deep Blue και αυτήν την φορά υπερίσχυσε ο Deep Blue 3,5-2,5, σηματοδοτώντας την πρώτη φορά που ένας υπολογιστής κέρδισε έναν παγκόσμιο πρωταθλητή στο σκάκι σε επίσημο αγώνα. Η εξέλιξη της τεχνολογίας υπήρξε ραγδαία από τότε και σήμερα ένα απλό chess app στο κινητό μας μπορεί να κερδίσει τον παγκόσμιο πρωταθλητή.