1 ΤΜΗΜΑ ΜΠΕΣ Αλγόριθμοι Αναζήτησης Εργασία 1 Τυφλή Αναζήτηση
2 ΤΜΗΜΑ ΜΠΕΣ Το 8-puzzle Αρχική Κατάσταση Στόχου Το παιχνίδι 8-puzzle αποτελείται από 8 κινητά τετραγωνίδια που το καθένα φέρει έναν αριθμό από το 1 μέχρι το 8 και είναι τοποθετημένα σε ένα πλαίσιο 3x3 όπως δείχνει το παραπάνω σχήμα Μία από τις θέσεις είναι πάντα άδεια και επιτρέπεται η κάλυψη αυτής μόνο από ένα γειτονικό τετραγωνίδιο οπότε το κενό μετατίθεται. Το πρόβλημα του puzzle είναι από μία αρχική κατάσταση να γίνουν οι κατάλληλες μετακινήσεις τετραγωνιδίων έτσι ώστε να τοποθετηθούν οι αριθμοί σε αύξουσα διάταξη σύμφωνα με τη φορά των δεικτών του ρολογιού, όπως φαίνεται στο παραπάνω σχήμα.
3 ΤΜΗΜΑ ΜΠΕΣ Εργασία 1 - Τυφλή Αναζήτηση Υλοποιήστε πρόγραμμα που κατασκευάζει ένα πλήθος από τυχαίες αρχικές καταστάσεις για το 8-puzzle. Το πλήθος αυτό n προσδιορίζεται από τον χρήστη. Για κάθε αρχική κατάσταση επιλύστε το πρόβλημα χρησιμοποιώντας τους εξής αλγόριθμους τυφλής αναζήτησης: Αναζήτηση πρώτα κατά πλάτος (BFS) με ή χωρίς αποφυγή επαναλαμβανόμενων καταστάσεων (δική σας επιλογή) Αναζήτηση πρώτα κατά βάθος (DFS) Αναζήτηση πρώτα κατά βάθος με επαναληπτική εκβάθυνση (IDS). Για τον αλγόριθμο αυτό το βήμα αύξησης του ορίου αναζήτησης θα είναι 1 Αναζήτηση πρώτα κατά βάθος με αποφυγή επαναλαμβανόμενων καταστάσεων
4 ΤΜΗΜΑ ΜΠΕΣ Εργασία 1 - Τυφλή Αναζήτηση Μετά την ολοκλήρωση της εκτέλεσης κάθε αλγορίθμου να τυπώνεται το μονοπάτι της λύσης που βρέθηκε και το πλήθος των κόμβων στο μονοπάτι αυτό (αν έχει βρεθεί λύση). Μετά την επίλυση των n προβλημάτων να τυπώνεται το μέσο πλήθος κόμβων που επισκέφθηκε ο κάθε αλγόριθμος, καθώς και το πλήθος των προβλημάτων στα οποία ο κάθε αλγόριθμος βρήκε λύση. Η υλοποίηση μπορεί να γίνει σε μια γλώσσα όπως η Java, η C, και η C++ σε ομάδες ως και τριών ατόμων. Προθεσμία παράδοσης άσκησης: 29/11/2007. Τρόπος παράδοσης: με στο και (συζευκτικό) με παρουσίαση στο εργαστήριο στις 29/11 ή σε οποιοδήποτε εργαστήριο μέχρι τότε. Να σημειωθεί ότι η παρουσίαση στο εργαστήριο είναι
5 ΤΜΗΜΑ ΜΠΕΣ Θέματα Υλοποίησης Πως θα αναπαρασταθεί η αρχική κατάσταση? μονοδιάστατος ή δυσδιάστατος πίνακας? Πως θα αναπαρασταθούν οι υπόλοιπες καταστάσεις? παρομοίως? Πως θα υλοποιηθεί το τεστ στόχου? πρέπει να ελέγξετε αν η τρέχουσα κατάσταση και η κατάσταση στόχου ταυτίζονται Πως θα υλοποιηθούν οι κόμβοι του δέντρου αναζήτησης και το μέτωπο αναζήτησης? κλάσεις? structs? ουρά Πως θα γίνει η αποφυγή επαναλαμβανόμενων καταστάσεων?
6 ΤΜΗΜΑ ΜΠΕΣ Κόμβοι του δέντρου αναζήτησης Οι κόμβοι του δέντρου αναζήτησης μπορούν γενικά να αναπαρασταθούν με μια δομή δεδομένων (κλάση ή struct) με 5 συστατικά (από τα οποία σας ενδιαφέρουν τα 4): ΚΑΤΑΣΤΑΣΗ η κατάσταση στην οποία αντιστοιχεί ο κόμβος (πίνακας?) ΠΑΤΡΙΚΟΣ ΚΟΜΒΟΣ ένας δείκτης στον κόμβο που δημιούργησε τον συγκεκριμένο κόμβο ΕΝΕΡΓΕΙΑ η ενέργεια που εφαρμόστηκε για τη δημιουργία του κόμβου (ποια από τις 4 δυνατές?) ΚΟΣΤΟΣ ΜΟΝΟΠΑΤΙΟΥ το κόστος του μονοπατιού από την αρχική κατάσταση ως τον συγκεκριμένο κόμβο ΒΑΘΟΣ το πλήθος των κόμβων στο μονοπάτι από τη ρίζα ως τον συγκεκριμένο
7 ΤΜΗΜΑ ΜΠΕΣ Το Μέτωπο Αναζήτησης (fringe or frontier) Το σύνολο των κόμβων που περιμένουν επέκταση ονομάζεται μέτωπο αναζήτησης. Μπορεί να υλοποιηθεί με μια ουρά με τις παρακάτω λειτουργίες: MakeQueue (Elements) Δημιουργεί μια ουρά με τα δεδομένα στοιχεία Empty? (Queue) επιστρέφει true αν δεν υπάρχουν στοιχεία στην ουρά RemoveFront (Queue) βγάζει το πρώτο στοιχείο της ουράς Queuing-Fn (Elements, Queue) συνάρτηση που εισάγει ένα σύνολο στοιχείων στην ουρά διαφορετικές παραλλαγές της συνάρτησης δίνουν διαφορετικούς αλγόριθμους αναζήτησης
8 ΤΜΗΜΑ ΜΠΕΣ Γενικός Αλγόριθμος Αναζήτησης function TreeSearch (problem, Queuing-Fn) returns a solution or failure fringe MakeQueue(MakeNode(IninitialState[problem])) loop do if fringe is empty then return failure node RemoveFront(fringe) if GoalTest[problem] applied to State[node] succeeds then return node fringe Queuing-Fn(fringe,Expand(node, problem)) end Η συνάρτηση Expand υπολογίζει τους κόμβους που παράγονται από μια επέκταση
9 ΤΜΗΜΑ ΜΠΕΣ Γενικός Αλγόριθμος Αναζήτησης function Expand (node, problem) returns a set of nodes successors the empty set for each in Successor-fn[problem][State[node]) do s a new node State[s] result Parent-Node[s] node Action[s] action Path-Cost[s] Path-Cost[node] + Step-Cost(node,action,s) Depth[s] Depth[node] + 1 add s to successors return successors
10 ΤΜΗΜΑ ΜΠΕΣ Γενικά για την Υλοποίηση Για τον BFS μπορείτε να χρησιμοποιήσετε μια fist-in-first-out ουρά Για τον DFS και τις παραλλαγές του μπορείτε να χρησιμοποιήσετε μια last-in-first-out ουρά Ο IDS είναι DFS μέσα σε ένα loop που αυξάνει το όριο αναζήτησης κάθε φορά που αρχίζει η εκτέλεση του loop ξεκινάει από την αρχή. Ότι πληροφορία υπήρχε από την προηγούμενη εκτέλεση χάνεται. Για τους αλγόριθμους αποφυγής επαναλαμβανόμενων καταστάσεων πρέπει στην περίπτωση του DFS να ελέγχετε αν ο τρέχων κόμβος βρίσκεται ήδη στη μνήμη γενικά, να κρατάτε στη μνήμη το σύνολο των καταστάσεων που έχουν ήδη επεκταθεί (κλειστή λίστα) π.χ. χρησιμοποιώντας μια λίστα όπου τις προσθέτετε