Φροντιστήριο 8 Φύλλο Ασκήσεων UPPAAL 2 Χρόνοι και Ρολόγια Κατά τη σχεδίαση και την ανάλυση πραγματικών συστημάτων, πολλές φορές ο χρόνος έχει μεγάλη σημασία. Για παράδειγμα, μπορεί να χρειαστεί να καθορίσουμε όχι μόνο κατά πόσο μια κατάσταση είναι εφικτή, αλλά και πόσο γρήγορα. Θεωρήστε ότι ένας εργάτης χρειάζεται τουλάχιστον 5 δευτερόλεπτα για μια εύκολη εργασία, τουλάχιστον 10 δευτερόλεπτα για μια μεσαίας δυσκολίας εργασία χρησιμοποιώντας σφυρί, τουλάχιστον 15 δευτερόλεπτα για μια μεσαίας δυσκολίας εργασία χρησιμοποιώντας σφύρα και τουλάχιστον 20 δευτερόλεπτα για μια δύσκολη εργασία. Υποθέτουμε ότι οι εργασίες έρχονται με την ακόλουθη σειρά: H, A, H, H, H, Ε, Ε, A, A, A, όπου το Ε δηλώνει εύκολη εργασία, το A δηλώνει μεσαίας δυσκολίας εργασία και το H δηλώνει δύσκολη εργασία. Πόσο χρόνο χρειάζονται οι δύο εργάτες (τουλάχιστον) για να ολοκληρώσουν 10 εργασίες; Μοντελοποίηση της ζώνης μεταφοράς Πριν από την εισαγωγή του χρόνου στο μοντέλο μας, θα πρέπει να προσθέσουμε ένα αυτόματο το οποίο περιγράφει τη συμπεριφορά της ζώνης μεταφοράς. Για τη μοντελοποίηση των εισερχόμενων εργασιών θα ορίσουμε τρία νέα κανάλια jobe, joba και jobh τα οποία αντιστοιχούν στην άφιξη εύκολων, μεσαίας δυσκολίας και δύσκολων εργασιών αντίστοιχα. Το αυτόματο Belt που φαίνεται στην πιο κάτω εικόνα περιγράφει τη συμπεριφορά της ζώνης μεταφοράς καθώς μεταφέρονται οι 10 εργασίες όπως περιγράφονται πιο πάνω. Ποιο άλλο μοντέλο χρειάζεται αλλαγές (και ποιες είναι αυτές) για να λειτουργεί το σύστημά μας ορθά;
Ρολόγια και κάτω όρια στο χρόνο Σε όλα τα μοντέλα που έχουμε δει μέχρι τώρα δεν έχουμε μοντελοποίηση του χρόνου. Οι μεταβάσεις δεν παίρνουν χρόνο και χρόνος μπορεί να περάσει μόνο όταν όλα τα αυτόματα του μοντέλου περιμένουν σε κάποια κατάσταση. Συχνά, οι μεταβάσεις ενός μοντέλου αντιστοιχούν είτε στην αρχή είτε στο τέλος κάποιας ενέργειας η οποία έχει κάποια διάρκεια. Για να είμαστε ακριβείς, θα θέσουμε ότι η μετάβαση jobh! αντιστοιχεί στη στιγμή που ο εργάτης επιλέγει να ξεκινήσει μια δύσκολη εργασία και η μετάβαση put_mallet αντιστοιχεί στη στιγμή που ο εργάτης τερματίζει την ενέργειά του να επιστρέψει τη σφύρα στο τραπέζι. Εάν θέλουμε να θέσουμε άνω και κάτω όρια στο χρόνο που θα ξοδέψει το αυτόματο σε μια συγκεκριμένη κατάσταση μπορούμε να το κάνουμε με τη χρήση των ρολογιών. Το ρολόι είναι ένας ειδικός τύπος μεταβλητής ο οποίος αντιστοιχεί σε μη αρνητικούς πραγματικούς αριθμούς. Τα ρολόγια αρχικοποιούνται με την τιμή 0. Όταν ένα αυτόματο περιμένει σε μια κατάσταση και ο χρόνος περνά, τότε οι τιμές των ρολογιών του αυξάνονται. Πιο συγκεκριμένα, όταν περάσουν t μονάδες χρόνου τότε οι τιμές όλων των ρολογιών του μοντέλου αυξάνονται κατά t. Όλα τα ρολόγια θεωρούνται τέλεια και αυξάνονται ακριβώς με τον ίδιο ρυθμό. Πιο κάτω φαίνεται το μοντέλο του εργάτη, όπως αυτό έχει επεκταθεί για τον συγχρονισμό με τη ζώνη μεταφοράς καθώς και με μια μεταβλητή ρολογιού, τη x. Το ρολόι μπορεί να ορισθεί με το να προσθέσουμε την πιο κάτω γραμμή στους ορισμούς του αυτομάτου του εργάτη. clock x;
Στο μοντέλο μας, τόσο ο 1 ος όσο και ο 2 ος εργάτης έχουν μια τοπική μεταβλητή ρολογιού x η οποία καταγράφει το χρόνο τον οποίο ξοδεύουν σε μια συγκεκριμένη εργασία. Όταν ο εργάτης θα ξεκινήσει μια νέα εργασία το τοπικό ρολόι αρχικοποιείται με 0. Τι χρειαζόμαστε για να καταγράψουμε το συνολικό χρόνο εργασίας; Πλέον το global declarations φαίνεται όπως πιο κάτω: chan get_hammer, put_hammer, get_mallet, put_mallet; chan joba, jobe, jobh; clock now; Μπορούμε να δούμε κατά πόσο υπάρχει κατάσταση στην οποία όλες οι εργασίες έχουν παραδοθεί και οι δύο εργάτες βρίσκονται στην αρχική τους κατάσταση; E<> (Belt.end && Jobber1.begin && Jobber2.begin) Πώς μπορούμε να βρούμε το συντομότερο χρόνο ολοκλήρωσης των 10 εργασιών; Άνω όρια στο χρόνο Έχουμε δει ότι τα κάτω όρια στο χρόνο καθορίζονται με τη βοήθεια περιορισμών ρολογιών στους φρουρούς των μεταβάσεων. Συχνά χρειάζεται να καθορίσουμε άνω όρια στο χρόνο, όπως για παράδειγμα ένας αερόσακος χρειάζεται ορισμένα μικροδευτερόλεπτα για να ανοίξει μετά από τον εντοπισμό κάποιας σύγκρουσης. Θεωρήστε ότι ένας εργάτης χρειάζεται το πολύ 7 δευτερόλεπτα για μια εύκολη εργασία, το πολύ 12 δευτερόλεπτα για μια μεσαίας δυσκολίας εργασία χρησιμοποιώντας σφυρί, το πολύ 17 δευτερόλεπτα για μια μεσαίας δυσκολίας εργασία χρησιμοποιώντας σφύρα και το πολύ 22 δευτερόλεπτα για μια δύσκολη εργασία. Ποιος είναι ο μέγιστος χρόνος που χρειάζονται οι δύο εργάτες για να ολοκληρώσουν τις 10 εργασίες, δεδομένου ότι ο εργάτης παραλαμβάνει μια νέα εργασία από τη ζώνη μεταφοράς μόλις είναι έτοιμος να εργαστεί σε αυτή και παίρνει το ανάλογο εργαλείο που θα τον βοηθήσει να ολοκληρώσει την εργασία μόλις αυτό γίνει διαθέσιμο. Στο UPPAAL καθορίζουμε άνω όρια στο χρόνο με τη χρήση των αμετάβλητων συνθηκών (invariants). Με το να προσθέσουμε x<=7 σε αυτό το πεδίο, καθορίζουμε ότι σε αυτή την κατάσταση η τιμή του ρολογιού x δεν θα ξεπεράσει το 7. Πιο συγκεκριμένα, ένας εργάτης χρειάζεται το πολύ 7 μονάδες χρόνου για να ολοκληρώσει μια απλή εργασία. Εάν έχουν περάσει περισσότερες από 7 μονάδες χρόνου, τότε ο εργάτης θα έχει φύγει από την κατάσταση work_easy. Πιο κάτω φαίνεται το καινούργιο μοντέλο του εργάτη αφού λάβουμε υπόψη τα άνω όρια στους χρόνους εκτέλεσης.
Ποια άλλη αλλαγή παρατηρείτε στο μοντέλο; Είναι δυνατό, βάσει του πιο πάνω μοντέλου, να υπολογίσουμε ένα άνω όριο στο χρόνο που χρειάζεται για την ολοκλήρωση όλων των εργασιών; Αν ναι πως, διαφορετικά τι άλλο χρειαζόμαστε; Για τη μοντελοποίηση του περιορισμού ότι ο εργάτης παίρνει ένα εργαλείο μόλις αυτό γίνει διαθέσιμο θα ορίσουμε τα κανάλια συγχρονισμού ως urgent. Όταν ένα κανάλι συγχρονισμού οριστεί ως urgent, αυτό σημαίνει ότι όποτε ένας συγχρονισμός με αυτό το κανάλι είναι δυνατό να συμβεί, η μετάβαση πρέπει να γίνει αμέσως χωρίς να περάσει καθόλου χρόνος. Αυτό γίνεται με την πιο κάτω αλλαγή στο global declarations: // Place global declarations here. urgent chan joba, jobe, jobh, get_hammer, get_mallet; chan put_hammer, put_mallet; Θα μπορούσαμε να μοντελοποιήσουμε την κατάσταση begin ως urgent αντί τα κανάλια joba, jobe, jobh; Ποια είναι η διαφορά ανάμεσα στους δύο ορισμούς; Ενώ το UPPAAL μας παρέχει ένα τρόπο να υπολογίσουμε την πιο γρήγορη εκτέλεση, δεν μας παρέχει μια μέθοδο για να υπολογίσουμε την πιο αργή εκτέλεση. Αυτό μπορεί να γίνει μέσω ορισμένων διαδοχικών προσεγγίσεων της μορφής: Α[] now>=200 imply (Belt.end && Jobber1.begin && Jobber2.begin) Υπολογίστε το μέγιστο χρόνο που χρειάζεται για την ολοκλήρωση όλων των εργασιών. Ποιο είναι το μονοπάτι το οποίο μας οδηγεί σε αυτό τον χρόνο; Πού οφείλεται αυτό;
Παράμετροι και πίνακες Παράμετροι Κατά τη σχεδίαση του μοντέλου μας έχουμε ορίσει ένα πρότυπο Jobber με δύο στιγμιότυπα, τον Jobber1 και τον Jobber2. Με τον ίδιο τρόπο μπορούμε να ορίσουμε ένα πρότυπο Tool το οποίο θα έχει δύο περιπτώσεις, το Hammer και το Mallet. Αυτό μπορεί να γίνει με τη χρήση παραμέτρων, όπου αυτές μπορούν να οριστούν είτε ως call by value (πρόσβαση διά τιμής) είτε ως call by reference (πρόσβαση διά διεύθυνσης). Τα ρολόγια και τα κανάλια θα πρέπει πάντοτε να καλούνται ως call byreference. Πιο κάτω φαίνεται το γενικό μοντέλο του εργαλείου. Στο πεδίο Parameters ορίζουμε τα κανάλια τα οποία χρησιμοποιούνται ως παράμετροι: urgent chan &get, chan &put Στο System Declarations μπορούμε να ορίσουμε πλέον το Hammer και το Mallet ως περιπτώσεις του Tool: Hammer = Tool(get_hammer, put_hammer); Mallet = Tool(get_mallet, put_mallet); Τα παλιά πρότυπα για το σφυρί και τη σφύρα θα πρέπει να σβηστούν μέσω του Edit >Remove_template. Το νέο μοντέλο έχει ακριβώς την ίδια συμπεριφορά με το παλιό, αλλά λόγω της χρήσης των παραμέτρων έχει γίνει μικρότερο. Πίνακες Εντοπίστε δύο προβλήματα της μοντελοποίησης της ζώνης μεταφοράς (όχι άμεσα συνδεδεμένα με το συγκεκριμένο μοντέλο). Για να λύσουμε τα προβλήματα τόσο της επεκτασιμότητας όσο και της επαναχρησιμοποίησης θα μοντελοποιήσουμε την εισερχόμενη ροή εργασιών αντί με μια δομή ελέγχου (αυτόματο) με μια δομή δεδομένων. Πιο συγκεκριμένα θα περιγράψουμε τη ροή εργασιών ως ένα πίνακα ακεραίων όπως πιο κάτω: const int E=0; const int A=1; const int H=2; const int J=10; const int[0,2] jobs[j] = {H,A,H,H,H,E,E,A,A,A};
Πιο κάτω φαίνεται ένα γενικό μοντέλο για τη ζώνη μεταφοράς το οποίο χρησιμοποιεί πληροφορίες από τον πίνακα jobs για να παραγάγει τη σωστή σειρά των μεταβάσεων. Το αυτόματο χρησιμοποιεί τη μεταβλητή i η οποία μετρά τις εργασίες που έχουν μέχρι στιγμής παραδοθεί. Το νέο μοντέλο έχει ακριβώς την ίδια συμπεριφορά με το παλιό, αλλά λόγω της χρήσης των πινάκων έχει γίνει μικρότερο και πιο εύκολο για να επαναχρησιμοποιηθεί.