Αλγόριθμοι Αναζήτησης Εργασία 1 Τυφλή Αναζήτηση ΤΜΗΜΑ ΜΠΕΣ
Εύρεση Μονοπατιού σε Λαβύρινθο X G D S Έστω ο λαβύρινθος του σχήματος με ένα σημείο εισόδου S, και τρία σημεία εξόδου G. Έστω ότι ένα ρομπότ, το οποίο μπορεί να κινηθεί μόνο οριζόντια και κάθετα, εισέρχεται από το σημείο S και πρέπει να βρει ένα μονοπάτι από το S σε κάποιο από τα G. Με Χ συμβολίζονται τα τετραγωνάκια στα οποία δεν μπορεί να κινηθεί το ρομπότ. Με D συμβολίζονται οι πόρτες που υπάρχουν στον λαβύρινθο. Το κόστος μετακίνησης από ένα τετραγωνάκι σε ένα λευκό τετραγωνάκι είναι 1. Το κόστος μετακίνησης από ένα τετραγωνάκι σε ένα τετραγωνάκι που αντιστοιχεί σε πόρτα είναι 2. X G D S ΤΜΗΜΑ ΜΠΕΣ
Εργασία 1 - Τυφλή Αναζήτηση Υλοποιήστε πρόγραμμα που επιλύει το πρόβλημα εύρεσης μονοπατιού στον λαβύρινθο χρησιμοποιώντας τους εξής αλγόριθμους τυφλής αναζήτησης: Αναζήτηση πρώτα κατά πλάτος (BFS) με ή χωρίς αποφυγή επαναλαμβανόμενων καταστάσεων (δική σας επιλογή) Αναζήτηση ενιαίου κόστους (UCS) Αναζήτηση επαναληπτικήw εκβάθυνση (IDS). Για τον αλγόριθμο αυτό το βήμα αύξησης του ορίου αναζήτησης θα είναι 1 Η αναζήτηση κατά βάθος καλύτερα να υλοποιηθεί με αποφυγή επαναλαμβανόμενων καταστάσεων ΤΜΗΜΑ ΜΠΕΣ
Εργασία 1 - Τυφλή Αναζήτηση Μετά την ολοκλήρωση της εκτέλεσης κάθε αλγορίθμου να τυπώνεται το μονοπάτι της λύσης που βρέθηκε και το κόστος του μονοπατιού. Επίσης πρέπει να τυπώνεται το πλήθος κόμβων στο δέντρο αναζήτησης που δημιούργησε ο κάθε αλγόριθμος. Η υλοποίηση μπορεί να γίνει σε μια γλώσσα όπως η Java, η C, και η C++ σε ομάδες ως και δύο ατόμων. Προθεσμία παράδοσης άσκησης: 19/11/2008. Τρόπος παράδοσης: ο κώδικας με email στον konsterg@aegean.gr και (συζευκτικό) με παρουσίαση στο εργαστήριο στις 19/11 ή σε οποιοδήποτε εργαστήριο μέχρι τότε. Να σημειωθεί ότι η παρουσίαση στο εργαστήριο είναι υποχρεωτική. ΤΜΗΜΑ ΜΠΕΣ
Θέματα Υλοποίησης Πρώτα από όλα, είναι απαραίτητο να αποθηκευτεί σε κάποια δομή η τοπολογία του λαβύρινθου, ώστε ο πράκτορας να έχει πλήρη επίγνωση του περιβάλλοντος! δηλ. να αποθηκευτούν οι θέσεις του S, των G, των κενών, των X, των D. Πως μπορεί να γίνει αυτό? Με δυσδιάστατο πίνακα? Με μονοδιάστατο πίνακα? Με διασυνδεδεμένες λίστες? Σε άλλη δομή? Όπως θέλετε... Η αρχικοποίηση της δομής μπορεί να γίνει είτε διαβάζοντας από αρχείο (για να είναι το πρόγραμμα πιο γενικό) είτε κατευθείαν μέσα στον κώδικα ΤΜΗΜΑ ΜΠΕΣ
Θέματα Υλοποίησης Πως θα αναπαρασταθεί η αρχική κατάσταση? Είναι απαραίτητο να αποθηκεύεται η θέση όλων των Χ και D? Ή μήπως αρκεί κάτι πιο απλό? Πως θα αναπαρασταθούν οι υπόλοιπες καταστάσεις? παρομοίως? Πως θα υλοποιηθεί το τεστ στόχου? πρέπει να ελέγξετε αν η τρέχουσα κατάσταση και η κατάσταση στόχου ταυτίζονται Πως θα υλοποιηθούν οι κόμβοι του δέντρου αναζήτησης και το μέτωπο αναζήτησης? κλάσεις? structs? ουρά Πως θα γίνει η αποφυγή επαναλαμβανόμενων καταστάσεων? ΤΜΗΜΑ ΜΠΕΣ
Κόμβοι του δέντρου αναζήτησης Οι κόμβοι του δέντρου αναζήτησης μπορούν γενικά να αναπαρασταθούν με μια δομή δεδομένων (κλάση ή struct) με 4 συστατικά: ΚΑΤΑΣΤΑΣΗ η κατάσταση στην οποία αντιστοιχεί ο κόμβος (τι είπαμε ότι είναι?) ΠΑΤΡΙΚΟΣ ΚΟΜΒΟΣ ένας δείκτης στον κόμβο που δημιούργησε τον συγκεκριμένο κόμβο ΕΝΕΡΓΕΙΑ η ενέργεια που εφαρμόστηκε για τη δημιουργία του κόμβου (είναι απαραίτητο να γνωρίζουμε την ενέργεια?) ΚΟΣΤΟΣ ΜΟΝΟΠΑΤΙΟΥ το κόστος του μονοπατιού από την αρχική κατάσταση ως τον συγκεκριμένο κόμβο ΒΑΘΟΣ το πλήθος των κόμβων στο μονοπάτι από τη ρίζα ως τον συγκεκριμένο ΤΜΗΜΑ ΜΠΕΣ
Το Μέτωπο Αναζήτησης (fringe or frontier) Το σύνολο των κόμβων που περιμένουν επέκταση ονομάζεται μέτωπο αναζήτησης. Μπορεί να υλοποιηθεί με μια ουρά με τις παρακάτω λειτουργίες: MakeQueue (Elements) Δημιουργεί μια ουρά με τα δεδομένα στοιχεία Empty? (Queue) επιστρέφει true αν δεν υπάρχουν στοιχεία στην ουρά RemoveFront (Queue) βγάζει το πρώτο στοιχείο της ουράς Queuing-Fn (Elements, Queue) συνάρτηση που εισάγει ένα σύνολο στοιχείων στην ουρά διαφορετικές παραλλαγές της συνάρτησης δίνουν διαφορετικούς αλγόριθμους αναζήτησης ΤΜΗΜΑ ΜΠΕΣ
Γενικός Αλγόριθμος Αναζήτησης 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 υπολογίζει τους κόμβους που παράγονται από μια επέκταση ΤΜΗΜΑ ΜΠΕΣ
Γενικός Αλγόριθμος Αναζήτησης function Expand (node, problem) returns a set of nodes successors the empty set for each <action,result> 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 ΤΜΗΜΑ ΜΠΕΣ
Γενικά για την Υλοποίηση Για τον BFS μπορείτε να χρησιμοποιήσετε μια fist-in-first-out ουρά Ο IDS είναι DFS μέσα σε ένα loop που αυξάνει το όριο αναζήτησης κάθε φορά που αρχίζει η εκτέλεση του loop ξεκινάει από την αρχή. Ότι πληροφορία υπήρχε από την προηγούμενη εκτέλεση χάνεται. Για τον DFS μπορείτε να χρησιμοποιήσετε μια last-in-first-out ουρά Για την αποφυγή επαναλαμβανόμενων καταστάσεων πρέπει στην περίπτωση του DFS να ελέγχετε αν ο τρέχων κόμβος βρίσκεται ήδη στη μνήμη γενικά, να κρατάτε στη μνήμη το σύνολο των καταστάσεων που έχουν ήδη επεκταθεί (κλειστή λίστα) π.χ. χρησιμοποιώντας μια λίστα όπου τις προσθέτετε ΤΜΗΜΑ ΜΠΕΣ