Προγραμματιστική Εργασία Ημερομηνία Παράδοσης: 19 Μαΐου 2006 1 Τίπρέπεινακάνετεγιατηνεργασίααυτή Θεωρούμεότιέχουμεένασύνολοαπό nσημείαστιςδύοδιαστάσεις.γιατηνεργασίααυτήθαπρέπεινα γράψετε ένα πρόγραμμα το οποίο να υπολογίζει το Ευκλείδειο ελάχιστο επικαλύπτον δέντρο (Euclidean minimum spanning tree) του συνόλου των σημείων. Ο αλγόριθμος/κώδικάς σας θα πρέπει να τρέχει σεχρόνο O(n lg n). Τα παραπάνω θα εξηγηθούν με περισσότερες λεπτομέρειες στη συνέχεια. 2 Προδιαγραφές Τοπρόγραμμάσαςθαπρέπειναείναιγραμμένοσε CήC++. Θαπρέπεινασυμμορφώνεταιμετις απαιτήσεις που περιγράφονται παρακάτω στις Παραγράφους 3 και 6. Μπορείτε να θεωρήσετε ότι τα αρχεία δεδομένων δεν περιέχουν λάθη στην καταγραφή των δεδομένων οπότε δε χρειάζεται τα προγράμματά σας να ελέγχουν για λάθη στα δεδομένα. Οι συντεταγμένες των σημείων θα είναι αριθμοί που θα αναπαρίστανται από αριθμούς κινητής υποδιαστολής διπλής ακρίβειας(double). Τα προγράμματά σας θα πρέπει να μεταγλωττίζονται στους υπολογιστές των αιθουσών Η205 ή Λ205 με τους μεταγλωττιστές gcc/g++ της C/C++ που υπάρχουν εγκατεστημένοι στους υπολογιστές αυτούς. Αν θέλετε να χρησιμοποιήσετε τη βιβλιοθήκη Cgal, είτε κατευθείαν είτε εμμέσως μέσω των intefaces που σας δίνονται(βλέπε Παράγραφο 5) θα πρέπει να χρησιμοποιήσετε μεταγλωττιστή της C++, έστω καιανοκώδικάςσαςείναισε C. Η εργασία αυτή είναι ατομική. Στην κείμενο που θα παραδώσετε, καθώς επίσης και σε κάθε αρχείο με κώδικα που θα παραδώσετε(βλέπε Παράγραφο 7) σημειώστε το ονοματεπώνυμο και τον αριθμό μητρώου σας(αν έχετε), καθώς και τμήμα σας ή το μεταπτυχιακό πρόγραμμα στο οποίο ανήκετε. Αναφέρετε με σαφήνεια όλες τις πηγές σας(βιβλιογραφικές, διαδικτυακές, κτλ.), και ειδικότερα αν πρόκειται για κώδικα. 3 Επικοινωνία με το χρήστη(user interface) Η int main(int argc, char* argv[]) του προγράμματός σας θα πρέπει να βρίσκεται σε ένα αρχείο μεόνομα cg project.cή cg project.cpp(αναλόγωςτουανέχετεγράψειτοπρόγραμμάσαςσε Cή C++ αντίστοιχα). Το πρόγραμμά σας θα πρέπει να παίρνει δύο παραμέτρους(command line arguments). Ηπρώτηθαείναιτοόνοματουαρχείουαπότοοποίοτοπρόγραμμάσαςθαδιαβάζειτασημεία. Η δεύτερηθαείναιτοόνοματουαρχείουστοοποίοτοπρόγραμμάσαςθαγράψειτααποτελέσματατων υπολογισμών σας. 3.1 Αρχείο δεδομένων με σημεία Το αρχείο δεδομένων περιέχει στην πρώτη γραμμή τον αριθμό των σημείων, και εν συνεχεία σε κάθε γραμμή τις καρτεσιανές συντεταγμένες κάθε σημείου. Για παράδειγμα, ένα αρχείο δεδομένων θα έχει τη μορφή: 1
5 100.0 100.0 200.0 100.0 3.0 5-1 8-14.25 6.7 4 Computational Geometry Algorithms Library Η βιβλιοθήκη Computational Geometry Algorithms Library(Cgal) είναι μία βιβλιοθήκη γεωμετικών αλγορίθμων. Είναι γραμμένη σε C++, κάνει ευρεία χρήση των templates της C++, και ακολουθεί αρχές generic programming στη σχεδίαση και χρήση των δομών δεδομένων και αλγορίθμων που προσφέρει (κάτι ανάλογο με την STL). Προκειμένου να αντιμετωπιστούν προβλήματα αριθμητικών λαθών και να επιτευχθεί η απαραίτητη ευστάθεια(robustness) στους αλγορίθμους που προσφέρει, ακολουθείται το λεγόμενο exact computation paradigm: οι αλγόριθμοι θεωρούν ότι οι αριθμητικές πράξεις δεν έχουν αριθμητικά λάθη, και αυτό επιτυγχάνεται με τη χρήση αριθμητικών τύπων πολλαπλής ακρίβειας(είτε ακεραίων/ρητών, είτε κινητής υποδιαστολής). Για την εργασία αυτή μπορείτε να χρησιμοποιήσετε τις τριγωνοποιήσεις Delaunay που προσφέρονται από τη βιβλιοθήκη αυτή. Αυτό μπορεί να γίνει είτε χρησιμοποιώντας άμεσα τη βιβλιοθήκη, είτε μέσω του C-like interface που προσφέρεται(βλέπε Παράγραφο 5). Σε περίπτωση που θέλετε να χρησιμοποιήσετε τη βιβλιοθήκη κατευθείαν ή θέλετε να μάθετε περισσότερα γι αυτήν μπορείτε να ανατρέξετε στην ιστοσελίδα της βιβλιοθήκης: http://www.cgal.org. Επίσης τα άρθρα[1, 2] μιλάνε για την υλοποίηση και χρήση των τριγωνοποιήσεων της Cgal. 5 Τίσαςδίνεται Στο φάκελλο(directory) mkaravel/public/em369g/project/bin μπορείτε να βρείτε ένα εκτελέσιμοαρχείομεόνομα mk cg projectτοοποίοαντιστοιχείστηδικήμουυλοποίησητηςεργασίαςσας. Στονίδιοφάκελλουπάρχειέναδεύτεροεκτελέσιμοαρχείομεόνομαmk cg demoτοοποίοείναιμίααπλή γραφική εφαρμογή στην οποία μπορείτε να δώσετε σημεία με το ποντίκι ή από ένα αρχείο δεδομένων και εν συνεχεία να υπολογίζετε την τριγωνοποίηση Delaunay καθώς και το ελάχιστο επικαλύπτον δέντρο για τα σημεία που δώσατε. Στο φάκελλο mkaravel/public/em369g/project/data θα βρείτε δείγματα αρχείων δεδομένων, μεταξύ των οποίων το example.cin που αντιστοιχεί στα δεδομένα του παραδείγματοςτηςπαραγράφου3.1.τοπρόγραμμα mk cg projectμπορείτενατοτρέξετεείτεμεταδεδομέναπουυπάρχουνστονφάκελλοdata,είτεμεδικάσαςδεδομένακαισκοπόέχεινασαςβοηθήσεινα βρείτε πιθανά λάθη στον κώδικά σας. Τέλος, στο φάκελλο mkaravel/public/em369g/project/include σας δίνονται τα παρακάτω αρχεία: makefile Το αρχείο αυτό θα πρέπει να το χρησιμοποιήσετε για να μεταγλωττίσετε το πρόγραμμά σας. Περιέχει όλες τις απαραίτητες παραμέτρους για να γίνει η μεταγλώττιση σωστά. Πληκτρολογήστε make από το command prompt για να γίνει η μεταγλώττιση. ADT.h Το αρχείο αυτό περιέχει ένα C-like interface για να χρησιμοποιήσετε την τριγωνοποίηση Delaunay της βιβλιοθήκης Cgal(βλέπε Παράγραφο 4). Στο αρχείο αυτό υπάρχουν οι δηλώσεις διαφόρων συναρτήσεων, ενώ σε σχόλια μπορείτε να διαβάσετε τί κάνουν και ποιό είναι το κόστος κλήσης τους. 2
cg project.cστοαρχείοαυτόθαπρέπειναεπέμβετεκαιναπροσθέσετετοδικόσαςκώδικα.προς στιγμήν διαβάζει δεδομένα από ένα αρχείο και υπολογίζει την τριγωνοποίηση Delaunay των σημείων που διαβάζει. Εν συνεχεία εκτυπώνει στην οθόνη τους γείτονες κάθε σημείου στην τριγωνοποίηση Delaunay. typedefs.hpp Στο αρχείο αυτό υπάρχουν οι κατάλληλες δηλώσεις(typedefs) για να χρησιμοποιήσετε την τριγωνοποίηση Delaunay κατευθείαν. Το αρχείο αυτό θα σας είναι χρήσιμο αν γράψετε τον κώδικά σας σε C++ και δεν θέλετε να χρησιμοποιήσετε το C-like interface που δίδεται στο αρχείο ADT.h. Τα υπόλοιπα αρχεία στο φάκελλο mkaravel/public/em369g/project/include είναι βοηθητικά και δεν χρειάζεται να ασχοληθείτε με αυτά. 6 Τι πρέπει να επιστρέφουν τα προγράμματά σας(output) Το πρόγραμμά σας θα πρέπει να συμπεριφέρεται όπως ακριβώς το πρόγραμμα mk cg project. Πιο συγκεριμένα, σε κάθε γραμμή του αρχείου εξόδου θα πρέπει να εκτυπώνει δύο σημεία, εκ των οποίων το πρώτο θα είναι κάποιο σημείο του ελαχίστου επικαλύπτοντος δέντρου, ενώ το δεύτερο θα πρέπει να είναι το σημείο που αντιστοιχεί στον πατρικό κόμβο του πρώτου σημείου. Για την ρίζα του δέντρου δε χρειάζεται να υπάρχει δεύτερο σημείο. Τα σημεία θα πρέπει να εμφανίζονται στη μορφή ((x 1,y 1 )->(x 2,y 2 )) ή ((x 1,y 1 )) ανπρόκειταιγιατηρίζα.τα x i,y i, i = 1,2είναιοικαρτεσιανέςσυντεταγμένεςτωνσημείων.Ωςρίζα του ελαχίστου επικαλύπτοντος δέντρου θα πρέπει να διαλέξετε το σημείο που είναι το λεξικογραφικά μικρότερο στην αύξουσα λεξικογραφική σειρά του συνόλου των σημείων(βλέπε Παραγράφους 5 και 10) Τα σημεία σας(τα σημεία του δέντρου δηλαδή και όχι οι αντίστοιχοι πατρικοί κόμβοι) θα πρέπει να εμφανίζονται στο αρχείο εξόδου σε αύξουσα λεξικογραφική σειρά, ενώ αν το σύνολο σημείων που σας δίνεται έχει παραπάνω από ένα ελάχιστα επικαλύπτοντα δέντρα, θα πρέπει να υπολογίζετε το λεξικογραφικά μικρότερο δέντρο μεταξύ των δυνατών ελαχίστων επικαλυπτόντων δέντρων(βλέπε Παράγραφο 11). 7 Τίθαπαραδώσετε Θαπρέπειναπαραδώσετετονκώδικάσας,σεένααρχείοτηςμορφής.zipή.tarή.tar.gzή.tgz. Επίσης θα πρέπει να παραδώσετε ένα δακτυλογραφημένο κείμενο 5-10 σελίδων(κατά προτίμηση σε LATEX) που θα περιγράφει και θα εξηγεί τον αλγόριθμο που χρησιμοποιήσατε, θα περιγράφει την υλοποίηση του αλγορίθμου σας, και θα αναφέρεται στις δυσκολίες που τυχόν σας παρουσιάστηκαν στην επίλυση των προβλημάτων ή την υλοποίησή τους. 8 Βαθμολόγηση της εργασίας Οι εργασίες σας θα βαθμολογηθούν ως εξής: 3
κατά 20% από το κείμενο που θα παραδώσετε, κατά20%απότοσχεδιασμότουκώδικάσας, κατά 30% από το κατά πόσο η υλοποίησή σας πετυχαίνει τους απαραίτητους ασυμπτωτικούς χρόνους υπολογισμού, κατά30%απότηνορθότητατουαλγορίθμουσας(απότοαν,δηλαδή,θαδίνειτασωστάαποτελέσματα στα δεδομένα στα οποία θα ελεγχθεί). Υλοποιήσεις που δεν τηρούν τις προδιαγραφές που αναφέρονται στην Παράγραφο 2 δε θα βαθμολογηθούν και θα θεωρηθεί ότι η προγραμματιστική εργασία δεν έχει παραδοθεί. 9 Χρονοδιάγραμμα Στις αρχές Απριλίου, σε ώρες και μέρες που θα καθοριστούν θα γίνει συνάντηση με κάθε φοιτητή χωριστά,ώστενασυζητηθείηπρόοδόςτου.ηεργασίαθαπρέπειναπαραδοθείμέχριτις19μαΐου. 10 Λεξικογραφική σύγκριση και διάταξη Εστωδύοσημεία p 1 = (x 1,y 1 )και p 2 = (x 2,y 2 ). Θαλέμεότιτο p 1 είναιλεξικογραφικάμικρότερο του p 2 (συμβολισμός: p 1 lex p 2 ),ανείτε x 1 < x 2,είτε x 1 = x 2 και y 1 < y 2. Τασημεία p 1 και p 2 λέγονταιλεξικογραφικάίσα(συμβολισμός: p 1 = lex p 2 ),αν x 1 = x 2 και y 1 = y 2. Τέλος,το p 1 είναιλεξικογραφικάμεγαλύτεροτου p 2 (συμβολισμός: p 1 lex p 2 ),ανείτε x 1 > x 2,είτε x 1 = x 2 και y 1 > y 2. Προφανώς, p 1 lex p 2 σημαίνειότιείτε p 1 lex p 2 είτε p 1 = lex p 2. Αντίστοιχα, p 1 lex p 2 σημαίνειότιείτε p 1 lex p 2 είτε p 1 = lex p 2.Γιαπαράδειγμα ( 1,10) lex (0,0), ( 1,0) lex ( 1,10) και (10,0) lex (10, 1). Ανλοιπόνθέλουμεναταξινομήσουμεένασύνολοσημείωνσεαύξουσα λεξικογραφική σειρά, πρέπει να βρούμε μία διάταξη των σημείων, τέτοια ώστε για κάθε δύο διαδοχικά σημεία pκαι qτηςδιάταξηςναισχύει p lex q. Γιανασυγκρίνουμελεξικογραφικάδύοευθύγραμματμήματα s 1 = (p 1,q 1 )και s 2 = (p 2,q 2 )πρέπει κατ αρχήνναισχύει p 1 lex q 1 και p 2 lex q 2 (ανδενισχύουνοισυνθήκεςαυτέςαρκείνααλλάξουμε τη σειρά των σημείων που ορίζουν το ευθύγραμμο τμήμα). Υπό τις προϋποθέσεις αυτές λέμε ότιτο s 1 είναιλεξικογραφικάμικρότεροτου s 2 (συμβολισμός: s 1 lex s 2 ),ανείτε p 1 lex p 2,είτε p 1 = lex p 2 και q 1 lex q 2.Οιορισμοίλεξικογραφικούίσουκαιλεξικογραφικούμεγαλύτερουείναιεντελώςανάλογοιμετηνπερίπτωσητωνσημείων.Γιαπαράδειγμα (( 1,10),(1,20)) lex ((0,10),(1,20)), ((0,0),(0,2)) lex ((0,0),(0,3))και ((0,0),(5,0)) lex ((0,0),(4,0)). Ανλοιπόνθέλουμεναταξινομήσουμε ένα σύνολο ευθυγράμμων τμημάτων σε αύξουσα λεξικογραφική σειρά, πρέπει να βρούμε μία διάταξη των τμημάτων, τέτοια ώστε για κάθε δύο διαδοχικά ευθύγραμμα τμήματα s και t της διάταξης ναισχύει s lex t. 11 Σύγκριση ελαχίστων επικαλυπτόντων δέντρων Θεωρείστε το σύνολο σημείων στα αριστερά της παρακάτω εικόνας. Στο σύνολο των σημείων αυτών αντιστοιχούν πάνω από ένα ελάχιστα επικαλύπτοντα δέντρα, όπως για παράδειγμα αυτά στο κέντρο και στα δεξιά της παρακάτω εικόνας. 4
Σε κάθε ελάχιστο επικαλύπτον δέντρο ενός γράφου αντιστοιχεί μία διατεταγμένη(σε αύξουσα σειρά) ακολουθία αιρθμών, που είναι τα βάρη(μήκη) των ακμών που απαρτίζουν το ελάχιστο επικαλύπτον δέντρο. Το να έχει ένας γράφος πάνω από ένα ελάχιστο επικαλύπτον δέντρο σημαίνει ότι μπορούμε να βρούμε παραπάνω από μία ακολουθίες ακμών του γράφου, οι οποίες ακολουθίες ακμών δημιουργούν επικαλύπτοντα δέντρα, και των οποίων οι ακολουθίες βαρών είναι ταυτόσημες. Προκειμένου να ορίσουμε μοναδικά το ελάχιστο επικαλύπτον δέντρο ενός γράφου χρειάζεται να βρούμε κάποιο τρόπο να διατάξουμε τις ακολουθίες ακμών του γράφου που αντιστοιχούν σε ελάχιστα επικαλύπτοντα δέντρα. Ενας τρόπος να διατάξουμε ελάχιστα επικαλύπτοντα δέντρα είναι να τα διατάξουμε λεξικογραφικά. Εστω T 1 = (e 1,...,e k )και T 2 = (e 1,...,e k )είναιδύοελάχισταεπικαλύπτονταδέντρα,όπου e i = e i,γιακάθε iμε 1 i k,και e i e i+1,γιακάθε iμε 1 i k 1. Στουςορισμούςπου μόλιςαναφέραμε,τα e i και e i είναιταευθύγραμματμήματαπουαπαρτίζουνκάθεδέντρο,διατεταγμένα σε αύξουσα σειρά μήκους. Το σύμβολο αντιστοιχεί στο μήκος του ευθυγράμμου τμήματος. Θα λέμεότιτοδέντρο T 1 είναιλεξικογραφικάμικρότεροαπότοδέντρο T 2 (συμβολισμός: T 1 lex T 2 ),αν υπάρχει mμε 1 m k,τέτοιοώστε e i = lex e i,γιακάθε i, 1 i m 1,και e m lex e m. Στην εργασία λοιπόν αυτή, και προκειμένου να ορίσουμε μοναδικά το ελάχιστο επικαλύπτον δέντρο αν υπάρχουν παράπανω από ένα, ζητάμε να επιστραφεί το λεξικογραφικά ελάχιστο επικαλύπτον δέντρο. Δεδομένου όμως ότι σε ένα δέντρο μπορούμε να έχουμε οποιονδήποτε κόμβο ως ρίζα και με σκοπό να αποφευχθεί οποιαδήποτε ασάφεια ως προς τον ορισμό του ελαχίστου επικαλύπτοντος δέντρου που ψάχνουμε, ζητάμε το ελάχιστο εκείνο επικαλύπτον δέντρο που είναι λεξικογραφικά ελάχιστο μεταξύ όλων των πιθανών ελαχίστων επικαλυπτόντων δέντρων του σημειοσυνόλου μας, και το οποίο έχει ως ρίζα το λεξικογραφικά ελάχιστο σημείο του σημειοσυνόλου. Για παράδειγμα, για το σύνολο των σημείων στα αριστερά της παραπάνω εικόνας, το ζητούμενο ελάχιστο επικαλύπτον δέντρο είναι το δέντροσταδεξιάτηςεικόνας,καιηρίζατουείναιτοκατώτεροκαιαριστερότεροεκτων9σημείων του σημειοσυνόλου. 5
Σχετική βιβλιογραφία Εκτός του συγγράμματος του μαθήματος μπορείτε επίσης να ανατρέξετε στα παρακάτω συγγράμματα, άρθρα και ιστοσελίδες: [1] J.-D. Boissonnat, F. Cazals, F. Da, O. Devillers, S. Pion, F. Rebufat, M. Teillaud, and M. Yvinec. Programming with CGAL: the example of triangulations. In SCG 99: Proceedings of the fifteenth annual symposium on Computational geometry, pages 421 422, New York, NY, USA, 1999. ACM Press. ISBN 1-58113-068-6. doi: http://doi.acm.org/10.1145/304893.305001. [2] J.-D. Boissonnat, O. Devillers, M. Teillaud, and M. Yvinec. Triangulations in CGAL (extended abstract). In SCG 00: Proceedings of the sixteenth annual symposium on Computational geometry, pages 11 18, New York, NY, USA, 2000. ACM Press. ISBN 1-58113-224-7. doi: http://doi.acm.org/10.1145/336154.336165. [3] T. H. Cormen, C. E. Leiserson, R. L. Rivest, and C. Stein. Introduction to Algorithms. MIT Press, 2nd edition, 2001. [4] J. O Rourke. Computational Geometry in C. Cambridge University Press, 2nd edition, 2001. [5] F. P. Preparata and M. I. Shamos. Computational Geometry: An Introduction. Springer, 1993. [6] R. Sedgewick. Algorithms in C++. Addison-Wesley, 3rd edition, 1998. [7] The Computational Geometry Algorithms Library (Cgal). http://www.cgal.org. 6