Σημειωματάριο Τετάρτης 29 Νοε. 2017

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

Σημειωματάριο μαθήματος 1ης Νοε. 2017

Γράφοι. Ορολογία. Ορισµός: G = (V, E) όπου. Ορολογία (συνέχεια) γράφος ή γράφηµα (graph) V:ένα σύνολο E:µια διµελής σχέση στο V

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

Κατευθυνόμενα και μη κατευθυνόμενα γραφήματα

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

Επαγωγή και αναδρομή για άκυκλα συνεκτικά γραφήματα

Αναζήτηση Κατά Πλάτος

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

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

Επαγωγή και αναδρομή για συνεκτικά γραφήματα

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

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

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

Αναζήτηση Κατά Πλάτος

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

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

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

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

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

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

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

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

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

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

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

Πληροφοριακά Συστήματα Διοίκησης (ΜΒΑ) Ενότητα 1: Δικτυωτή Ανάλυση (Θεωρία Γράφων)

Αναζήτηση Κατά Πλάτος

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

Cuckoo Hashing. Αλγόριθμοι και Πολυπλοκότητα. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο

ΕΠΛ 211: Θεωρία Υπολογισμού και Πολυπλοκότητας. Διάλεξη 2: Μαθηματικό Υπόβαθρο

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

Κεφάλαιο 3. Γραφήµατα v1.0 ( ) Χρησιµοποιήθηκε υλικό από τις αγγλικές διαφάνειες του Kevin Wayne.

Κατ οίκον Εργασία 5 Σκελετοί Λύσεων

Κεφάλαιο 8: Προγραμματίζοντας αλγορίθμους έξυπνα και δημιουργικά

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

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

Κατευθυνόμενα γραφήματα. Μαθηματικά Πληροφορικής 6ο Μάθημα. Βρόγχοι. Μη κατευθυνόμενα γραφήματα. Ορισμός

ΜΕΜ251 Αριθμητική Ανάλυση

for for for for( . */

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΑΣΚΗΣΗ 4 Σωροί, Γράφοι

Κατ οίκον Εργασία 4 Σκελετοί Λύσεων

Στη C++ υπάρχουν τρεις τύποι βρόχων: (a) while, (b) do while, και (c) for. Ακολουθεί η σύνταξη για κάθε μια:

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

Network Science. Θεωρεία Γραφηµάτων (2)

Διάλεξη 1. Πράξεις Τελεστές Έλεγχος Ροής

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

Κεφάλαιο 3. Γραφήματα. v1.3 ( ) Χρησιμοποιήθηκε υλικό από τις αγγλικές διαφάνειες του Kevin Wayne.

Κατευθυνόμενα γραφήματα. Μαθηματικά Πληροφορικής 6ο Μάθημα. Βρόχοι. Μη κατευθυνόμενα γραφήματα. Ορισμός

Στοιχεία Θεωρίας Γράφων (Graph Theory)

Διερεύνηση γραφήματος

HY380 Αλγόριθμοι και πολυπλοκότητα Hard Problems

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

Εισαγωγή στους Αλγορίθμους Ενότητα 9η

Αναζήτηση Κατά Πλάτος

Σύντομες εισαγωγικές σημειώσεις για την. Matlab

Αλγόριθµοι Γραφηµάτων

βασικές έννοιες (τόμος Β)

Ενότητα: Δυαδική Αναζήτηση Σχέδιο Δραστηριότητας: Παιχνίδι: Βρες τον αριθμό

Θέματα Μεταγλωττιστών

HY118-Διακριτά Μαθηματικά

Κατευθυνόμενα γραφήματα. Μαθηματικά Πληροφορικής 6ο Μάθημα. Βρόχοι. Μη κατευθυνόμενα γραφήματα. Ορισμός

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

Κεφάλαιο 3. Γραφήµατα v1.1 ( ) Χρησιµοποιήθηκε υλικό από τις αγγλικές διαφάνειες του Kevin Wayne.

HY118-Διακριτά Μαθηματικά. Θεωρία γράφων/ γραφήματα. Τι είδαμε την προηγούμενη φορά. Συνεκτικότητα. 25 -Γράφοι

Αλγόριθμοι Γραφημάτων

Εισαγωγή στους Αλγόριθμους

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

Συνεκτικότητα Γραφήματος

έντρα ιδάσκοντες:. Φωτάκης,. Σούλιου Επιμέλεια διαφανειών:. Φωτάκης Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο

Βασικές Έννοιες Δοµών Δεδοµένων

(elementary graph algorithms)

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

Γράφημα. Συνδυαστικό αντικείμενο που αποτελείται από 2 σύνολα: Σύνολο κορυφών (vertex set) Σύνολο ακμών (edge set) 4 5 πλήθος κορυφών πλήθος ακμών

Θεωρία Γραφημάτων: Ορολογία και Βασικές Έννοιες

Άσκηση 3 (ανακοινώθηκε στις 24 Απριλίου 2017, προθεσμία παράδοσης: 2 Ιουνίου 2017, 12 τα μεσάνυχτα).

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

Αλγόριθμοι Γραφημάτων

Φύλλο Εργασίας 3. Μια γρήγορη επανάληψη από τα προηγούμενα

Initialize each person to be free. while (some man is free and hasn't proposed to every woman) { Choose such a man m w = 1 st woman on m's list to

f e Γράφημα (Graph) Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ

ιδάσκοντες: Φ. Αφράτη,. Φωτάκης,. Σούλιου Επιμέλεια διαφανειών:. Φωτάκης Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

Σχεδίαση και Ανάλυση Αλγορίθμων Ενότητα 3: ΑΝΑΠΑΡΑΣΤΑΣΗ ΔΕΔΟΜΕΝΩΝ - ΓΡΑΦΗΜΑΤΑ

Γράφοι. Ένας γράφος ή αλλιώς γράφηµα αποτελείται απο. Εφαρµογές: Τηλεπικοινωνιακά και Οδικά ίκτυα, Ηλεκτρονικά Κυκλώµατα, Β.. κ.ά.

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

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Αλγόριθμοι και Δομές Δεδομένων (IΙ) (γράφοι και δένδρα)

Δένδρα. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:

Διαδικασιακός Προγραμματισμός

Κατ οίκον Εργασία 5 Σκελετοί Λύσεων

Γ7.5 Αλγόριθμοι Αναζήτησης. Γ Λυκείου Κατεύθυνσης

Μετασχηματισμοί, Αναπαράσταση και Ισομορφισμός Γραφημάτων

Κεφάλαιο 4ο: Δικτυωτή Ανάλυση

Εξέταση Φεβρουαρίου Λύσεις

ΠΛΗ 20, 4 η ΟΣΣ: Βασικές Έννοιες Θεωρίας Γραφημάτων

Χρονικές σειρές 8 o μάθημα: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΣΤΗ MATLAB (2)

Θεωρία Υπολογισμού και Πολυπλοκότητα Ασυμφραστικές Γλώσσες (2)

Εισαγωγή στην Επεξεργασία Ερωτήσεων. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

ιαφάνειες παρουσίασης #11

Εργαστήριο 2: Πίνακες

Transcript:

Σημειωματάριο Τετάρτης 29 Νοε. 2017 Γραφήματα (γράφοι), η αναπαράστασή τους στον υπολογιστή και μερικά προβλήματα σε αυτά Είδαμε σήμερα λίγα πράγματα για γραφήματα (ή γράφους). Γράφημα είναι, στην απλούστερή του μορφή, ένα σύνολο V από κορυφές (ή κόμβους) και ένα σύνολο E από ακμές (μια ακμή είναι ένα ζεύγος κόμβων, στην απλούστερη περίπτωση μη διατεταγμένο). Συνιστώ να ρίξετε μια ματιά στο Κεφ. 5 του βιβλίου "Διακριτά Μαθηματικά" (https://repository.kallipos.gr/bitstream/11419/5187/2/discr-pdf-κου.pdf) (Μ. Κολουντζάκης, Χρ. Παπαχριστόδουλος) όπου θα δείτε αρκετά παραδείγματα στις πρώτες σελίδες του Κεφαλαίου. Πώς αναπαριστούμε στον υπολογιστή την πληροφορία των κορυφών και των συνδέσεών (ακμών) τους; Ο πρώτος τρόπος είναι να αραδιάσουμε όλες τις κορυφές σε μια λίστα, ας την πούμε V, και όλες τις ακμές (ζεύγη κορυφών, δηλ. στοιχείων της λίστας V) σε μια λίστα, ας την πούμε E. Για το παρακάτω γράφημα, για παράδειγμα, έχουμε τις λίστες V = [1, 2, 3, 4, 5] E = [ [2, 1], [2, 3], [4, 4], [4, 5] ]

ως αναπαράστασή του. Ένας δεύτερος τρόπος αναπαράστασης του γραφήματος στον υπολογιστή είναι κάπως πιο "κορυφοκεντρικός". Κρατάμε δηλ. για κάθε κορυφή του γραφήματος τη λίστα των γειτόνων του, των κορυφών δηλ. που συνδέονται με αυτήν με κάποια ακμή. Ο φυσιολογικός τρόπος να κρατήσουμε αυτήν την πληροφορία είναι σε ένα λεξικό που έχει ως κλειδιά της κορυφές και ως τιμή κάθε κλειδιού τη λίστα των γειτόνων του. Για το παραπάνω γράφημα έχουμε το λεξικό: Neighbor = { 1: [2], 2: [1, 3], 3: [2], 4: [4, 5], 5: [4] Η πρώτη μας δουλειά είναι να υπολογίσουμε τη δεύτερη αναράσταση του γραφήματος από την πρώτη και το αντίστροφο. In [2]: V = [1, 2, 3, 4, 5] E = [ [2, 1], [2, 3], [4, 4], [4, 5] ] Neighbor = { # αυτό είναι το λεξικό που θα φτιάξουμε από τα V, E παραπάνω for v in V: # εισάγουμε κατ' αρχήν όλα τα κλειδιά του λεξικού (όλες τις κορυφές) χωρίς κανένα γείτονα Neighbor[v] = [] for e in E: # για κάθε ακμή e στο E a = e[0] # έστω a, b οι δύο κορυφές της ακμής b = e[1] if a == b: # οι δύο κορυφές μπορεί και να συμπίπτουν Neighbor[a].append(a) # σε αυτή την περίπτωση κάνουμε μόνο μια προσθήκη, στην κορυφή a else: # αν οι κορυφές είναι διαφορετικές Neighbor[a].append(b) # βάζουμε την b στη λίστα γειτόνων της a Neighbor[b].append(a) # και την a στη λίστα γειτόνων της b print(neighbor) {1: [2], 2: [1, 3], 3: [2], 4: [4, 5], 5: [4] Τώρα ξεκινάμε από τη δεύτερη αναπαράσταση (λεξικό Neighbor) και κατασκευάζουμε την πρώτη (λίστες E, V).

In [5]: Neighbor = {1: [2], 2: [1, 3], 3: [2], 4: [4, 5], 5: [4] V = list(neighbor.keys()) # οι κορυφές είναι τα κλειδιά του λεξικού E = [] # η λίστα ακμών είναι κατ' αρχήν κενή for v in V: # για κάθε κορυφή v V1 = Neighbor[v] # ας είναι V1 η λίστα των γειτόνων του for w in V1: # για κάθε γείτονα w του v if [w, v] in E: # υπάρχει περίπτωση να έχει ήδη μπει η ακμή στο E με πρώτη κορυφή την w continue # σε αυτή την περίπτωση δεν κάνουμε τίποτα E.append([v, w]) # αν δεν υπάρχει η ακμή τη βάζουμε στο E print("v =", V) print("e =", E) V = [1, 2, 3, 4, 5] E = [[1, 2], [2, 3], [4, 4], [4, 5]] Η συνεκτική συνιστώσα μιας κορυφής v ενός γραφήματος είναι το σύνολο όλων των κορυφών του γραφήματος που είναι προσβάσιμες από την v, στις οποίες δηλ. μπορούμε να πάμε ξεκινώντας από την v και κινούμενοι πάνω στις υπάρχουσες ακμές του γραφήματος. Οι κορυφές του γραφήματος χωρίζονται έτσι σε (ξένες μεταξύ τους) συνεκτικές συνιστώσες. Δύο κορυφές a και b είναι προσβάσιμες η μια από την άλλη (μιλάμε πάντα για ακμές χωρίς κατεύθυνση) αν και μόνο αν ανήκουν στην ίδια συνεκτική συνιστώσα του γραφήματος. Για παράδειγμα στο γράφημα

οι συνεκτικές συνιστώσες είναι οι {0, 5, {1, 3, {2, 4, 7, {6. Στο παρακάτω πρόγραμμα υπολογίζουμε με τη συνάρτηση component τη συνιστώσα της κορυφής v στο γράφημα του οποία η συνδεσμολογία περιγράφεται στο λεξικό N. In [11]: Neighbor = { 0: [5], 1: [3], 2: [4, 7], 3: [1], 4: [2], 5: [0], 6: [], 7: [2], def component(n, v): # Επιστρέφει σε μια λίστα όλες τις κορυφές # της συνεκτικής συνιστώσας του v L = [ v ] # κατ' αρχήν μόνο το v ανήκει στη συνιστώσα του while True: # συνεχώς κοιτάμε τους γείτονες της συνιστώσας (λίστα L) μέχρι στιγμής # για να ανακαλύψουμε κι άλλες κορυφές της συνιστώσας (τις βάζουμε στη λίστα wave) wave = [] # θα είναι οι νέοι γείτονες του L for w in L: # για κάθε κορυφή w της λίστας L for x in N[w]: # και για κάθε γείτονα x της w if (x not in L) and (x not in wave): # αν η x δεν είναι ήδη στο wave ή στο L wave.append(x) # βάζουμε την x στο wave L = L+wave # επαυξάνουμε τη λίστα (συνεκτική συνιστώσα) με τις κορυφές της λίστας wave if wave==[]: # αν το wave ήταν κενό (δεν ανακαλύψαμε κανένα καινούργιο στοιχείο) σταματάμε το loop break return L # επιστρέφουμε τη συνεκτική συνιστώσα # τα παρακάτω επιστρέφουν διαφορετικές λίστες αλλά με τα ίδια στοιχεία, μια και το 4 είναι προσβάσιμο από το print(component(neighbor, 4)) print(component(neighbor, 7)) [4, 2, 7] [7, 2, 4] Στο παρακάτω χρησιμοποιούμε την component για να βρούμε με τη συνάρτηση allcomponents όλες τις συνεκτικές συνιστώσες ενός γραφήματος.

In [12]: Neighbor = { 0: [5], 1: [3], 2: [4, 7], 3: [1], 4: [2], 5: [0], 6: [], 7: [2], def component(n, v): # Επιστρέφει σε μια λίστα όλες τις κορυφές # της συνεκτικής συνιστώσας του v L = [ v ] # κατ' αρχήν μόνο το v ανήκει στη συνιστώσα του while True: # συνεχώς κοιτάμε τους γείτονες της συνιστώσας (λίστα L) μέχρι στιγμής # για να ανακαλύψουμε κι άλλες κορυφές της συνιστώσας (τις βάζουμε στη λίστα wave) wave = [] # θα είναι οι νέοι γείτονες του L for w in L: # για κάθε κορυφή w της λίστας L for x in N[w]: # και για κάθε γείτονα x της w if (x not in L) and (x not in wave): # αν η x δεν είναι ήδη στο wave ή στο L wave.append(x) # βάζουμε την x στο wave L = L+wave # επαυξάνουμε τη λίστα (συνεκτική συνιστώσα) με τις κορυφές της λίστας wave if wave==[]: # αν το wave ήταν κενό (δεν ανακαλύψαμε κανένα καινούργιο στοιχείο) σταματάμε το loop break return L # επιστρέφουμε τη συνεκτική συνιστώσα def allcomponents(n): # επιστρέφει μια λίστα με όλες τις συνεκτικές συνιστώσες του γραφήματος N V = list(n.keys()) # αυτές είναι οι κορυφές Components = [] # η λίστα που επιστρέφουμε, αρχικά κενή while True: # βρίσκουμε συνεχώς συνεκτικές συνιστώσες # για κάθε μια που βρίσκουμε αφαιρούμε τις κορυφές της από το V έως ότου αυτό μείνει κενό. v = V[0] # η πρώτη κορυφή (που έχει απομείνει στο V) L = component(n, v) # η L είναι η συνεκτική συνιστώσα του v Components.append(L) # προσθέτουμε τη συνιστώσα L στο αποτέλεσμα που θα επιστρέψουμε for w in L: # για κάθε κορυφή w της συνιστώσας L V.remove(w) # την αφαιρούμε από το σύνολο κορυφών if V==[]: # αν το σύνολο κορυφών έχει μείνει κενό τελειώσαμε break return Components # επιστρέφουμε τη λίστα με τις συνιστώσες print(allcomponents(neighbor)) [[0, 5], [1, 3], [2, 4, 7], [6]] Στο παρακάτω γράφημα

με κορυφές κάποιες πόλεις της Κρήτης οι διάφορες ακμές έχουν μια επιπλέον πληροφορία που τις συνοδεύει, ένα πραγματικό (θετικό) αριθμό, το μήκος τους. Για να παραστήσουμε ένα τέτοιο γράφημα στον υπολογιστή θα πρέπει για κάθε ακμή να κρατάμε κι ένα αριθμό μαζί. Αυτό βολεύει να το κάνουμε κρατώντας τους γείτονες μιας κορυφής όχι απλά σε μια λίστα αλλά σε ένα λεξικό με κλειδί τις κορυφές και τιμές τις αποστάσεις από την κορυφή. Έτσι το παρακάτω γράφημα το αναπαριστούμε με το λεξικό Graph = { 'ΧΣ': {'Χ': 60, 'Χ': {'ΧΣ': 60, 'Ρ': 60, 'Ρ': {'Χ': 60, 'Μ': 90, 'Η': 75, 'Μ': {'Ρ': 90, 'Η': 50, 'Η': {'Ρ': 75, 'Μ': 50, 'ΑΝ': 60, 'ΑΝ': {'Η': 60, 'ΠΑ': 20, 'ΠΑ': {'ΑΝ': 20, 'Ι': 20, 'Σ': 40, 'Ι': {'ΠΑ': 20, 'Σ': {'ΠΑ': 40, Την επόμενη φορά θα δούμε πώς θα λύσουμε το βασικό πρόβλημα της εύρεσης αποστάσεων σε ένα τέτοιο γράφημα.