Τεχνολογίες Υλοποίησης Αλγορίθµων

Σχετικά έγγραφα
Τεχνολογίες Υλοποίησης Αλγορίθµων

Τεχνολογίες Υλοποίησης Αλγορίθµων

Τεχνολογίες Υλοποίησης Αλγορίθµων

Προηγµένα Θέµατα Τεχνολογιών Υλοποίησης Αλγορίθµων

Τεχνολογίες Υλοποίησης Αλγορίθµων

Τεχνολογίες Υλοποίησης Αλγορίθµων

Ασκηση 1 [ ] Παράδοση : Τετάρτη , 13:00

Τεχνολογίες Υλοποίησης Αλγορίθµων

Μέγιστη ροή. Κατευθυνόμενο γράφημα. Συνάρτηση χωρητικότητας. αφετηρίακός κόμβος. τερματικός κόμβος. Ροή δικτύου. με τις ακόλουθες ιδιότητες

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

Κεφάλαιο : Επαναλήψεις (for, do-while)

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

Τεχνολογίες Υλοποίησης Αλγορίθµων

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 22/11/07

Τεχνολογίες Υλοποίησης Αλγορίθµων

Γράφηµα (Graph) Εργαστήριο 10. Εισαγωγή

Τεχνολογίες Υλοποίησης Αλγορίθµων

Κεφάλαιο : Επαναλήψεις (oι βρόγχοιfor, do-while) (Διάλεξη 10) Εντολές Επανάληψης που θα καλυφθούν σήμερα

Απλές Δοµές Δεδοµένων Στην ενότητα αυτή θα γνωρίσουµε ορισµένες απλές Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε για την αποδοτική επίλυση του προβλή

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 7

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

Εισαγωγή στον Προγραμματισμό

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

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

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

4η Γραπτή Ασκηση Αλγόριθμοι και Πολυπλοκότητα CoReLab ΣΗΜΜΥ 7 Φεβρουαρίου 2017 CoReLab (ΣΗΜΜΥ) 4η Γραπτή Ασκηση 7 Φεβρουαρίου / 38

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

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

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

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

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

Υπολογισμός - Εντολές Επανάληψης

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

Δομές ελέγχου ροής προγράμματος

Μέγιστη ροή. Κατευθυνόμενο γράφημα. Συνάρτηση χωρητικότητας. αφετηρίακός κόμβος. τερματικός κόμβος. Ροή δικτύου. με τις ακόλουθες ιδιότητες

Δομές Δεδομένων και Αλγόριθμοι

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 3

Στόχοι και αντικείμενο ενότητας. Προτάσεις επανάληψης. Έλεγχος ροής προγράμματος. #5.. Εντολές Επανάληψης

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

Πληροφορική 2. Αλγόριθμοι

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

Μάθημα 21: Ουρές (Queues)

Επίλυση Προβληµάτων µε Greedy Αλγόριθµους

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 8

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

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

Στοίβες - Ουρές. Στοίβα (stack) Γιάννης Θεοδωρίδης, Νίκος Πελέκης, Άγγελος Πικράκης Τµήµα Πληροφορικής

Αλγόριθµοι Ροής σε Γράφους (CLR, κεφάλαιο 27)

Προηγµένα Θέµατα Τεχνολογιών Υλοποίησης Αλγορίθµων

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

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

Αλγόριθμοι Eλάχιστα μονοπάτια

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

Θεωρία και Αλγόριθμοι Γράφων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

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

Η βασική συνάρτηση προγράμματος main()

Alternative to Balanced Trees, Comms of the ACM, 33(6), June 1990,

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java II

Συλλογές, Στοίβες και Ουρές

Οντοκεντρικός Προγραμματισμός

4η Γραπτή Ασκηση Αλγόριθμοι και Πολυπλοκότητα CoReLab ΣΗΜΜΥ 3/2/2019 CoReLab (ΣΗΜΜΥ) 4η Γραπτή Ασκηση 3/2/ / 37

Δομές ελέγχου & επανάληψης

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

Η εντολή if-else. Η απλή μορφή της εντολής if είναι η ακόλουθη: if (συνθήκη) { Η γενική μορφή της εντολής ifelse. εντολή_1; εντολή_2;..

Δομές Δεδομένων (Data Structures)

Αντικειµενοστρεφής Προγραµµατισµός

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

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

Αναδροµή. Σε αυτήν την (βοηθητική) ενότητα θα µελετηθούν τα εξής : Η έννοια της αναδροµής Υλοποίηση και αποδοτικότητα Αφαίρεση της αναδροµής

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 6

Ιδιοκτησία Αντικειµένου

Εισαγωγή στον Προγραμματισμό

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 10

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

Εισαγωγή στον Προγραμματισμό

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

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

Είδη εντολών. Απλές εντολές. Εντολές ελέγχου. Εκτελούν κάποια ενέργεια. Ορίζουν τον τρόπο με τον οποίο εκτελούνται άλλες εντολές

Ελάχιστα Γεννητορικά ένδρα

Ενδεικτικές Λύσεις 1ου Σετ Ασκήσεων

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

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

Οι εντολές ελέγχου της ροής ενός προγράμματος.

Προγραμματισμός Η/Υ (ΤΛ2007 )

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

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 3 η : Επίλυση Προβληµάτων Χειµερινό Εξάµηνο 2011

for for for for( . */

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

Η γλώσσα προγραμματισμού C

Δομές Δεδομένων & Αλγόριθμοι

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

ΑΣΚΗΣΕΙΣ ΓΙΑ ΤΟ ΕΡΓΑΣΤΗΡΙΟ 2

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

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

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

ΑΕΠΠ 6o Επαναληπτικό Διαγώνισμα

ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ C ΣΕΙΡΑ 2 η

Μη κατευθυνόµενα γραφήµατα. Στοιχεία Θεωρίας Γραφηµάτων (1) Υπογραφήµατα.

2.1. Εντολές Σχόλια Τύποι Δεδομένων

Transcript:

Τεχνολογίες Υλοποίησης Αλγορίθµων Χρήστος Ζαρολιάγκης Καθηγητής Τµήµα Μηχ/κων Η/Υ & Πληροφορικής Πανεπιστήµιο Πατρών email: zaro@ceid.upatras.gr Ενότητα 8 Μέγιστη Ροή & Αριθµητική Ορθότητα Αλγορίθµων 1 / 38

Ενότητα 8 Μέγιστη Ροή & Αριθµητική Ορθότητα Αλγορίθµων Μέγιστη Ροή Γενικά Ελεγκτής Ορθότητας Αλγόριθµος Προροής-Προώθησης Αριθµητικοί Τύποι και Ορθότητα Αλγορίθµων Γραφηµάτων & ικτύων 2 / 38

Μέγιστη Ροή Γενικά 3 / 38

Μέγιστη Ροή Γενικά Κατευθυνόµενο γράφηµα G = (V, E) µε συνάρτηση χωρητικότητας cap : E IR 0 και δύο διακεκριµένες κορυφές s και t 3 / 38

Μέγιστη Ροή Γενικά Κατευθυνόµενο γράφηµα G = (V, E) µε συνάρτηση χωρητικότητας cap : E IR 0 και δύο διακεκριµένες κορυφές s και t In(v) = {e : target(e) = v}, Out(v) = {e : source(e) = v}, v V 3 / 38

Μέγιστη Ροή Γενικά Κατευθυνόµενο γράφηµα G = (V, E) µε συνάρτηση χωρητικότητας cap : E IR 0 και δύο διακεκριµένες κορυφές s και t In(v) = {e : target(e) = v}, Out(v) = {e : source(e) = v}, v V (s, t)-ϱοή (ή απλά ϱοή): συνάρτηση f : E IR 0 για την οποία: (1) 0 f(e) cap(e) e E (2) excess(v) = f(e) f(e) = 0 v V {s, t} e In(v) e Out(v) 3 / 38

Μέγιστη Ροή Γενικά Κατευθυνόµενο γράφηµα G = (V, E) µε συνάρτηση χωρητικότητας cap : E IR 0 και δύο διακεκριµένες κορυφές s και t In(v) = {e : target(e) = v}, Out(v) = {e : source(e) = v}, v V (s, t)-ϱοή (ή απλά ϱοή): συνάρτηση f : E IR 0 για την οποία: (1) 0 f(e) cap(e) e E (2) excess(v) = f(e) f(e) = 0 v V {s, t} e In(v) e Out(v) Τιµή ϱοής f = excess(t) 3 / 38

Μέγιστη Ροή Γενικά Κατευθυνόµενο γράφηµα G = (V, E) µε συνάρτηση χωρητικότητας cap : E IR 0 και δύο διακεκριµένες κορυφές s και t In(v) = {e : target(e) = v}, Out(v) = {e : source(e) = v}, v V (s, t)-ϱοή (ή απλά ϱοή): συνάρτηση f : E IR 0 για την οποία: (1) 0 f(e) cap(e) e E (2) excess(v) = f(e) f(e) = 0 v V {s, t} e In(v) e Out(v) Τιµή ϱοής f = excess(t) Μέγιστη Ροή: ϱοή f που µεγιστοποιεί την f 3 / 38

Μέγιστη Ροή Γενικά 4 / 38

Μέγιστη Ροή Γενικά (s, t)-αποκοπή (ή απλά αποκοπή): σύνολο S κορυφών µε s S και t T = V S Εστω (S, T) = {e : source(e) S, target(e) T} 4 / 38

Μέγιστη Ροή Γενικά (s, t)-αποκοπή (ή απλά αποκοπή): σύνολο S κορυφών µε s S και t T = V S Εστω (S, T) = {e : source(e) S, target(e) T} Χωρητικότητα αποκοπής: cap(s) = cap(e) e (S,T) 4 / 38

Μέγιστη Ροή Γενικά (s, t)-αποκοπή (ή απλά αποκοπή): σύνολο S κορυφών µε s S και t T = V S Εστω (S, T) = {e : source(e) S, target(e) T} Χωρητικότητα αποκοπής: cap(s) = cap(e) e (S,T) Κορεσµένη αποκοπή : αποκοπή S για την οποία f(e) = cap(e), e (S, T) και f(e) = 0, e (T, S) 4 / 38

Μέγιστη Ροή Γενικά (s, t)-αποκοπή (ή απλά αποκοπή): σύνολο S κορυφών µε s S και t T = V S Εστω (S, T) = {e : source(e) S, target(e) T} Χωρητικότητα αποκοπής: cap(s) = cap(e) e (S,T) Κορεσµένη αποκοπή : αποκοπή S για την οποία f(e) = cap(e), e (S, T) και f(e) = 0, e (T, S) Εστω f οποιαδήποτε ϱοή και έστω S οποιαδήποτε αποκοπή. Τότε, f cap(s) 4 / 38

Μέγιστη Ροή Γενικά (s, t)-αποκοπή (ή απλά αποκοπή): σύνολο S κορυφών µε s S και t T = V S Εστω (S, T) = {e : source(e) S, target(e) T} Χωρητικότητα αποκοπής: cap(s) = cap(e) e (S,T) Κορεσµένη αποκοπή : αποκοπή S για την οποία f(e) = cap(e), e (S, T) και f(e) = 0, e (T, S) Εστω f οποιαδήποτε ϱοή και έστω S οποιαδήποτε αποκοπή. Τότε, f cap(s) Ελάχιστη αποκοπή: αποκοπή S που ελαχιστοποιεί την cap(s) 4 / 38

Μέγιστη Ροή Γενικά 5 / 38

Μέγιστη Ροή Γενικά Υπόθεση: e E = e E 5 / 38

Μέγιστη Ροή Γενικά Υπόθεση: e E = e E Υπολειπόµενη χωρητικότητα ακµής e = (u, v): r(e) = cap(e) f(e) + f(e ), όπου e = (v, u) 5 / 38

Μέγιστη Ροή Γενικά Υπόθεση: e E = e E Υπολειπόµενη χωρητικότητα ακµής e = (u, v): r(e) = cap(e) f(e) + f(e ), όπου e = (v, u) Υπολειπόµενο δίκτυο G f = (V, E f ), όπου E f = {e E : r(e) > 0} 5 / 38

Μέγιστη Ροή Γενικά 6 / 38

Μέγιστη Ροή Γενικά Υπολειπόµενη χωρητικότητα (u, v): r(u, v) = cap(u, v) f(u, v) + f(v, u) 6 / 38

Μέγιστη Ροή Γενικά Υπολειπόµενη χωρητικότητα (u, v): r(u, v) = cap(u, v) f(u, v) + f(v, u) Υπολειπόµενο δίκτυο G f = (V, E f ), όπου E f = {e E : r(e) > 0} v (f(v,w),cap(v,w)) w 2 (0,3) 4 G (1,4) (2,3) s 1 (1,1) (2,2) 6 t (3,3) (2,4) 3 (2,3) 5 v r(v,w) w G(f) s 1 3 1 3 2 1 3 2 4 2 2 1 2 6 t 1 3 2 5 6 / 38

Μέγιστη Ροή Γενικά 7 / 38

Μέγιστη Ροή Γενικά Υπολειπόµενη χωρητικότητα µια συµπληρωµατική εικόνα Εστω e G Αν f(e) < cap(e), τότε e G(f) µε r(e) = cap(e) f(e) Αν f(e) > 0, τότε e G(f) µε r(e ) = f(e) 7 / 38

Μέγιστη Ροή Γενικά Υπολειπόµενη χωρητικότητα µια συµπληρωµατική εικόνα Εστω e G Αν f(e) < cap(e), τότε e G(f) µε r(e) = cap(e) f(e) Αν f(e) > 0, τότε e G(f) µε r(e ) = f(e) Εστω f µια ϱοή και έστω S το σύνολο των κορυφών που είναι προσπελάσιµες από την s στο G(f) (α) Αν t S, τότε η f δεν είναι µέγιστη (ϐ) Αν t S, τότε η f είναι µέγιστη και το S αποτελεί µια κορεσµένη αποκοπή 7 / 38

Μέγιστη Ροή Γενικά Υπολειπόµενη χωρητικότητα µια συµπληρωµατική εικόνα Εστω e G Αν f(e) < cap(e), τότε e G(f) µε r(e) = cap(e) f(e) Αν f(e) > 0, τότε e G(f) µε r(e ) = f(e) Εστω f µια ϱοή και έστω S το σύνολο των κορυφών που είναι προσπελάσιµες από την s στο G(f) (α) Αν t S, τότε η f δεν είναι µέγιστη (ϐ) Αν t S, τότε η f είναι µέγιστη και το S αποτελεί µια κορεσµένη αποκοπή Θεώρηµα Μέγιστης-Ροής Ελάχιστης-Αποκοπής: Η τιµή της µέγιστης ϱοής ισούται µε την χωρητικότητα της ελάχιστης αποκοπής 7 / 38

Μέγιστη Ροή Ελεγκτής Ορθότητας 8 / 38

Μέγιστη Ροή Ελεγκτής Ορθότητας bool CHECK_MAX_FLOW_T(const graph& G, node s, node t const edge_array<nt>& cap, const edge_array<nt>& f) ελέγχει αν η f είναι µια µέγιστη (s, t)-ϱοή και επιστρέφει true αν όντως είναι, αλλιώς false 8 / 38

Μέγιστη Ροή Ελεγκτής Ορθότητας bool CHECK_MAX_FLOW_T(const graph& G, node s, node t const edge_array<nt>& cap, const edge_array<nt>& f) ελέγχει αν η f είναι µια µέγιστη (s, t)-ϱοή και επιστρέφει true αν όντως είναι, αλλιώς false Ιδέα ελεγκτή: Ελεγχος της συνθήκης χωρητικότητας κάθε ακµής Υπολογισµός πλεονάσµατος (excess) κάθε κορυφής: όλες οι κορυφές, εκτός από τις s και t, πρέπει να έχουν πλεόνασµα µηδέν Υπολογισµός των προσπελάσιµων από την s κορυφών στο G(f) µε χρήση ΑΠΠ: η t δεν πρέπει να είναι προσπελάσιµη 8 / 38

Μέγιστη Ροή Ελεγκτής Ορθότητας template <class NT> bool CHECK_MAX_FLOW_T(const graph& G, node s, node t, const edge_array<nt>& cap, const edge_array<nt>& f) { node v; edge e; string loc = "CHECK_MAX_FLOW_T: "; bool res = true; forall_edges(e,g) res = res && leda_assert(f[e] >= 0 && f[e] <= cap[e], loc + "illegal flow value"); node_array<nt> excess(g,0); forall_edges(e,g) { node v = G.source(e); node w = G.target(e); excess[v] -= f[e]; excess[w] += f[e]; } forall_nodes(v,g) res = res && leda_assert(v == s v == t excess[v] == 0,loc + "node with non-zero excess"); // Compute nodes reachable from s using BFS } 9 / 38

Μέγιστη Ροή Ελεγκτής Ορθότητας // Compute nodes reachable from s using BFS node_array<bool> reached(g,false); queue<node> Q; Q.append(s); reached[s] = true; while (!Q.empty() ) { node v = Q.pop(); forall_out_edges(e,v) { node w = G.target(e); if ( f[e] < cap[e] &&!reached[w] ) { reached[w] = true; Q.append(w); } } forall_in_edges(e,v) { node w = G.source(e); if ( f[e] > 0 &&!reached[w] ) { reached[w] = true; Q.append(w); } } } res = res && leda_assert(!reached[t], "t is reachable in G_f"); return res; 10 / 38

Μέγιστη Ροή Αλγόριθµος Προροής-Προώθησης 11 / 38

Μέγιστη Ροή Αλγόριθµος Προροής-Προώθησης Προροή : συνάρτηση f : E IR 0 για την οποία: (1) 0 f(e) cap(e) e E (2) excess(v) 0 v V + = V {s, t} 11 / 38

Μέγιστη Ροή Αλγόριθµος Προροής-Προώθησης Προροή : συνάρτηση f : E IR 0 για την οποία: (1) 0 f(e) cap(e) e E (2) excess(v) 0 v V + = V {s, t} Ενεργή κορυφή : v V + και excess(v) > 0 11 / 38

Μέγιστη Ροή Αλγόριθµος Προροής-Προώθησης Προροή : συνάρτηση f : E IR 0 για την οποία: (1) 0 f(e) cap(e) e E (2) excess(v) 0 v V + = V {s, t} Ενεργή κορυφή : v V + και excess(v) > 0 Προώθηση : έστω v ενεργή κορυφή, e = (v, w) G(f), και δ min{excess(v), r(e)} Προώθηση δ µονάδων ϱοής κατά µήκος της e = { αυξάνει την f(e) κατά δ, αν e E µειώνει την f(e ) κατά δ, αν e E 11 / 38

Μέγιστη Ροή Αλγόριθµος Προροής-Προώθησης Προροή : συνάρτηση f : E IR 0 για την οποία: (1) 0 f(e) cap(e) e E (2) excess(v) 0 v V + = V {s, t} Ενεργή κορυφή : v V + και excess(v) > 0 Προώθηση : έστω v ενεργή κορυφή, e = (v, w) G(f), και δ min{excess(v), r(e)} Προώθηση δ µονάδων ϱοής κατά µήκος της e = { αυξάνει την f(e) κατά δ, αν e E µειώνει την f(e ) κατά δ, αν e E Αν δ = r(e), τότε η προώθηση καλείται κορεσµένη 11 / 38

Μέγιστη Ροή Αλγόριθµος Προροής-Προώθησης v (1,3) w v 2 w G 1 G(f) push v w push w v v (2,3) w v (0,3) w G G Προώθηση 1 µονάδας ϱοής κατά µήκος της (v, w) (ή της (w, v)) 12 / 38

Μέγιστη Ροή Αλγόριθµος Προροής-Προώθησης 13 / 38

Μέγιστη Ροή Αλγόριθµος Προροής-Προώθησης Ποιες προωθήσεις πρέπει να εκτελεστούν ; 13 / 38

Μέγιστη Ροή Αλγόριθµος Προροής-Προώθησης Ποιες προωθήσεις πρέπει να εκτελεστούν ; Τοποθέτηση των κορυφών σε επίπεδα µε την t στο χαµηλότερο επίπεδο και εκτέλεση προωθήσεων που µεταφέρουν πλεόνασµα από υψηλότερο σε χαµηλότερο επίπεδο 13 / 38

Μέγιστη Ροή Αλγόριθµος Προροής-Προώθησης 14 / 38

Μέγιστη Ροή Αλγόριθµος Προροής-Προώθησης d(v): επίπεδο κορυφής v 14 / 38

Μέγιστη Ροή Αλγόριθµος Προροής-Προώθησης d(v): επίπεδο κορυφής v Η ακµή e = (v, w) G(f) καλείται κατάλληλη αν d(w) < d(v) 14 / 38

Μέγιστη Ροή Αλγόριθµος Προροής-Προώθησης d(v): επίπεδο κορυφής v Η ακµή e = (v, w) G(f) καλείται κατάλληλη αν d(w) < d(v) Προώθηση κατά µήκος της e = (v, w) G(f) εκτελείται αν η v είναι ενεργή και η e κατάλληλη 14 / 38

Μέγιστη Ροή Αλγόριθµος Προροής-Προώθησης 15 / 38

Μέγιστη Ροή Αλγόριθµος Προροής-Προώθησης Τι γίνεται όµως αν κάποια κορυφή v είναι ενεργή και κατάλληλη ακµή προσκείµενη στην v; 15 / 38

Μέγιστη Ροή Αλγόριθµος Προροής-Προώθησης Τι γίνεται όµως αν κάποια κορυφή v είναι ενεργή και κατάλληλη ακµή προσκείµενη στην v; Η v ανεβαίνει επίπεδο, δηλ. το d(v) αυξάνεται κατά 1 15 / 38

Μέγιστη Ροή Γενικευµένος Αλγόριθµος Προροής-Προώθησης /* αρχικοποίηση */ Θέσε f(e) = cap(e) για όλες τις ακµές µε source(e) = s; Θέσε f(e) = 0 για όλες τις υπόλοιπες ακµές ; Θέσε d(s) = n και d(v) = 0 για όλες τις κορυφές ; /* κύριος ϐρόχος */ while ενεργή κορυφή { έστω v µια ενεργή κορυφή; if κατάλληλη ακµή e = (v, w) G f then { προώθησε δ min{excess(v), r(e)} µονάδες ϱοής στην e; else { αύξησε το d(v); } } 16 / 38

Μέγιστη Ροή Αλγόριθµος Προροής-Προώθησης 17 / 38

Μέγιστη Ροή Αλγόριθµος Προροής-Προώθησης Μη κορεσµένες προωθήσεις µπορεί να δηµιουργήσουν πρόβληµα 17 / 38

Μέγιστη Ροή Αλγόριθµος Προροής-Προώθησης Μη κορεσµένες προωθήσεις µπορεί να δηµιουργήσουν πρόβληµα Κανόνας 1 µέγιστη προώθηση: προώθηση δ= min{excess(v), r(e)} Κάθε µη-κορεσµένη προώθηση µιας ακµής (v, w) αφήνει την v ανενεργή 17 / 38

Μέγιστη Ροή Αλγόριθµος Προροής-Προώθησης Μη κορεσµένες προωθήσεις µπορεί να δηµιουργήσουν πρόβληµα Κανόνας 1 µέγιστη προώθηση: προώθηση δ= min{excess(v), r(e)} Κάθε µη-κορεσµένη προώθηση µιας ακµής (v, w) αφήνει την v ανενεργή Κανόνας 2 επιµονή: Οταν επιλέγεται µια ενεργή κορυφή v, εκτελούνται προωθήσεις από την v µέχρις ότου είτε η v γίνει ανενεργή είτε δεν υπάρχουν προσκείµενες κατάλληλες ακµές, οπότε πρέπει να αυξηθεί το d(v) 17 / 38

Μέγιστη Ροή Αλγόριθµος Προροής-Προώθησης Μη κορεσµένες προωθήσεις µπορεί να δηµιουργήσουν πρόβληµα Κανόνας 1 µέγιστη προώθηση: προώθηση δ= min{excess(v), r(e)} Κάθε µη-κορεσµένη προώθηση µιας ακµής (v, w) αφήνει την v ανενεργή Κανόνας 2 επιµονή: Οταν επιλέγεται µια ενεργή κορυφή v, εκτελούνται προωθήσεις από την v µέχρις ότου είτε η v γίνει ανενεργή είτε δεν υπάρχουν προσκείµενες κατάλληλες ακµές, οπότε πρέπει να αυξηθεί το d(v) Πώς επιλέγονται οι ενεργές κορυφές ; 17 / 38

Μέγιστη Ροή Αλγόριθµος Προροής-Προώθησης Επιλογή ενεργών κορυφών 18 / 38

Μέγιστη Ροή Αλγόριθµος Προροής-Προώθησης Επιλογή ενεργών κορυφών Αυθαίρετη αριθµός µη-κορεσµένων προωθήσεων O(n 2 m) 18 / 38

Μέγιστη Ροή Αλγόριθµος Προροής-Προώθησης Επιλογή ενεργών κορυφών Αυθαίρετη αριθµός µη-κορεσµένων προωθήσεων O(n 2 m) FIFO αριθµός µη-κορεσµένων προωθήσεων O(n 3 ) 18 / 38

Μέγιστη Ροή Αλγόριθµος Προροής-Προώθησης Επιλογή ενεργών κορυφών Αυθαίρετη αριθµός µη-κορεσµένων προωθήσεων O(n 2 m) FIFO αριθµός µη-κορεσµένων προωθήσεων O(n 3 ) Υψηλότερου επιπέδου αριθµός µη-κορεσµένων προωθήσεων O(n 2 m) 18 / 38

Μέγιστη Ροή Υλοποίηση Αλγορίθµου Προροής-Προώθησης 19 / 38

Μέγιστη Ροή Υλοποίηση Αλγορίθµου Προροής-Προώθησης δύο παράµετροι αρχετύπων: ο αριθµητικός τύπος NT και η υλοποίηση του συνόλου των ενεργών κορυφών U 19 / 38

Μέγιστη Ροή Υλοποίηση Αλγορίθµου Προροής-Προώθησης δύο παράµετροι αρχετύπων: ο αριθµητικός τύπος NT και η υλοποίηση του συνόλου των ενεργών κορυφών U // max_flow_basic template<class NT, class SET> NT MAX_FLOW_BASIC_T(const graph& G, node s, node t, const edge_array<nt>& cap, edge_array<nt>& flow, SET& U, int& num_pushes, int& num_edge_inspections, int& num_relabels) { if (s == t) error_handler(1,"maxflow: source == sink"); // MF_BASIC: initialization // MF_BASIC: main loop #ifndef LEDA_CHECKING_OFF assert(check_max_flow_t(g,s,t,cap,flow)); #endif return excess[t]; } 19 / 38

Μέγιστη Ροή Υλοποίηση Αλγορίθµου Προροής-Προώθησης Αρχικοποίηση & και οµές εδοµένων // MF_BASIC: initialization // initialize flow and excess, and saturate edges out of s flow.init(g,0); if (G.outdeg(s) == 0) return 0; int n = G.number_of_nodes(); int max_level = 2*n - 1; int m = G.number_of_edges(); node_array<nt> excess(g,0); // saturate all edges leaving s edge e; forall_out_edges(e,s) { NT c = cap[e]; if (c == 0) continue; node v = target(e); flow[e] = c; excess[s] -= c; excess[v] += c; } 20 / 38

Μέγιστη Ροή Υλοποίηση Αλγορίθµου Προροής-Προώθησης Αρχικοποίηση & και οµές εδοµένων // MF_BASIC: initialize dist and U node_array<int> dist(g,0); dist[s] = n; node v; forall_nodes(v,g) if ( excess[v] > 0 ) U.insert(v,dist[v]); // MF_BASIC: initialize counters num_relabels = num_pushes = num_edge_inspections = 0; 21 / 38

Μέγιστη Ροή Υλοποίηση Αλγορίθµου Προροής-Προώθησης Υλοποίηση του Συνόλου U των Ενεργών Κορυφών Λειτουργίες node U.del(): U.insert(node v, int d): U.insert0(node v, int d): bool U.empty(): U.clear(): Συναρτήσεις κατασκευής και κατάργησης διαγραφή κορυφής από το U και επιστροφή της (επιστρέφει nil αν το U είναι κενό) εισάγει την v µε επίπεδο d. Αυτή η εκδοχή χρησιµοποιείται στην ϕάση της αρχικοποίησης και όταν µια κορυφή επανεισάγεται στο U µετά από αύξηση του επιπέδου της εισάγει την v µε επίπεδο d. Αυτή η εκδοχή χρησιµοποιείται όταν µια κορυφή γίνεται ενεργή από µια ώθηση προς αυτή την κορυφή επιστρέφει true όταν το U είναι κενό διαγράφει όλα τα στοιχεία του U 22 / 38

Μέγιστη Ροή Υλοποίηση Αλγορίθµου Προροής-Προώθησης Υλοποίηση FIFO διατηρεί το U σαν ουρά // FIFO implementation of SET #include <LEDA/list.h> class fifo_set{ list<node> L; public: fifo_set(){} node del() { if (!L.empty()) return L.pop(); else return nil; } void insert(node v, int d) { L.append(v); } void insert0(node v, int d) { L.append(v); } bool empty() { return L.empty(); } void clear() { L.clear(); } fifo_set(){} }; 23 / 38

Μέγιστη Ροή Υλοποίηση Αλγορίθµου Προροής-Προώθησης Υλοποίηση τροποποιηµένης FIFO (MFIFO) διατηρεί το U σαν λίστα Πάντοτε επιλέγει την πρώτη κορυφή της λίστας. Κορυφές που επανεισάγονται µετά από αύξηση επιπέδου τοποθετούνται στην αρχή της λίστας, ενώ οι κορυφές που γίνονται ενεργές λόγω µιας ώθησης τοποθετούνται στο τέλος της λίστας // MFIFO implementation of SET #include <LEDA/list.h> class mfifo_set{ list<node> L; public: mfifo_set(){} node del() { if (!L.empty() ) return L.pop(); else return nil; } void insert(node v, int d) { L.push(v); } void insert0(node v, int d){ L.append(v); } bool empty() { return L.empty(); } void clear() { L.clear(); } mfifo_set(){} }; 24 / 38

Μέγιστη Ροή Υλοποίηση Αλγορίθµου Προροής-Προώθησης Υλοποίηση Υψηλότερου Επιπέδου 25 / 38

Μέγιστη Ροή Υλοποίηση Αλγορίθµου Προροής-Προώθησης Υλοποίηση Υψηλότερου Επιπέδου ιατηρεί ένα διάνυσµα A γραµµικών λιστών µε αριθµοδείκτες στο διάστηµα [0..max_level], όπου max_level είναι µια παράµετρος της συνάρτησης κατασκευής 25 / 38

Μέγιστη Ροή Υλοποίηση Αλγορίθµου Προροής-Προώθησης Υλοποίηση Υψηλότερου Επιπέδου ιατηρεί ένα διάνυσµα A γραµµικών λιστών µε αριθµοδείκτες στο διάστηµα [0..max_level], όπου max_level είναι µια παράµετρος της συνάρτησης κατασκευής Η λίστα A[d] περιέχει όλες τις κορυφές v που εισήχθηκαν από insert(v,d) ή από insert0(v,d) 25 / 38

Μέγιστη Ροή Υλοποίηση Αλγορίθµου Προροής-Προώθησης Υλοποίηση Υψηλότερου Επιπέδου ιατηρεί ένα διάνυσµα A γραµµικών λιστών µε αριθµοδείκτες στο διάστηµα [0..max_level], όπου max_level είναι µια παράµετρος της συνάρτησης κατασκευής Η λίστα A[d] περιέχει όλες τις κορυφές v που εισήχθηκαν από insert(v,d) ή από insert0(v,d) ιατηρείται µια µεταβλητή max, έτσι ώστε η A[d] να είναι κενή αν d > max 25 / 38

Μέγιστη Ροή Υλοποίηση Αλγορίθµου Προροής-Προώθησης Υλοποίηση Υψηλότερου Επιπέδου ιατηρεί ένα διάνυσµα A γραµµικών λιστών µε αριθµοδείκτες στο διάστηµα [0..max_level], όπου max_level είναι µια παράµετρος της συνάρτησης κατασκευής Η λίστα A[d] περιέχει όλες τις κορυφές v που εισήχθηκαν από insert(v,d) ή από insert0(v,d) ιατηρείται µια µεταβλητή max, έτσι ώστε η A[d] να είναι κενή αν d > max Στην insert0 λαµβάνεται υπόψη το γεγονός ότι η εισαγωγή κορυφών αφορά επίπεδα µικρότερα του max_level 25 / 38

Μέγιστη Ροή Υλοποίηση Αλγορίθµου Προροής-Προώθησης // Highest level implementation of SET #include <LEDA/list.h> #include <LEDA/array.h> class hl_set{ int max, max_lev; array<list<node> > A; public: hl_set(int max_level):a(max_level+1) { max = -1; max_lev = max_level;} node del() { while (max >= 0 && A[max].empty()) max--; if (max >= 0) return A[max].pop(); else return nil; } void insert(node v, int d) { A[d].push(v); if (d > max) max = d; } 26 / 38

Μέγιστη Ροή Υλοποίηση Αλγορίθµου Προροής-Προώθησης void insert0(node v, int d) { A[d].append(v); } bool empty() { while (max >= 0 && A[max].empty()) max--; return ( max < 0 ); } hl_set(){} void clear() { for (int i = 0; i <= max_lev; i++) A[i].clear(); max = -1; } }; 27 / 38

Μέγιστη Ροή Υλοποίηση Αλγορίθµου Προροής-Προώθησης Κύριος Βρόχος 28 / 38

Μέγιστη Ροή Υλοποίηση Αλγορίθµου Προροής-Προώθησης Κύριος Βρόχος Επιλέγεται µια κορυφή v από το U Αν v, τότε η εκτέλεση του ϐρόχου σταµατάει Αν η v είναι ταυτόσηµη της t, τότε η εκτέλεση του ϐρόχου προχωρά στην επόµενη επανάληψη 28 / 38

Μέγιστη Ροή Υλοποίηση Αλγορίθµου Προροής-Προώθησης Κύριος Βρόχος Επιλέγεται µια κορυφή v από το U Αν v, τότε η εκτέλεση του ϐρόχου σταµατάει Αν η v είναι ταυτόσηµη της t, τότε η εκτέλεση του ϐρόχου προχωρά στην επόµενη επανάληψη Προσπάθεια προώθησης του πλεονάσµατος της v στις γειτονικές κορυφές της στο G f Εξέταση των ακµών του G f που αντιστοιχούν σε εξερχόµενες ακµές της v στο G Εξέταση των ακµών του G f που αντιστοιχούν σε εισερχόµενες ακµές της v στο G 28 / 38

Μέγιστη Ροή Υλοποίηση Αλγορίθµου Προροής-Προώθησης Κύριος Βρόχος Επιλέγεται µια κορυφή v από το U Αν v, τότε η εκτέλεση του ϐρόχου σταµατάει Αν η v είναι ταυτόσηµη της t, τότε η εκτέλεση του ϐρόχου προχωρά στην επόµενη επανάληψη Προσπάθεια προώθησης του πλεονάσµατος της v στις γειτονικές κορυφές της στο G f Εξέταση των ακµών του G f που αντιστοιχούν σε εξερχόµενες ακµές της v στο G Εξέταση των ακµών του G f που αντιστοιχούν σε εισερχόµενες ακµές της v στο G Αν η v παραµένει ενεργή µετά τον κορεσµό όλων των γειτονικών ακµών της, τότε της αυξάνουµε το επίπεδο και την εισάγουµε ξανά στο U 28 / 38

Μέγιστη Ροή Υλοποίηση Αλγορίθµου Προροής-Προώθησης // MF_BASIC: main loop for(;;) { node v = U.del(); if (v == nil) break; if (v == t) continue; NT ev = excess[v]; // excess of v int dv = dist[v]; // level of v edge e; // MF_BASIC: push across edges out of v if ( ev > 0 ) { // MF_BASIC: push across edges into v } excess[v] = ev; if (ev > 0) { dist[v]++; num_relabels++; U.insert(v,dist[v]); } } 29 / 38

Μέγιστη Ροή Υλοποίηση Αλγορίθµου Προροής-Προώθησης Προώθηση πλεονάσµατος µέσω εξερχόµενων ακµών 30 / 38

Μέγιστη Ροή Υλοποίηση Αλγορίθµου Προροής-Προώθησης Προώθηση πλεονάσµατος µέσω εξερχόµενων ακµών Προώθηση πλεονάσµατος µέσω κατάλληλων ακµών. Μια ακµή e G(f) είναι είτε και ακµή του G, οπότε flow[e] < cap[e] είτε είναι η αντίθετη µιας ακµής του G, οπότε flow[e ] > 0 Εξέταση όλων των εξερχόµενων και εισερχόµενων ακµών της v 30 / 38

Μέγιστη Ροή Υλοποίηση Αλγορίθµου Προροής-Προώθησης Προώθηση πλεονάσµατος µέσω εξερχόµενων ακµών Προώθηση πλεονάσµατος µέσω κατάλληλων ακµών. Μια ακµή e G(f) είναι είτε και ακµή του G, οπότε flow[e] < cap[e] είτε είναι η αντίθετη µιας ακµής του G, οπότε flow[e ] > 0 Εξέταση όλων των εξερχόµενων και εισερχόµενων ακµών της v Για κάθε εξερχόµενη ακµή e µιας κορυφής v, προωθούµε min{excess[v], cap[e] flow[e]} Αν το πλεόνασµα της v γίνει µηδέν, τότε ο ϐρόχος for τερµατίζει 30 / 38

Μέγιστη Ροή Υλοποίηση Αλγορίθµου Προροής-Προώθησης // MF_BASIC: push across edges out of v for (e = G.first_adj_edge(v); e; e = G.adj_succ(e)) { num_edge_inspections++; NT& fe = flow[e]; NT rc = cap[e] - fe; if (rc == 0) continue; node w = target(e); int dw = dist[w]; if ( dw < dv ) // equivalent to ( dw == dv - 1 ) { num_pushes++; NT& ew = excess[w]; if (ew == 0) U.insert0(w,dw); if (ev <= rc) { ew += ev; fe += ev; ev = 0; // stop: excess[v] exhausted break; } else { ew += rc; fe += rc; ev -= rc; } } } 31 / 38

Μέγιστη Ροή Υλοποίηση Αλγορίθµου Προροής-Προώθησης // MF_BASIC: push across edges into v for (e = G.first_in_edge(v); e; e = G.in_succ(e)) { num_edge_inspections++; NT& fe = flow[e]; if (fe == 0) continue; node w = source(e); int dw = dist[w]; if ( dw < dv ) // equivalent to ( dw == dv - 1 ) { num_pushes++; NT& ew = excess[w]; if (ew == 0) U.insert0(w,dw); if (ev <= fe) { fe -= ev; ew += ev; ev = 0; // stop: excess[v] exhausted break; } else { ew += fe; ev -= fe; fe = 0; } } } 32 / 38

Αριθµητικοί Τύποι και Ορθότητα Αλγορίθµων 33 / 38

Αριθµητικοί Τύποι και Ορθότητα Αλγορίθµων Οι αποδείξεις ορθότητας των αλγορίθµων ϐασίζονται στους κανόνες της αριθµητικής 33 / 38

Αριθµητικοί Τύποι και Ορθότητα Αλγορίθµων Οι αποδείξεις ορθότητας των αλγορίθµων ϐασίζονται στους κανόνες της αριθµητικής Η ορθότητα των υλοποιηµένων αλγορίθµων εξακολουθεί να ισχύει αν η υλοποίηση των αριθµητικών τύπων σέβεται τους κανόνες της αριθµητικής 33 / 38

Αριθµητικοί Τύποι και Ορθότητα Αλγορίθµων Οι αποδείξεις ορθότητας των αλγορίθµων ϐασίζονται στους κανόνες της αριθµητικής Η ορθότητα των υλοποιηµένων αλγορίθµων εξακολουθεί να ισχύει αν η υλοποίηση των αριθµητικών τύπων σέβεται τους κανόνες της αριθµητικής Οµως,... αριθµητική µε τύπους int µπορεί να προκαλέσει υπερχείλιση, ή περίεργα αποτελέσµατα λόγω αναδίπλωσης αριθµητική µε τύπους double µπορεί να προκαλέσει σφάλµατα στρογγυλοποίησης 33 / 38

Αριθµητικοί Τύποι και Ορθότητα Αλγορίθµων Πώς εξασφαλίζουµε ορθότητα ; 34 / 38

Αριθµητικοί Τύποι και Ορθότητα Αλγορίθµων Πώς εξασφαλίζουµε ορθότητα ; 1 Αναλύουµε τις αριθµητικές απαιτήσεις του αλγορίθµου Στόχος: εύρεση µιας τιµής f, για την οποία ισχύει το εξής: Αν η µέγιστη απόλυτη ακέραια τιµή εισόδου ϕράσσεται από την C, τότε όλοι οι αριθµοί που χρησιµοποιούνται από τον αλγόριθµο είναι ακέραιοι και ϕράσσονται από την ποσότητα f C = f-ϕραγµένος αλγόριθµος Π.χ. για αλγόριθµους συντοµότερων διαδροµών f = n, ενώ για αλγόριθµους ϱοών f = out-degree(s) 34 / 38

Αριθµητικοί Τύποι και Ορθότητα Αλγορίθµων Πώς εξασφαλίζουµε ορθότητα ; 35 / 38

Αριθµητικοί Τύποι και Ορθότητα Αλγορίθµων Πώς εξασφαλίζουµε ορθότητα ; 2 Τύπος int: ελέγχουµε αν όλες οι τιµές w της εισόδου ικανοποιούν f w MAXINT 35 / 38

Αριθµητικοί Τύποι και Ορθότητα Αλγορίθµων Πώς εξασφαλίζουµε ορθότητα ; 2 Τύπος int: ελέγχουµε αν όλες οι τιµές w της εισόδου ικανοποιούν f w MAXINT 2 Τύπος double: µετασχηµατίζουµε κατάλληλα τις αριθµητικές τιµές εισόδου w sign(w) w S /S όπου S = 2 s είναι η παράµετρος κλιµάκωσης (κατάλληλη δύναµη του 2) 35 / 38

Αριθµητικοί Τύποι και Ορθότητα Αλγορίθµων Πώς εξασφαλίζουµε ορθότητα ; 2 Τύπος int: ελέγχουµε αν όλες οι τιµές w της εισόδου ικανοποιούν f w MAXINT 2 Τύπος double: µετασχηµατίζουµε κατάλληλα τις αριθµητικές τιµές εισόδου w sign(w) w S /S όπου S = 2 s είναι η παράµετρος κλιµάκωσης (κατάλληλη δύναµη του 2) Η αριθµητική κινητής υποδιαστολής δεν ϑα δηµιουργεί σφάλµατα στρογγυλοποίησης όταν τα ενδιάµεσα αποτελέσµατα είναι της µορφής z 2 s, όπου z είναι ακέραιος 35 / 38

Αριθµητικοί Τύποι και Ορθότητα Αλγορίθµων Πως επιλέγεται η τιµή του s ; 36 / 38

Αριθµητικοί Τύποι και Ορθότητα Αλγορίθµων Πως επιλέγεται η τιµή του s ; Εστω C η µεγαλύτερη απόλυτη τιµή εισόδου 36 / 38

Αριθµητικοί Τύποι και Ορθότητα Αλγορίθµων Πως επιλέγεται η τιµή του s ; Εστω C η µεγαλύτερη απόλυτη τιµή εισόδου Το ϐήµα 1 πρέπει να ισχύει και για τις µετασχηµατισµένες ακέραιες τιµές sign(w) w S Αρα, για έναν f-ϕραγµένο αλγόριθµο f C S < 2 53 αφού η αριθµητική κινητής υποδιαστολής για τύπο double µπορεί να αναπαραστήσει όλους τους ακεραίους στο διάστηµα [ (2 53 1)..2 53 1] 36 / 38

Αριθµητικοί Τύποι και Ορθότητα Αλγορίθµων Πως επιλέγεται η τιµή του s ; Εστω C η µεγαλύτερη απόλυτη τιµή εισόδου Το ϐήµα 1 πρέπει να ισχύει και για τις µετασχηµατισµένες ακέραιες τιµές sign(w) w S Αρα, για έναν f-ϕραγµένο αλγόριθµο f C S < 2 53 αφού η αριθµητική κινητής υποδιαστολής για τύπο double µπορεί να αναπαραστήσει όλους τους ακεραίους στο διάστηµα [ (2 53 1)..2 53 1] Η παραπάνω ανισότητα ικανοποιείται αν f C S < 2 53 s < 53 log(f C) 36 / 38

Αριθµητικοί Τύποι και Ορθότητα Αλγορίθµων Ποια είναι η σχέση µεταξύ του αποτελέσµατος µε µετασχηµατισµένες τιµές και εκείνου µε τις αυθεντικές τιµές εισόδου ; 37 / 38

Αριθµητικοί Τύποι και Ορθότητα Αλγορίθµων Ποια είναι η σχέση µεταξύ του αποτελέσµατος µε µετασχηµατισµένες τιµές και εκείνου µε τις αυθεντικές τιµές εισόδου ; γενικός κανόνας συνήθως το αποτέλεσµα µε µετασχηµατισµένες τιµές είναι µια καλή προσέγγιση του πραγµατικού αποτελέσµατος 37 / 38

Αριθµητικοί Τύποι και Ορθότητα Αλγορίθµων Ποια είναι η σχέση µεταξύ του αποτελέσµατος µε µετασχηµατισµένες τιµές και εκείνου µε τις αυθεντικές τιµές εισόδου ; γενικός κανόνας συνήθως το αποτέλεσµα µε µετασχηµατισµένες τιµές είναι µια καλή προσέγγιση του πραγµατικού αποτελέσµατος Εστω ότι το αποτέλεσµα είναι το άθροισµα L τιµών Η διαφορά της πραγµατικής τιµή w από την µετασχηµατισµένη w είναι w w = w w S /S = (w S w S )/S 1/S Εποµένως, το άθροισµα L µετασχηµατισµένων τιµών διαφέρει από το άθροισµα L πραγµατικών τιµών το πολύ κατά L/S 37 / 38

Αριθµητικοί Τύποι και Ορθότητα Αλγορίθµων Ποια είναι η σχέση µεταξύ του αποτελέσµατος µε µετασχηµατισµένες τιµές και εκείνου µε τις αυθεντικές τιµές εισόδου ; γενικός κανόνας συνήθως το αποτέλεσµα µε µετασχηµατισµένες τιµές είναι µια καλή προσέγγιση του πραγµατικού αποτελέσµατος Εστω ότι το αποτέλεσµα είναι το άθροισµα L τιµών Η διαφορά της πραγµατικής τιµή w από την µετασχηµατισµένη w είναι w w = w w S /S = (w S w S )/S 1/S Εποµένως, το άθροισµα L µετασχηµατισµένων τιµών διαφέρει από το άθροισµα L πραγµατικών τιµών το πολύ κατά L/S Αν επιλεγει το S ως η µέγιστη δύναµη του 2 για την οποία S < 2 53 /(f C), τότε S 2 52 /(f C) και άρα που είναι το µέγιστο απόλυτο λάθος L S L f C 2 52 37 / 38

Ερωτήσεις ; 38 / 38