Κυριακή 27 Ιανουαρίου 2013

Περιγραφή Εφαρμογής

Ο στόχος της "Taxi" εφαρμογής είναι η καλύτερη και ταχύτερη εξυπηρέτηση του κοινού. Η εφαρμογή μας φροντίζει να καλυφθούν όσο το δυνατόν περισσότεροι πελάτες. Αυτό επιτυγχάνεται γιατί βασική προϋπόθεση για την επιλογή των πελατών είναι η απόσταση τους, δηλαδή για κάθε πελάτη επιλέγεται το κοντινότερο ταξί. Σε κάθε πελάτη μπορούν να έρθουν μέχρι τρεις επιλογές ταξί και μπορεί να επιλέξει τη μία. Τα ταξί μπορούν να πάρουν μέχρι 4 πελάτες των οποίων το σημείο εκκίνησης και ο τελικός προορισμός να μην έχουν μεγάλη απόκλιση. Η εφαρμογή μας λειτουργεί με Google maps και μία βάση που παίρνουμε από εκεί τις συντεταγμένες της τοποθεσίας. Παρακάτω θα αναλύσουμε πως λειτουργεί εφαρμογή μας.

1η Φάση της εφαρμογής μας

Σε πρώτη φάση φτιάξαμε τον "σκελετό" της εφαρμογής μας η οποία υλοποιήθηκε με Map-Reduce. Με το πρόγραμμα Eclipse δημιουργήσαμε 2 interfaces με ονόματα Server και Worker. 

Ο server αποτελείται από τις εξής μεθόδους:
  • void searchForWorkersByBroadcastingAMessage()
    • ψάχνει για workers στέλνοντας μηνύματα.
  • void listenForWorkerRegistrations()
    • Ακούει σε μια συγκεκριμένη θύρα για τους διαθέσιμους workers. Οι workers αποφασίζουν αν θέλουν να εργαστούν ως mappers, reducers ή και τα δύο. Μόλις γίνει λήψη της αίτησης, τότε η μέθοδος handleRegistrationRequest επικαλείται.
  • void handleRegistrationRequest( WorkerRegistrationRequest regRequest )
    • Χειρίζεται τις εισερχόμενες {@link WorkerRegistrationRequest}s.
  • void updateWorkersList()
    • Αυτή η μέθοδος επικαλείται αν έχει περάσει ο καθορισμένος χρόνος από την τελευταία επίκληση της. Σκοπός της μεθόδου είναι να μαθαίνει ποιοι workers είναι διαθέσιμοι και έτοιμοι να δεχτούν εργασίες.
  • void assignMapTask( MapTask mapTask, InetAddress address )
    • Αναθέτει μία map εργασία στον worker.
  • void assignReduceTask( MapTask mapTask, InetAddress address )
    • Αναθέτει μeία reduce εργασία στον worker.
  • void receiveMapResults()
    • Παίρνει τα αποτελέσματα από τους mappers.
  • void receiveReduceResults()
    • Παίρνει τα αποτελέσματα από τους reducers.

Ο worker αποτελείται από τις εξής μεθόδους:

  • void listenForMapTasks()
    • όταν η μέθοδος αυτή κληθεί ο worker ξεκινάει να ακούει σε ένα συγκεκριμένο socket για map εργασίες.
  • void listenForReduceTasks()
    • όταν η μέθοδος αυτή κληθεί ο worker ξεκινάει να ακούει σε ένα συγκεκριμένο socket για reduce εργασίες.
  • void sendMapOutputToServer( List<KeyValuePair> keyValuePairs, MapTask mapTask )
    • Στέλνει τα αποτελέσματα της map συνάρτησης για μια ειδική εργασία πίσω στον server 
  • void sendReduceOutputToServer( List<ReduceResult> reduceResults, ReduceTask reduceTask )
    • Στέλνει τα αποτελέσματα της reduce συνάρτησης για μια ειδική εργασία πίσω στον server
  • void prohibitMapTasks()
    • Λέει στον server ότι η map εργασία είναι απαγορευμένη για αυτόν τον worker 
  • void allowMapTasks()
    • Λέει στον server ότι η map εργασία επιτρέπεται για αυτόν τον worker 
  • void prohibitReduceTasks()
    • Λέει στον server ότι η reduce εργασία απαγορεύεται για αυτόν τον worker
  • void allowReduceTasks()
    • Λέει στον server ότι η reduce εργασία επιτρέπεται για αυτόν τον worker
Η εικόνα αυτή είναι σε γενικές γραμμές ο τρόπος με τον οποίο λειτουργεί η εφαρμογή μας. 

Στη 2η φάση θα γίνει υλοποίηση της. 

2η Φάση της εφαρμογής μας

Η λειτουργία της εφαρμογής βασίζεται σε έναν αλγόριθμο που βρίσκεται στην κλάση ReducerActivity. Ο πελάτης στέλνει την αίτηση προς όλα τα ταξί, ο αλγόριθμός μας όμως ορίζει για κάθε πελάτη μόνο 3 επιλογές ταξί και αυτό για να υπάρξει ομαλή λειτουργία διαφορετικά θα μπορούσαν πολλά ταξί να πάνε σε ένα πελάτη και να υπάρξει πρόβλημα. Αυτός ο αλγόριθμος έχει ένα hashmap όπου έχει ένα μοναδικό αναγνωριστικό για κάθε πελάτη και μία λίστα των ταξί που θέλουν να τον εξυπηρετήσουν. Για τον καθορισμό του ταξί σε ένα πελάτη βασικό ρόλο παίζει η απόσταση του από το σημείο εκκίνησης των χρηστών καθώς το βασικό κριτήριο επιλογής η μικρότερη απόσταση του ταξί από τον πελάτη. Η διαδικασία αυτή είναι για τον πρώτο πελάτη του ταξί, ο οποίος καθορίζει την πορεία και την επιλογή επιπλέον πελατών αφού πρέπει το σημείο εκκίνησης και ο προορισμός τους να είναι σε μικρή απόσταση τουλάχιστον 500 μέτρα από του πρώτου για να μπορέσει να τους εξυπηρετήσει χωρίς βέβαια να έχουν μεγάλη απόκλιση οι διαδρομές τους.