Σημειωματάριο Δευτέρας 4 Δεκ. 2017

Σχετικά έγγραφα
Σημειωματάριο Τετάρτης 29 Νοε. 2017

Διάλεξη 4: Θεωρία Γραφημάτων Γραφέας: Σ. Κ. Διδάσκων: Σταύρος Κολλιόπουλος συνεκτικά γραφήματα (συνέχεια) Πρόταση 4.1 Δύο μπλοκ ενός

Διάλεξη 4: Απόδειξη: Για την κατεύθυνση, παρατηρούμε ότι διαγράφοντας μια κορυφή δεν μπορούμε να διαχωρίσουμε τα u και v. Αποδεικνύουμε

f(t) = (1 t)a + tb. f(n) =

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΦΡΟΝΤΙΣΤΗΡΙΟ ΑΛΓΟΡΙΘΜΩΝ ΒΟΗΘΟΣ: ΒΑΓΓΕΛΗΣ ΔΟΥΡΟΣ

ΕΝΑΣ ΔΙΚΡΙΤΗΡΙΟΣ ΑΛΓΟΡΙΘΜΟΣ SIMPLEX

Διακριτά Μαθηματικά ΙΙ Χρήστος Νομικός Τμήμα Μηχανικών Η/Υ και Πληροφορικής Πανεπιστήμιο Ιωαννίνων 2018 Χρήστος Νομικός ( Τμήμα Μηχανικών Η/Υ Διακριτά

u v 4 w G 2 G 1 u v w x y z 4

Αλγόριθμοι για αυτόματα

Το πρόβλημα μονοδρόμησης (The One-Way Street Problem)

Παρουσίαση 2 ης Άσκησης:

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

Αλγόριθμοι και Πολυπλοκότητα

Τίτλος Μαθήματος: Θεωρία Γραφημάτων. Ενότητα: Εισαγωγή σε βασικές έννοιες. Διδάσκων: Λέκτορας Xάρης Παπαδόπουλος. Τμήμα: Μαθηματικών

Σημειωματάριο Τετάρτης 4 Οκτ. 2017

Διακριτά Μαθηματικά ΙΙ Χρήστος Νομικός Τμήμα Μηχανικών Η/Υ και Πληροφορικής Πανεπιστήμιο Ιωαννίνων 2018 Χρήστος Νομικός ( Τμήμα Μηχανικών Η/Υ Διακριτά

Περιληπτικά, τα βήματα που ακολουθούμε γενικά είναι τα εξής:

Τομές Γραφήματος. Γράφημα (μη κατευθυνόμενο) Συνάρτηση βάρους ακμών. Τομή : Διαμέριση του συνόλου των κόμβων σε δύο μη κενά σύνολα

Διακριτά Μαθηματικά ΙΙ Χρήστος Νομικός Τμήμα Μηχανικών Η/Υ και Πληροφορικής Πανεπιστήμιο Ιωαννίνων 2018 Χρήστος Νομικός ( Τμήμα Μηχανικών Η/Υ Διακριτά

Άσκηση 1. Ψευδοκώδικας Kruskal. Παρακάτω βλέπουμε την εφαρμογή του στο παρακάτω συνδεδεμένο γράφημα.

Διακριτά Μαθηματικά ΙΙ Χρήστος Νομικός Τμήμα Μηχανικών Η/Υ και Πληροφορικής Πανεπιστήμιο Ιωαννίνων 2018 Χρήστος Νομικός ( Τμήμα Μηχανικών Η/Υ Διακριτά

3. α) Να λύσετε την εξίσωση x 2 = 3. β) Να σχηματίσετε εξίσωση δευτέρου βαθμού με ρίζες, τις ρίζες της εξίσωσης του α) ερωτήματος.

Κεφάλαιο 11 Ένωση Ξένων Συνόλων

Σημειωματάριο Δευτέρας 30 Οκτ. 2017

2.3 ΜΕΤΡΟ ΜΙΓΑΔΙΚΟΥ ΑΡΙΘΜΟΥ

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Γραφήματα. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Διακριτά Μαθηματικά ΙΙ Χρήστος Νομικός Τμήμα Μηχανικών Η/Υ και Πληροφορικής Πανεπιστήμιο Ιωαννίνων 2018 Χρήστος Νομικός ( Τμήμα Μηχανικών Η/Υ Διακριτά

Διαίρει και Βασίλευε. πρόβλημα μεγέθους Ν. διάσπαση. πρόβλημα μεγέθους k. πρόβλημα μεγέθους Ν-k

q(g \ S ) = q(g \ S) S + d = S.

ΚΕΦΑΛΑΙΟ 2: ΟΡΙΖΟΥΣΕΣ

Συντομότερες Διαδρομές

Παρουσίαση 1 ης Άσκησης:

Γραφικά υπολογιστών Εργαστήριο 4 Εισαγωγή στις λίστες

Η ΔΟΜΗ ΕΠΑΝΑΛΗΨΗΣ Εντολές Επανάληψης REPEAT UNTIL, FOR, WHILE

Προβλήματα Ελάχιστου Κόστους Ροής σε Δίκτυο. Δίκτυα Ροής Ελάχιστου Κόστους (Minimum Cost Flow Networks)

x < y ή x = y ή y < x.

ΓΡΑΜΜΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΚΑΙ ΜΕΘΟΔΟΣ SIMPLEX, διαλ. 3. Ανωτάτη Σχολή Παιδαγωγικής και Τεχνολογικής Εκπαίδευσης 29/4/2017

Σχέδια μαθημάτων για την δημιουργία συναρτήσεων υπολογισμού του ΜΚΔ και του ΕΚΠ στην MSWLogo

Θεωρία Υπολογισμού και Πολυπλοκότητα Μαθηματικό Υπόβαθρο

ΒΟΗΘΗΤΙΚΕΣ ΣΗΜΕΙΩΣΕΙΣ ΣΤΑ ΓΕΝΙΚΑ ΜΑΘΗΜΑΤΙΚΑ

Graph Algorithms. Παρουσίαση στα πλαίσια του μαθήματος «Παράλληλοι Αλγόριθμοι» Καούρη Γεωργία Μήτσου Βάλια

ΚΕΦΑΛΑΙΟ 2 ΑΛΓΟΡΙΘΜΟΙ ΤΥΠΟΥ SIMPLEX. 2.1 Βασικές έννοιες - Ορισμοί

Έστω ένας πίνακας με όνομα Α δέκα θέσεων : 1 η 2 η 3 η 4 η 5 η 6 η 7 η 8 η 9 η 10 η

Διάλεξη 21: Γράφοι IV - Βραχύτερα Μονοπάτια σε Γράφους

ιακριτά Μαθηµατικά και Μαθηµατική Λογική ΠΛΗ20 Ε ρ γ α σ ί α 3η Θεωρία Γραφηµάτων

d(v) = 3 S. q(g \ S) S

12. ΑΝΙΣΩΣΕΙΣ Α ΒΑΘΜΟΥ. είναι δύο παραστάσεις μιας μεταβλητής x πού παίρνει τιμές στο

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΤΜΗΜΑ ΠΟΛΙΤΙΚΩΝ ΜΗΧΑΝΙΚΩΝ ΣΗΜΕΙΩΣΕΙΣ ΓΡΑΜΜΙΚΗΣ ΑΛΓΕΒΡΑΣ. ρ Χρήστου Νικολαϊδη

e 2 S F = [V (H), V (H)]. 3-1 e 1 e 3

Σημειωματάαριο Δευτέρας 16 Οκτ. 2017

Θεωρία Υπολογισμού Άρτιοι ΑΜ. Διδάσκων: Σταύρος Κολλιόπουλος. eclass.di.uoa.gr. Περιγραφή μαθήματος

Θεωρία Υπολογισμού Αρτιοι ΑΜ Διδάσκων: Σταύρος Κολλιόπουλος eclass.di.uoa.gr

Ταιριάσματα. Γράφημα. Ταίριασμα (matching) τέτοιο ώστε κάθε κορυφή να εμφανίζεται σε το πολύ μια ακμή του

Συντομότερα Μονοπάτια για Όλα τα Ζεύγη Κορυφών

Δυναμικός προγραμματισμός για δέντρα

Δοµές Δεδοµένων & Ανάλυση Αλγορίθµων 3ο Εξάµηνο. Γραφήµατα. (Graphs)

ΜΑΣ121: ΓΡΑΜΜΙΚΗ ΑΛΓΕΒΡΑ I Εαρινό εξάμηνο , Διδάσκων: Γιώργος Γεωργίου ΕΝΔΙΑΜΕΣΗ ΕΞΕΤΑΣΗ, Διάρκεια: 2 ώρες 18 Νοεμβρίου, 2017

2ο ΓΕΛ ΑΓ.ΔΗΜΗΤΡΙΟΥ ΑΕΠΠ ΘΕΟΔΟΣΙΟΥ ΔΙΟΝ ΠΡΟΣΟΧΗ ΣΤΑ ΠΑΡΑΚΑΤΩ

Πανεπιστήμιο Ιωαννίνων Τμήμα Πληροφορικής Δομές Δεδομένων [ΠΛΥ302] Χειμερινό Εξάμηνο 2012

Συντομότερες ιαδρομές

1. Πότε χρησιμοποιούμε την δομή επανάληψης; Ποιες είναι οι διάφορες εντολές (μορφές) της;

Ειδικά θέματα Αλγορίθμων και Δομών Δεδομένων (ΠΛΕ073) Απαντήσεις 1 ου Σετ Ασκήσεων

EukleÐdeiec emfuteôseic: ˆnw frˆgmata

ΕΠΛ 211: Θεωρία Υπολογισμού και Πολυπλοκότητας. Διάλεξη 13: Παραλλαγές Μηχανών Turing και Περιγραφή Αλγορίθμων

Μαθηματικά. Ενότητα 2: Διαφορικός Λογισμός. Σαριαννίδης Νικόλαος Τμήμα Διοίκησης Επιχειρήσεων (Κοζάνη)

Σκοπός. Εργαστήριο 6 Εντολές Επανάληψης

Διμερή γραφήματα και ταιριάσματα

β) 3 n < n!, n > 6 i i! = (n + 1)! 1, n 1 i=1

Παραδείγματα Απαλοιφή Gauss Απαλοιφή Gauss-Jordan Παραγοντοποίηση LU, LDU

Τυχαίοι γράφοι Η διάμετρος του G(n, 2 ln n/n) Ioannis Giotis

Συνδετικότητα γραφήματος (graph connectivity)

Συντομότερες Διαδρομές

ΔΙΑΣΧΙΣΗ ΓΡΑΦΗΜΑΤΩΝ 1

Κατανεμημένα Συστήματα Ι

Αλγόριθμοι και πολυπλοκότητα: 4 η σειρά ασκήσεων ΣΗΜΜΥ - Ε.Μ.Π.

Π Κ Τ Μ Ε Μ Λύσεις των ασκήσεων

Το πρόβλημα του σταθερού γάμου

Θεώρημα Βolzano. Κατηγορία 1 η Δίνεται η συνάρτηση:

ΕΥΡΕΣΗ ΕΛΑΧΙΣΤΩΝ ΜΟΝΟΠΑΤΙΩΝ & ΚΑΤΗΓΟΡΙΕΣ ΑΛΓΟΡΙΘΜΩΝ

Θέματα Εφαρμογών Βάσεων Δεδομένων: Ιδιωτικότητα Δεδομένων

ΔΕΙΓΜΑ ΠΡΙΝ ΤΙΣ ΔΙΟΡΘΩΣΕΙΣ - ΕΚΔΟΣΕΙΣ ΚΡΙΤΙΚΗ

Αντίστροφη & Ιδιάζουσα μήτρα. Στοιχεία Γραμμικής Άλγεβρας

Γραμμικός Προγραμματισμός Μέθοδος Simplex

Παραδείγματα (2 ο σετ) Διανυσματικοί Χώροι Επιμέλεια: Ι. Λυχναρόπουλος

2.7 ΤΟΠΙΚΑ ΑΚΡΟΤΑΤΑ ΣΥΝΑΡΤΗΣΗΣ

Θεωρία Γραφημάτων 6η Διάλεξη

Συνεκτικά σύνολα. R είναι συνεκτικά σύνολα.

Στοχαστικές Στρατηγικές. διαδρομής (1)

Παράδειγμα δομικής επαγωγής Ορισμός δομικής επαγωγής Συμβολοσειρές Γλώσσες Δυαδικά δένδρα Μαθηματικά Πληροφορικής 3ο Μάθημα Τμήμα Πληροφορικής και Τηλ

ΣΥΝΕΚΤΙΚΟΤΗΤΑ ΓΡΑΦΗΜΑΤΩΝ

Σχέσεις. Διμελής Σχέση. ΣτοΊδιοΣύνολο. Αναπαράσταση

Διάλεξη 7: X Y Σχήμα 7.2: Παράδειγμα για το Πόρισμα 7.2, όπου: 1 = {1, 2, 5}, 2 = {1, 2, 3}, 3 = {4}, 4 = {1, 3, 4}. Θ

ΕΥΡΕΣΗ ΕΛΑΧΙΣΤΩΝ ΜΟΝΟΠΑΤΙΩΝ & ΚΑΤΗΓΟΡΙΕΣ ΑΛΓΟΡΙΘΜΩΝ

Συντομότερες ιαδρομές

Δώστε έναν επαγωγικό ορισμό για το παραπάνω σύνολο παραστάσεων.

Παραδείγματα Ιδιοτιμές Ιδιοδιανύσματα

Ιδιάζουσες τιμές πίνακα. y έχουμε αντίστοιχα τις σχέσεις : Αυτές οι παρατηρήσεις συμβάλλουν στην παραγοντοποίηση ενός πίνακα

B = F i. (X \ F i ) = i I

Σχεδίαση και Ανάλυση Αλγορίθμων

Transcript:

Σημειωματάριο Δευτέρας 4 Δεκ. 2017 Ο αλγόριθμος Floyd-Warshall για την έυρεση όλων των αποστάσεων σε ένα γράφημα με βάρη στις ακμές Συνεχίσαμε σήμερα το θέμα της προηγούμενης Τετάρτης. Έχουμε ένα γράφημα στο οποίο οι ακμές έχουν κάποια βάρη επάνω τους (κάποιους μη αρνητικούς αριθμούς). Στο παράδειγμά μας έχουμε ένα γράφημα όπου κορυφές είναι κάποιες πόλεις της Κρήτης και τα βάρη πάνω σε ένα δρόμο (ακμή) από πόλη σε πόλη παριστάνουν την απόσταση σε χιλιόμετρα. Το γράφημα αυτό αναπαριστάμε όπως φαίνεται παρακάτω, σε ένα λεξικό όπου κλειδιά είναι οι πόλεις και η τιμή κάθε πόλης είναι επίσης ένα λεξικό. Στο λεξικό της κάθε πόλης κλειδιά είναι μόνο οι πόλεις που συνδέονται με αυτήν και τιμές αυτών είναι οι αποστάσεις τους.

In [3]: Graph = { 'ΧΣ': {'Χ': 60}, 'Χ': {'ΧΣ': 60, 'Ρ': 60}, 'Ρ': {'Χ': 60, 'Μ': 90, 'Η': 75}, 'Μ': {'Ρ': 90, 'Η': 50}, 'Η': {'Ρ': 75, 'Μ': 50, 'ΑΝ': 60}, 'ΑΝ': {'Η': 60, 'ΠΑ': 20}, 'ΠΑ': {'ΑΝ': 20, 'Ι': 20, 'Σ': 40}, 'Ι': {'ΠΑ': 20}, 'Σ': {'ΠΑ': 40}, }

Σκοπός μας είναι να βρούμε την απόσταση κάθε πόλης του γραφήματος από κάθε άλλη. Η απόσταση ανάμεσα σε δύο πόλεις είναι, εξ' ορισμού, το ελάχιστο μήκος μονοπατιού ξεκινά από τη μια πόλη και καταλήγει στην άλλη. Το να προσπαθήσει κανείς να βρει την απόσταση ανάμεσα σε δύο πόλεις ελέγχοντας όλα τα μονοπάτια που πάνε από τη μια στην άλλη μπορεί να είναι εξαιρετικά χρονοβόρο μια και μπορεί να υπάρχουν πάρα πολλοί τρόποι να κινηθεί κανείς ώστε να πάει από τη μια πόλη στην άλλη. Είναι φανερό λοιπόν ότι χρειαζόμαστε κάποιον ειδικό αλγόριθμο για αυτό το πρόβλημα. Ο αλγόριθμος που θα δούμε εδώ λέγεται αλγόριθμος Floyd-Warshall. Εδώ θα περιγράψουμε ένα αλγόριθμο που βρίσκει όλες τις αποστάσεις ανάμεσα σε όλα τα ζευγάρια κορυφών, σε ένα γράφημα G με (μη αρνητικά) βάρη στις ακμές του. Πρέπει να τονίσουμε ότι το πρόβλημα που λύνουμε εδώ αλγοριθμικά είναι το πρόβλημα των αποστάσεων από <<οποιαδήποτε σε οποιαδήποτε>> κορυφή. Στο τέλος του αλγορίθμου δηλ.\ θα μπορούμε να απαντήσουμε άμεσα (σε σταθερό χρόνο, όπως λέμε) σε κάθε ερώτημα <<ποια είναι η απόσταση ανάμεσα στις κορυφές i και j του γραφήματος;>>. Αν δε μας ενδιέφερε αυτή η γενικότητα αλλά θέλαμε, π.χ., να γνωρίζουμε, μετά το πέρας του αλγορίθμου, όλες τις αποστάσεις από την κορυφή προς όλες τις άλλες, τότε θα χρησιμοποιούσαμε διαφορετικό αλγόριθμο. Ο αλγόριθμος που δίνουμε σε αυτή την παράγραφο θα αποτελούσε <> για ένα τέτοιο ερώτημα: υπολογίζει πολλά αδιάφορα πράγματα. Θεωρούμε, ως συνήθως, το σύνολο κορυφών του γραφήματος να είναι το και γράφουμε για το βάρος της ακμής (το οποίο συμφωνούμε να θεωρούμε αν η ακμή αυτή δεν υπάρχει). Ο παρακάτω αλγόριθμος τροποποιεί σε κάθε επανάληψή του τον n n πίνακα A ο οποίος παίρνει αρχικές τιμές στο βήμα 1 και ενημερώνεται n φορές στο βήμα 3. Με w(i, j) συμβολίζουμε το βάρος της ακμής από το i στο j. Αν δεν υπάρχει ακμή από το i στο j τότε θέτουμε w(i, j) = + ή έστω κάποια τεράστια (σε σχέση με το πρόβλημά μας) τιμή που η ύπαρξή της θα εξασφαλίσει ότι η (μη υπαρκτή) ακμή από το i στο j δε θα χρησιμοποιηθεί σε κανένα μονοπάτι μια και μας ενδιαφέρουν τα μονοπάτια μικρού μήκους. Αλγόριθμος Floyd-Warshall + = w(i, j) i, j = 1,, n k = 1, 2,, n = min{, + } 1. Θέτουμε A (0), για. 2. Επαναλαμβάνουμε για το παρακάτω βήμα. 3. A (k) A (k 1) A (k 1) A (k 1), για. ik kj i, j = 1,, n [n] = {1, 2,, n} w(i, j) (i, j) Θεώρημα Στο τέλος του προηγούμενου αλγορίθμου η απόσταση ανάμεσα στις κορυφές i και j είναι ίση με A (n). Απόδειξη: Θα δείξουμε με επαγωγή ως προς το k ότι A (k) ισούται με L (k) = το μήκος του ελάχιστου μονοπατιού από το i στο j το οποίο όμως χρησιμοποιεί ενδιάμεσες κορυφές μόνο από το σύνολο. [k] = {1,, k} 1

k = 0 A (0) (i, j) i j (i, j) k = 0 Για το παραπάνω σύνολο είναι κενό και ο ισχυρισμός σημαίνει ότι ισούται με το βάρος της πλευράς μια και το σύνολο των μονοπατιών από το στο που {\em δε} χρησιμοποιούν καμία ενδιάμεση κορυφή αποτελείται από την ακμή και μόνο. Άρα ο ισχυρισμός είναι αληθής για. Υποθέτουμε τώρα ότι ο ισχυρισμός ισχύει μέχρι και για, θεωρούμε ένα ελάχιστο μονοπάτι από το στο που χρησιμοποιεί ενδιάμεσες κορυφές μόνο από το σύνολο, και ξεχωρίζουμε δύο περιπτώσεις. {1,, k} (α) Το ελάχιστο αυτό μονοπάτι δε χρησιμοποιεί την κορυφή k. (β) Χρησιμοποιεί την κορυφή k. Στην πρώτη περίπτωση έχουμε φυσικά L (k) L (k 1). Εστω ότι ισχύει το (β). Μπορούμε εύκολα να δείξουμε ότι όποιο και να είναι το ελάχιστο μονοπάτι από το i στο j περιέχει το k ακριβώς μια φορά (αν το περιέχει δυο ή παραπάνω μπορούμε να το μικρύνουμε το μονοπάτι παραλείποντας ένα κομμάτι ανάμεσα σε δύο εμφανίσεις του k). Επίσης, το κομμάτι του μονοπατιού από το i στο k είναι ένα ελάχιστο μονοπάτι από το i στο k που χρησιμοποιεί ενδιάμεσες κορυφές από το σύνολο {1,, k 1}. Αρα το μήκος του είναι L (k 1) και, ομοίως, το μήκος του μονοπατιού από το k στο j είναι L (k 1). Το συνολικό μήκος του μονοπατιού είναι λοιπόν σ'αυτή την περίπτωση ik kj L (k) = L (k 1) + L (k 1). ik kj Επίσης, σε κάθε περίπτωση, έχουμε τις ανισότητες L (k) L (k 1) και L (k) L (k 1) + L (k 1), ik kj η πρώτη από τον ορισμό του του συμβόλου L και μόνο και η δεύτερη παρατηρώντας ότι μπορούμε να πάμε από το i στο j (με ενδιάμεσους από το [k]) ακολουθώντας πρώτα ένα ελάχιστο μονοπάτι από το στο και μετά ένα ελάχιστο μονοπάτι από το στο (με ενδιάμεσους από το ). Από τα παραπάνω προκύπτει ότι L (k) = min{ L (k 1), L (k 1) + L (k 1) } ik kj και άρα, από τον τρόπο υπολογισμού των πινάκων A (k), έχουμε A (k) = L (k), για κάθε i, j = 1,, n, k = 0,, n. Υλοποίηση του αλγορίθμου Πρέπει κατ' αρχην να δούμε πώς μπορούμε να αποθηκεύουμε και να επεξαργαζόμαστε διδιάστατους πίνακες με την Python. Ο απλούστερος τρόπος είναι ο εξής. Για να αποθηκεύσουμε ένα πίνακα m n (με m γραμμές δηλ. και n στήλες) χρησιμοποιούμε μια λίστα που περιέχει m στοιχεία (τις γραμμές του πίνακα). Κάθε στοιχείο αυτής της λίστας είναι μια λίστα που περιέχει n στοιχεία, τα στοιχεία του πίνακα. Αν θέλουμε π.χ. να αποθηκεύσουμε τον = 2 3 πίνακα k 1 i j i k k j [k 1]

μπορούμε να το κάνουμε ως εξής: M = 3 1.5 3.1 3 2 3 In [1]: M = [ [3, 3.1, 2], [1.5, -3, 3] ] Για να αναφερθούμε στο στοιχείο M1,1 του πίνακα (η αρίθμησή μας από το 0 ως συνήθως) γράφουμε απλά M[1][1]. Πρώτη μας δουλειά λοιπόν είναι να μετατρέψουμε τα ονόματα των κορυφών μας από strings που είναι τώρα σε αριθμούς από 0 έως N-1, όπου N ο αριθμός όλων των κορυφών. Το κάνουμε αυτό φτιάχνοντας δύο λεξικά (με N κλειδιά το καθένα). Το λεξικό number έχει ως κλειδιά τα ονόματα των πόλεων ως strings και ως τιμή κάθε πόλης είναι το όνομά της ως αριθμός από 0 έως N-1. Το λεξικό name κάνει ακριβώς την αντίστροφη δουλειά. In [4]: N = len(graph.keys()) number = {} # Πρώτα υπολογίζουμε το λεξικό name count = 0 for s in Graph.keys(): number[s] = count count += 1 name = {} # και από το name υπολογίζουμε το λεξικό number for s in number.keys(): name[number[s]] = s print("λεξικό name: ", name) print("λεξικό number: ", number) Λεξικό name: {0: 'Χ', 1: 'ΧΣ', 2: 'Η', 3: 'Μ', 4: 'Σ', 5: 'ΑΝ', 6: 'Ι', 7: 'Ρ', 8: 'ΠΑ'} Λεξικό number: {'Χ': 0, 'ΧΣ': 1, 'Ρ': 7, 'Η': 2, 'Μ': 3, 'Σ': 4, 'ΠΑ': 8, 'ΑΝ': 5, 'Ι': 6}

Κατά τη διάρκεια του αλγορίθμου Floyd-Warshall θα χρειαστεί να υπολογίσουμε διαφορετικούς N N πίνακες, τους Κάθε ένας τέτοιος πίνακας A (k) χρειάζεται μόνο τον προηγούμενο πίνακα A (k 1) για να υπολογιστεί, οπότε δε χρειάζεται να τους αποθηκεύουμε όλους και αρκεί να κρατάμε κάθε φορά τον τελευταίο πίνακα που έχουμε υπολογίσει. Τον κρατάμε στη μεταβλητή A και υπολογίζουμε το νέο πίνακα (επόμενο k) στη μεταβλητή B. Έπειτα αντιγράφουμε τον πίνακα B στη μεταβλητή A και συνεχίζουμε έως ότου υπολογίσουμε τον τελευταίο πίνακα, ο οποίος αποτελεί και τη λύση στο πρόβλημά μας. Αρχικοποιούμε τις μεταβλητές A και B παρακάτω. Η τιμή 1e6 (δηλ. ) που χρησιμοποιούμε για να γεμίσουμε αρχικά τον πίνακα A παίζει το ρόλο του. Σε θέσεις όπου υπάρχει ακμή στο γράφημα αυτή η τιμή αντικαθίσταται από το πραγματικό μήκος της ακμής. i, j N + 1 A (k), για k = 0, 1,, N. i,j 10 6 + In [5]: A = []; B = [] row = N*[1e6] # Αυτή θα είναι μια γραμμή του πίνακα for i in range(n): # Την αντιγράφουμε N φορές A.append(row[:]) # προσοχή να δημιουργούμε νέο αντίγραφο κάθε φορά. αν γράφαμε row αντί για row[:] δε δουλεύει B.append(row[:]) A[i][i] = 0 # τα στοιχεία της διαγωνίου είναι 0 αφού δεν κοστίζει τίποτα να πάμε από το i στο i for s in Graph.keys(): # εδώ δίνουμε αρχικές τιμές στις θέσεις του πίνακα που αντιστοιχούν σε υπάρχουσες ακμές for t in Graph[s].keys(): A[number[s]][number[t]] = Graph[s][t] # προσέξτε ότι χρησιμοποιούμε number[s] αντί για το όνομα s Η επανάληψη είναι στο επόμενο. In [7]: for k in range(n): for i in range(n): for j in range(n): B[i][j] = min(a[i][j], A[i][k]+A[k][j]) # αυτή είναι η βασική επανάληψη for i in range(n): # εδώ αντιγράφουμε τον πίνακα B στον πίνακα A for j in range(n): A[i][j] = B[i][j]

Και εκτυπώνουμε τον πίνακα αποστάσεων παρακάτω. In [8]: for i in range(len(b)): for j in range(len(b[0])): print("{:4} ".format(b[i][j]), end='') print() 0 60 135 150 255 195 235 60 215 60 0 195 210 315 255 295 120 275 135 195 0 50 120 60 100 75 80 150 210 50 0 170 110 150 90 130 255 315 120 170 0 60 60 195 40 195 255 60 110 60 0 40 135 20 235 295 100 150 60 40 0 175 20 60 120 75 90 195 135 175 0 155 215 275 80 130 40 20 20 155 0 Ποια είναι η απόσταση Χώρας Σφακίων ('ΧΣ') -- Μοίρες ('Μ'); In [9]: B[number['ΧΣ']][number['Μ']] Out[9]: 210 Ακολουθεί ολόκληρο το πρόγραμμα στο επόμενο.

In [26]: Graph = { 'ΧΣ': {'Χ': 60}, 'Χ': {'ΧΣ': 60, 'Ρ': 60}, 'Ρ': {'Χ': 60, 'Μ': 90, 'Η': 75}, 'Μ': {'Ρ': 90, 'Η': 50}, 'Η': {'Ρ': 75, 'Μ': 50, 'ΑΝ': 60}, 'ΑΝ': {'Η': 60, 'ΠΑ': 20}, 'ΠΑ': {'ΑΝ': 20, 'Ι': 20, 'Σ': 40}, 'Ι': {'ΠΑ': 20}, 'Σ': {'ΠΑ': 40}, }

N = len(graph.keys()) number = {} count = 0 for s in Graph.keys(): number[s] = count count += 1 name = {} for s in number.keys(): name[number[s]] = s A = []; B = [] row = N*[1e6] for i in range(n): A.append(row[:]) B.append(row[:]) A[i][i] = 0 for s in Graph.keys(): for t in Graph[s].keys(): A[number[s]][number[t]] = Graph[s][t] for k in range(n): for i in range(n): for j in range(n): B[i][j] = min(a[i][j], A[i][k]+A[k][j]) for i in range(n): for j in range(n): A[i][j] = B[i][j] for i in range(len(b)): for j in range(len(b[0])): print("{:4} ".format(b[i][j]), end='') print()