ΣΗΜΕΙΩΣΕΙΣ ΤΕΛΙΚΗΣ ΕΡΓΑΣΙΑΣ ΤΟΥ ΜΑΘΗΜΑΤΟΣ «ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ» Κωνσταντίνος Π. Φερεντίνος Διδάσκων ΠΔ 407/80 Οι σημειώσεις αυτές αναπτύχθηκαν στα πλαίσια του προγράμματος «ΕΠΕΑΕΚ 2 Πρόγραμμα Αναβάθμισης Προπτυχιακών Σπουδών» ΙΟΥΝΙΟΣ 2005
Εισαγωγικές σημειώσεις τελικής εργασίας «Βελτιστοποίηση με τον αλγόριθμο Partcle Swarm Optmzaton» Βελτιστοποίηση συνάρτησης ονομάζεται η εύρεση της «καλύτερης» τιμής της συνάρτησης στο πεδίο ορισμού της (όπως αυτό ορίζεται από το είδος της συνάρτησης ή κάποιους περιορισμούς του προβλήματος), όπου καλύτερη τιμή είναι είτε το μέγιστο είτε το ελάχιστο, οπότε και μιλάμε για μεγιστοποίηση ή ελαχιστοποίηση αντίστοιχα. Η διαδικασία της βελτιστοποίησης κάποιας συνάρτησης διενεργείται από ειδικά σχεδιασμένους αλγόριθμους βελτιστοποίησης. Οι αλγόριθμοι αυτοί χοντρικά μπορούν να χωριστούν σε αναλυτικούς αλγόριθμους, που βασίζονται σε συγκεκριμένες μαθηματικές ιδιότητες και τεχνικές, και σε ευρεστικούς αλγόριθμους (heurstcs) που βασίζονται σε ένα συνδυασμό μαθηματικών ιδιοτήτων, γνώσης κάποιων χαρακτηριστικών των προς επίλυση προβλημάτων και τεχνικών της επιστήμης των υπολογιστών και της τεχνητής νοημοσύνης. Heurstc αλγόριθμοι εφαρμόζονται στη βελτιστοποίηση συναρτήσεων που η πολυπλοκότητά τους είναι τέτοια ώστε αναλυτικές μαθηματικές μεθοδολογίες θα αποτύγχαναν να δώσουν ικανοποιητικό αποτέλεσμα σε κάποιο λογικό χρόνο. Ο Partcle Swarm Optmzaton (PSO) είναι ένας heurstc αλγόριθμος βελτιστοποίησης που αναπτύχθηκε πρόσφατα (1995) από τους R. Eberhart και J. Kennedy. Είναι ένας επαναληπτικός αλγόριθμος που διαχειρίζεται έναν αριθμό πρακτόρων (agents) οι οποίοι ψάχνουν για το βέλτιστο μιας συνάρτησης στο πεδίο ορισμού της (search space), κινούμενοι με τρόπο εμπνευσμένο από τη συμπεριφορά κοινωνικών ζώων όπως ομάδες πουλιών ή κοπάδια ψαριών. (Όλοι οι αλγόριθμοι βελτιστοποίησης που μιμούνται διαδικασίες από τη συμπεριφορά κοινωνικών οργανισμών, ανήκουν στον τομέα της επιστήμης υπολογιστών που ονομάζεται Swarm Intellgence). Η διάσταση του προς επίλυση προβλήματος (πλήθος μεταβλητών) μπορεί να είναι αρκετά μεγάλη, αλλά ας δούμε τον αλγόριθμο του PSO στις 2 διαστάσεις, x και y. Καλούμαστε λοιπόν να βελτιστοποιήσουμε μια συνάρτηση f(x,y) σε κάποιο συγκεκριμένο πεδίο ορισμού. Είπαμε ότι ο PSO διαχειρίζεται ένα συγκεκριμένο αριθμό από agents. Ο κάθε agent έχει: - θέση (x,y) - ταχύτητα (vx, vy), όπου είναι το βήμα μετακίνησής του σε κάθε διάσταση κατά την επόμενη επανάληψη του αλγόριθμου - γειτονιά (neghborhood), όπου είναι κάποιοι άλλοι συγκεκριμένοι agents μαζί με τους οποίους ο κάθε agent σχηματίζει μια ομάδα (γειτονιά). ενώ ο κάθε agent ξέρει: - την καλύτερή του θέση (xbest, ybest) μέχρι την τρέχουσα επανάληψη και την τιμή της (pbest)
- την καλύτερη θέση της γειτονιάς του (gxbest, gybest) μέχρι την τρέχουσα επανάληψη και την τιμή της (gbest). Ο αλγόριθμος έχει ως εξής: 1. Αρχικά nputs: Κάποιες σταθερές που δίνονται σαν nputs στον αλγόριθμο είναι: o το πλήθος των agents (συνήθως 20) o το μέγεθος των γειτονιών (ίδιο για όλες, συνήθως 3-5) (μπορεί ο κάθε agent να ανήκει σε πολλές γειτονιές μία από αυτές όμως θεωρείται δικιά του) o ο μέγιστος αριθμός επαναλήψεων (π.χ. 1000) o διάφορες άλλες σταθερές 2. Αρχικοποίηση: o Τοποθέτηση των agents σε τυχαία σημεία του πεδίου ορισμού (search space) (δηλαδή, τυχαία τιμή για κάθε διάσταση (x, y) του κάθε agent) o Υπολογισμός τυχαίων αρχικών ταχυτήτων (βημάτων μετακίνησης) για κάθε agent (δηλαδή, τυχαίες τιμές (δx, δy) μεταξύ κάποιων ορίων (-ε, ε) για κάθε agent. Η ταχύτητα ορίζεται ως η μεταβολή της θέσης του agent σε μία επανάληψη). o Η τυχαία αρχική θέση του κάθε agent είναι η (xbest, ybest) για τον agent αυτό, και η τιμή της συνάρτησης στη θέση αυτή αποτελεί την pbest του (personal best). 3. Δημιουργία των γειτονιών: Ο συνηθέστερος τρόπος είναι να βάλουμε τους agents σε νοητό κύκλο και να επιλέγουμε τους γειτονικούς agents του καθενός ως αυτούς που θα αποτελούν τη γειτονιά του. Το παρακάτω σχήμα για παράδειγμα, δείχνει τη γειτονιά του agent 1 σε έναν αλγόριθμο με 8 agents.
Ομοίως η γειτονιά το agent 2 θα αποτελείται από τους agents 1, 2 και 3. Είναι προφανές ότι ένας agent ανήκει σε περισσότερες της μίας γειτονιές, αλλά όταν μιλάμε για τη γειτονιά ενός agent, μιλάμε για το σύνολο των agents που ανήκουν στη γειτονιά που φτιάχτηκε γύρω από αυτόν. Δηλαδή, στο παράδειγμά μας, ο agent 1 ανήκει και στη γειτονιά [8, 1, 2] και στη γειτονιά [1, 2, 3], καθώς και σε άλλες, αλλά όταν μιλάμε για τη γειτονιά του agent 1, μιλάμε για τη γειτονιά [8, 1, 2] που φαίνεται στο σχήμα. Να σημειωθεί εδώ ότι ο όρος «γειτονιά» δεν αντιστοιχεί απαραίτητα σε «γεωγραφική» γειτνίαση των agents στο πεδίο ορισμού της συνάρτησης. Μπορεί οι agents 1 και 2 που ανήκουν και οι δύο στη γειτονιά π.χ. του 1, να βρίσκονται σε τελείως διαφορετικά μέρη του search space. Η γειτνίαση που ορίσαμε ονομάζεται «κοινωνική» και απλά ομαδοποιεί τους agents με τη σειρά που εμείς ορίζουμε, άσχετα με την αρχική τους θέση. 4. Η τιμή του καλύτερου agent κάθε γειτονιάς γίνεται το gbest της (group s best). Μαζί με την τιμή της συνάρτησης gbest, αποθηκεύεται φυσικά και η θέση της τιμής αυτής στο search space. 5. Για κάθε επανάληψη, μέχρι το μέγιστο αριθμό επαναλήψεων: o Υπολογίζεται η νέα ταχύτητα του κάθε agent : v = w v + c rand [ t] [ ] ( pbest s ) + c rand ( gbest s ) [ t+ 1] [ t] t 1 1 2 2 όπου: [ t+1] v [t ] v είναι η ταχύτητα του agent στην επόμενη επανάληψη είναι η ταχύτητα του agent στην τρέχουσα επανάληψη (t) [t ] s είναι η τρέχουσα θέση του agent στην τρέχουσα επανάληψη pbest είναι η θέση του pbest (personal best) του agent gbest είναι η θέση του gbest (group s best) της γειτονιάς του agent w, c 1 και c 2 είναι κάποιες σταθερές που δίνονται στην αρχή του αλγόριθμου rand 1 και rand 2 είναι μεταβλητές που παίρνουν τυχαίες τιμές (προσοχή στο ότι ο παραπάνω τύπος περιλαμβάνει όλες τις διαστάσεις του προβλήματος και κανονικά πρέπει να εφαρμοστεί σε κάθε διάσταση) o Γίνεται μετακίνηση του κάθε agent προσθέτοντας στις τρέχουσες θέσεις τις αντίστοιχες ταχύτητες (βήμα μετακίνησης) του καθενός: s = s + v [ t+ 1] [ t] [ t+ 1] o Γίνεται update των τιμών (και θέσεων) των pbest και gbest του κάθε agent. 6. Αφού γίνουν όλες οι προβλεπόμενες επαναλήψεις, επιστρέφεται η τιμή και η θέση του καλύτερου gbest, το οποίο αποτελεί και το βέλτιστο της συνάρτησης. Αυτός είναι σε γενικές γραμμές ο αλγόριθμος PSO.
ΣΚΟΠΟΣ ΕΡΓΑΣΙΑΣ: Ο σκοπός της εργασίας είναι να γραφεί ο PSO σε μορφή αντικειμενοστραφούς προγραμματισμού με τη χρήση της JAVA. Θα δοθούν περισσότερες και πιο συγκεκριμένες οδηγίες σε μελλοντική ανακοίνωση. ΒΑΘΜΟΛΟΓΗΣΗ: Η εργασία είναι προαιρετική. Θα βαθμολογηθεί με άριστα το 2 και θα μετρήσει για όσους γράψουν τουλάχιστον 5 στο διαγώνισμα, σαν bonus. ΗΜΕΡΟΜΗΝΙΑ ΠΑΡΑΔΟΣΗΣ: Μετά τις εξετάσεις του Ιουνίου. Η ακριβής ημερομηνία θα καθοριστεί στο μέλλον. ΣΥΜΒΟΥΛΕΣ: Το πρόγραμμα θα πρέπει: - να είναι γενικό ως προς τις παραμέτρους του αλγόριθμου (πλήθος των agents, μέγεθος γειτονιών, κτλ.) οι οποίες θα δίνονται από τον χρήστη σαν nputs από αντίστοιχα nput wndows (JOptonPane). Αντιθέτως, στη συγκεκριμένη εργασία, το πρόγραμμα θα είναι εξειδικευμένο ως προς τη συνάρτηση που θα βελτιστοποιηθεί, η οποία θα δοθεί. (Παρόλα αυτά, ο αριθμός των διαστάσεων (μεταβλητών) του προβλήματος θα είναι ένα από τα user nputs στην αρχή του προγράμματος). - να έχει σχόλια με τη μορφή που υπάρχουν στα παραδείγματα των σημειώσεων της 7 ης εβδομάδας (κλάσεις Person, Student και Undergrad του παραδείγματος της κληρονομικότητας) ώστε να γίνεται κατανοητό από κάποιον που δεν το έχει γράψει ο ίδιος. - να περιέχει όσο το δυνατόν περισσότερα prvate στοιχεία και να μην περιέχει αναφορές μεταβλητών απ ευθείας από αντικείμενα διαφορετικών κλάσεων (objectname.varablename). Ο τρόπος αυτός θα πρέπει να εφαρμόζεται μόνο στις κλήσεις μεθόδων (objectname.methodname()). Για αναφορές σε prvate μεταβλητές, χρησιμοποιούνται οι accessor μέθοδοι. - να ακολουθεί τη φιλοσοφία του αντικειμενοστραφούς προγραμματισμού στο μεγαλύτερο δυνατό βαθμό. ΔΙΕΥΚΟΛΥΝΣΗ ΣΤΗ ΓΕΝΙΚΗ ΔΗΜΙΟΥΡΓΙΑ «ΓΕΙΤΟΝΙΩΝ» ΤΟΥ PSO: Για να γίνει ευκολότερη η γενίκευση της δημιουργίας γειτονιών, θεωρείστε ότι αν το μέγεθος των γειτονιών είναι γ, τότε η γειτονιά του κάθε agent ορίζεται σαν ο εαυτός του και οι επόμενοι γ-1 agents στον νοητό κύκλο, και όχι κάποιοι πριν από αυτόν και κάποιοι μετά από αυτόν, όπως στη μέθοδο που ορίστηκε παραπάνω, με το σχήμα (θα υπήρχε πρόβλημα σε περιπτώσεις άρτιων μεγεθών γειτονιών...). Έτσι, για το παράδειγμα των 8 agents και γ=3, η γειτονιά που φαίνεται στο σχήμα είναι του agent 8, ενώ η γειτονιά του agent 1, θα είχε τους agents [1, 2, 3].
Τελικές σημειώσεις εργασίας 1 «Βελτιστοποίηση με τον αλγόριθμο Partcle Swarm Optmzaton (PSO)» Οι λεπτομέρειες του αλγόριθμου περιγράφονται στο κείμενο «Εισαγωγικές Σημειώσεις». ΣΚΟΠΟΣ ΕΡΓΑΣΙΑΣ: Ο σκοπός της εργασίας είναι να γραφεί ο αλγόριθμος PSO σε μορφή αντικειμενοστραφούς προγραμματισμού με τη χρήση της JAVA. Η μεθοδολογία που θα ακολουθηθεί δεν περιορίζεται με συγκεκριμένες «προγραμματιστικές» οδηγίες, όμως θα πρέπει να ακολουθηθεί ο αντικειμενοστραφής τρόπος προγραμματισμού (βλέπε παράγραφο «Συμβουλές» των εισαγωγικών σημειώσεων). Αντί της εξίσωσης προσδιορισμού της ταχύτητας του κάθε πράκτορα (partcle) που αναγράφεται στις εισαγωγικές σημειώσεις, να χρησιμοποιηθεί η εξής βελτιωμένη μορφή της εξίσωσης: Η νέα ταχύτητα του κάθε partcle (ή agent) : v t+ 1 = χ t t [ v + ϕ rand ( pbest s ) + ϕ rand ( gbest s )] t 1 1 2 2 όπου: [ t+1] v [t ] v είναι η ταχύτητα του agent στην επόμενη επανάληψη είναι η ταχύτητα του agent στην τρέχουσα επανάληψη (t) [t ] s είναι η τρέχουσα θέση του agent στην τρέχουσα επανάληψη pbest είναι η θέση του pbest (personal best) του agent gbest είναι η θέση του gbest (group s best) της γειτονιάς του agent χ, φ 1 και φ 2 είναι κάποιες σταθερές που δίνονται στην αρχή του αλγόριθμου rand 1 και rand 2 είναι μεταβλητές που παίρνουν τυχαίες τιμές (0-1) (προσοχή στο ότι ο παραπάνω τύπος περιλαμβάνει όλες τις διαστάσεις του προβλήματος και κανονικά πρέπει να εφαρμοστεί για κάθε διάσταση) Οι τιμές των σταθερών θα δίνονται από τον χρήστη (με χρήση του JOptonPane). Για τη δοκιμή του αλγόριθμου, χρησιμοποιήστε τις εξής τιμές: χ = 0.4 φ 1 = 1.6 φ 2 = 2.5 1 Οι σημειώσεις αυτές συμπληρώνουν τις «εισαγωγικές σημειώσεις» που αφορούν την προαιρετική εργασία του μαθήματος «Γλώσσες Προγραμματισμού (JAVA)» (2004-05) και βρίσκονται στην ιστοσελίδα του μαθήματος.
Οι τυχαίες μεταβλητές (rand1 και rand2) υπολογίζονται με τη χρήση της Math.random() που επιστρέφει τυχαίες τιμές με ομοιόμορφη κατανομή μεταξύ 0 και 1. Η συνάρτηση στην οποία θα δοκιμασθεί ο αλγόριθμος είναι η De Jong s functon 2 ή αλλιώς Rosenbrock s valley, επίσης γνωστή και ως Banana functon. Το ολικό βέλτιστο (ελάχιστο) της συνάρτησης αυτής βρίσκεται σε μια στενή και μακριά παραβολική «κοιλάδα» και έχει την τιμή 0. Συγκεκριμένα, η συνάρτηση είναι η: f(x) = sum (100 * ( x(+1) x() ^2) ^2 + (1-x()) ^2), = 1, n-1 με πεδίο ορισμού: -2.048 <= x() <= 2.048. η οποία έχει ολικό ελάχιστο: f(x_opt) = 0, στο σημείο x_opt() = 1, = 1, n. Σε μαθηματική μορφή, η συνάρτηση είναι η: f [ ] n 1 2 2 2 ( x) = 100 ( x( + 1) x( ) ) + ( 1 x( ) ) = 1 όπου n είναι ο αριθμός των διαστάσεων του προβλήματος και = 1, n-1. Θα δοκιμαστεί λοιπόν ο αλγόριθμος στη βελτιστοποίηση (εύρεση του ελάχιστου) αυτής της συνάρτησης στις 4 διαστάσεις. Τα nputs λοιπόν του αλγόριθμου, εκτός από τα τις παραμέτρους που δόθηκαν παραπάνω, είναι τα εξής: διαστάσεις = 4 αριθμός agents (partcles) = 20 μέγεθος γειτονιάς = 3 αριθμός επαναλήψεων = 1000 και θα δίνονται και αυτά από τον χρήστη (JOptonPane). Μέσα στον αλγόριθμο θα υπάρχουν σαν σταθερές μεταβλητές τα όρια του πεδίου ορισμού για την κάθε διάσταση (μέγιστο και ελάχιστο). Κάθε φορά που θα «κινείται» στην κάθε διάσταση ο κάθε agent, θα πρέπει να ελέγχεται εάν η θέση του παραμένει μέσα στο πεδίο ορισμού και σε διαφορετική περίπτωση να περιορίζεται στο αντίστοιχο όριο του πεδίου ορισμού (-2.048 ή 2.048). Η αρχική θέση του κάθε agent θα είναι τυχαία (δηλαδή για τον κάθε agent θα πρέπει να υπολογιστούν αρχικά 4 τυχαίες τιμές μεταξύ -2.048 και 2.048). Ένας απλός τρόπος που προσεγγίζει κάτι τέτοιο είναι με τη χρήση της Math.random() ως εξής: 4 * Math.random() 2;
Η Math.random() δίνει έναν τυχαίο πραγματικό αριθμό στο [0,1), άρα η 4*Math.random() παίρνει τιμές στο [0,4) και άρα η 4*Math.random() 2 στο [-2,2). Το output του προγράμματος θα είναι η τιμή του καλύτερου gbest μεταξύ όλων των γειτονιών σε κάθε επανάληψη του αλγόριθμου, καθώς και η θέση του. Το πρόγραμμα θα σώζει τα αποτελέσματα σε δύο αρχεία: - ένα αρχείο (values.txt) στο οποίο θα σώζεται η τιμή του βέλτιστου για κάθε επανάληψη (δηλαδή 1000 τιμές, μία σε κάθε γραμμή) - ένα αρχείο (postons.txt) στο οποίο θα σώζεται η αντίστοιχη θέση του βέλτιστου της κάθε επανάληψης (4 τιμές ανά γραμμή, για τις 4 διαστάσεις του προβλήματος). Το περιεχόμενο της μεθόδου man την οποία θα περιέχει η «κλάση εφαρμογής» του προγράμματος, θα πρέπει να περιοριστεί στο ελάχιστο. Όλες οι διεργασίες του αλγόριθμου μπορούν να πραγματοποιηθούν σε «κλάσεις υποστήριξης» ώστε η μέθοδος man απλά να εκτελεί τα απολύτως απαραίτητα ώστε να «τρέχει» το πρόγραμμα. Θα πρέπει να παραδοθούν τα εξής: - Εκτύπωση του κώδικα του προγράμματος - CD (ή δισκέτα) με όλα τα αρχεία του προγράμματος. Μην ξεχάσετε να συμβουλευτείτε την παράγραφο «Συμβουλές» των «Εισαγωγικών Σημειώσεων» της εργασίας. Η ημερομηνία παράδοσης θα ανακοινωθεί στην ιστοσελίδα του μαθήματος. Καλή επιτυχία!