Μία Μελέτη Περίπτωσης: Διήθηση Ι-1
Μία Μελέτη Περίπτωσης: Διήθηση
Μία Μελέτη Περίπτωσης: Διήθηση Διήθηση. Ρίψη υγρού πάνω σε κάποιο πορώδες υλικό Θα φτάσει το υγρό στον πυθμένα; Εφαρμογές. [ χημεία, γεωλογία, ] Χρωματογραφία. Εξάπλωση των πυρκαγιών σε δάση. Φυσικό αέριο μέσω ημι-πορώδη πετρωμάτων. Ροή ηλεκτρισμού μέσω δικτύου αντιστάσεων. Διαπέραση του φυσικού αερίου σε ορυχείο άνθρακα μέσα από μια μάσκα αερίων φίλτρου. 3
Μία Μελέτη Περίπτωσης: Διήθηση Διήθηση. Ρίψη υγρού πάνω σε κάποιο πορώδες υλικό. Θα φτάσει το υγρό στον πυθμένα; Αφαιρετικό Μοντέλο. NxN πλέγμα από χώρους. Κάθε χώρος είναι είτε μπλοκαρισμένος είτε ανοικτός. Μπλοκαρισμένος χώρος Ανοιχτός χώρος 4
Μία Μελέτη Περίπτωσης: Διήθηση Διήθηση. Ρίψη υγρού πάνω σε κάποιο πορώδες υλικό Θα φτάσει το υγρό στον πυθμένα; Αφαιρετικό Μοντέλο. NxN πλέγμα από χώρους. Κάθε χώρος είναι είτε μπλοκαρισμένος είτε ανοικτός. Ένας ανοικτός χώρος είναι πλήρης εάν συνδέεται με την κορυφή μέσω ανοικτών τόπων. Μπλοκαρισμένος τόπος Πλήρες τόπος Ανοικτός τόπος Θα διηθεί Δε θα διηθεί (πλήρης τόπος συνδεδεμένος στην κορυφή) (μη πλήρεις τόποι στην κάτω γραμμή) 5
Ένα επιστημονικό ερώτημα Τυχαία διήθηση. Δοθέντος ενός NxN συστήματος όπου κάθε τόπος είναι κενός με πιθανότητα p, ποια είναι η πιθανότητα ότι το σύστημα θα διηθήσει; p = 0.3 (Δε θα διηθήσει) p = 0.4 (Δε θα διηθήσει) p = 0.5 (Δε θα διηθήσει) p = 0.6 (Θα διηθήσει) p = 0.7 (Θα διηθήσει) Παρατήρηση. Πασίγνωστο ανοικτό ερώτημα στη στατιστική φυσική. Μη γνωστή μαθηματική λύση Πόρος. Πάρτε μία υπολογιστική προσέγγιση: Monte Carlo προσομοίωση. 6
Αναπαράσταση Δεδομένων Αναπαράσταση δεδομένων. Χρησιμοποιήστε ένα NxN μπούλειο πίνακα για να αποθηκεύσετε ποιοι τόποι είναι ανοικτοί. Χρησιμοποιήστε έναν άλλο για να υπολογίσετε ποιοι τόποι είναι πλήρεις. Κανονικής συστοιχίας Ε/E βιβλιοθήκη. Βιβλιοθήκη για να αναγνωρίζει ανάγνωση και εκτύπωση 1- και 2-διαστάσεων συστοιχιών. Μπλοκαρισμένος τόπος Ανοικτός τόπος 8 8 0 0 1 1 1 0 0 0 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 0 0 0 1 1 0 1 1 1 0 1 1 1 0 1 1 0 0 1 0 0 0 0 1 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 0 0 στενογραφία: 0 για μπλοκαρισμένα, 1 για ανοικτά open[][] 7
Αναπαράσταση Δεδομένων Αναπαράσταση δεδομένων. Χρησιμοποιήστε ένα NxN μπούλειο πίνακα για να αποθηκεύσετε ποιοι τόποι είναι ανοικτοί. Χρησιμοποιήστε έναν άλλο για να υπολογίσετε ποιοι τόποι είναι πλήρη. Κανονικής συστοιχίας Ε/E βιβλιοθήκη. Βιβλιοθήκη για να αναγνωρίζει ανάγνωσξ και εκτύπωση 1- και 2-διαστάσεων συστοιχιών. 8 8 0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 στενογραφία: 0 για μπλοκαρισμένα, 1 για ανοικτά Πλήρες τόπος full[][] 8
Κανονικής Συστοιχίας Ε/E βιβλιοθήκη (Πρόγραμμα 2.2.2) public class StdArrayIO {... // read M-by-N boolean matrix from standard input public static boolean[][] readboolean2d() { int M = StdIn.readInt(); int N = StdIn.readInt(); boolean[][] a = new boolean[m][n]; for (int i = 0; i < M; i++) for (int j = 0; j < N; j++) if (StdIn.readInt()!= 0) a[i][j] = true; return a; // print boolean matrix to standard output public static void print(boolean[][] a) { for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[i].length; j++) { if (a[i][j]) StdOut.print("1 "); else StdOut.print("0 "); StdOut.println(); 9
Σκαλωσιά Προσέγγιση. Γράψτε τον εύκολο κώδικα πρώτα. Συμπληρώστε τις λεπτομέρειες αργότερα. public class Percolation { // return boolean matrix representing full sites public static boolean[][] flow(boolean[][] open) // does the system percolate? public static boolean percolates(boolean[][] open) { int N = open.length; boolean[][] full = flow(open); for (int j = 0; j < N; j++) if (full[n-1][j]) return true; return false; system percolates if any full site in bottom row // test client public static void main(string[] args) { boolean[][] open = StdArrayIO.readBoolean2D(); StdArrayIO.print(flow(open)); StdOut.println(percolates(open)); 10
Κάθετη Διήθηση
Κάθετη Διήθηση Επόμενο Βήμα. Ξεκινά με την επίλυση μίας ευκολότερης έκδοσης του προβλήματος. Κάθετη Διήθηση. Υπάρχει ένα μονοπάτι με ανοικτούς τόπους από την κορυφή προς το κάτω μέρος το οποίο πηγαίνει ευθεία προς τα κάτω; 12
Κάθετη Διήθηση Ερώτηση. Πώς να καθοριστεί εάν ένας τόπος (i, j) είναι πλήρης; Απάντηση. Είναι πλήρης εάν (i, j) είναι ανοικτός και (i-1, j) είναι πλήρης. Αλγόριθμος. Σαρώστε τις γραμμές από την κορυφή προς τα κάτω. γραμμή i-1 γραμμή i 13
Κάθετη Διήθηση Ερώτηση. Πώς να καθοριστεί εάν ένας τόπος (i, j) είναι πλήρης; Απάντηση. Είναι πλήρης εάν (i, j) είναι ανοικτός και (i-1, j) είναι πλήρης. Αλγόριθμος. Σαρώστε τις γραμμές από την κορυφή προς τα κάτω. public static boolean[][] flow(boolean[][] open) { int N = open.length; boolean[][] full = new boolean[n][n]; for (int j = 0; j < N; j++) full[0][j] = open[0][j]; for (int i = 1; i < N; i++) for (int j = 0; j < N; j++) full[i][j] = open[i][j] && full[i-1][j]; αρχικοποιεί Βρίσκει τους πλήρεις τόπους return full; 14
Κάθετη Διήθηση: Έλεγχος Έλεγχος. Χρησιμοποιήστε τη σταθερή είσοδο και έξοδο για να ελέγξετε μικρές εισόδους. % more testt.txt 5 0 1 1 0 1 0 0 1 1 1 1 1 0 1 1 1 0 0 0 1 0 1 1 1 1 % more testf.txt 5 1 0 1 0 0 1 0 1 1 1 1 1 1 0 1 1 0 0 0 1 0 0 0 1 1 % java VerticalPercolation < testt.txt 5 0 1 1 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 true % java VerticalPercolation < testf.txt 5 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 false 15
Κάθετη Διήθηση: Έλεγχος Έλεγχος. Προσθήκη βοηθητικών μεθόδων για να παραχθούν τυχαίες είσοδοι και να απεικονιστούν χρησιμοποιώντας πρότυπα σχεδίασης. public class Percolation {... // return a random N-by-N matrix; each cell true with prob p public static boolean[][] random(int N, double p) { boolean[][] a = new boolean[n][n]; for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) a[i][j] = StdRandom.bernoulli(p); return a; // plot matrix to standard drawing public static void show(boolean[][] a, boolean foreground) 16
Απεικόνιση δεδομένων Απεικόνιση. Χρήση πρότυπων σχεδίασης για να απεικονιστούν μεγαλύτερες εισόδοι. public class Visualize { public static void main(string[] args) { int N = Integer.parseInt(args[0]); double p = Double.parseDouble(args[1]); boolean[][] open = Percolation.random(N, p); boolean[][] full = Percolation.flow(open); StdDraw.setPenColor(StdDraw.BLACK); Percolation.show(open, false); StdDraw.setPenColor(StdDraw.CYAN); Percolation.show(full, true); 17
Κάθετη Διήθηση: Εκτίμιση πιθανότητας Ανάλυση. Δοθέντος των N και p, τρέξτε την προσομοίωση T φορές και αναφέρατε το μέσο όρο. public class Estimate { public static double eval(int N, double p, int T) { int cnt = 0; for (int t = 0; t < T; t++) { boolean[][] open = Percolation.random(N, p); if (VerticalPercolation.percolates(open)) cnt++; return (double) cnt / M; public static void main(string[] args) { int N = Integer.parseInt(args[0]); double p = Double.parseDouble(args[1]); int T = Integer.parseInt(args[2]); StdOut.println(eval(N, p, T)); test client 18
Κάθετη Διήθηση: Εκτίμιση πιθανότητας Ανάλυση. Δοθέντος των N και p, τρέξτε την προσομοίωση T φορές και αναφέρατε το μέσο όρο. % java Estimate 20.7 100000 0.015768 Συμφωνεί με τη θεωρία p N N % java Estimate 20.8 100000 0.206757 % java Estimate 20.9 100000 0.925191 % java Estimate 40.9 100000 0.448536 παίρνει περίπου 1 λεπτό παίρνει περίπου 4 λεπτά Πολύ υπολογισμό! Χρόνος εκτέλεσης. Ανάλογος του T N 2. Κατανάλωση μνήμης. Ανάλογος του N 2. 19
Γενική Διήθηση
Γενική Διήθηση: Αναδρομική Λύση Διήθηση. Δοθέντος ενός NxN συστήματος, υπάρχει ένα οποιοδήποτε μονοπάτι από ανοικτούς τόπους από την κορυφή στη βάση. Δεν είναι μόνο ευθεία προς τα κάτω Αναζήτηση Πρώτα σε Βάθος (Depth first search). Για να επισκεφθεί όλους τους προσβάσιμους τόπους από i-j: Εάν i-j έχουν ήδη σημειωθεί ως προσβάσιμοι, επιστροφή. Εάν i-j δεν είναι ανοικτοί, επιστροφή. Σημειώνονται οι i-j ως προσβάσιμοι. Επίσκεψη στους 4 γείτονες i-j αναδρομικά. Λύση διήθησης. Τρέξτε το DFS από κάθε τόπο στην πάνω γραμμή. Ελέγξτε εάν ένα τόπος στην κάτω γραμμή είναι επισημασμένος ως προσβάσιμος. 21
Αναζήτηση Πρώτα σε Βάθος : Java Υλοποίηση public static boolean[][] flow(boolean[][] open) { int N = open.length; boolean[][] full = new boolean[n][n]; for (int j = 0; j < N; j++) if (open[0][j]) flow(open, full, 0, j); return full; public static void flow(boolean[][] open, boolean[][] full, int i, int j) { int N = full.length; if (i < 0 i >= N j < 0 j >= N) return; if (!open[i][j]) return; if ( full[i][j]) return; full[i][j] = true; flow(open, full, i+1, j); flow(open, full, i, j+1); flow(open, full, i, j-1); flow(open, full, i-1, j); // mark // down // right // left // up 22
Γενική Διήθηση: Εκτίμηση πιθανότητας Ανάλυση. Δοθέντος των N και p, τρέξτε την προσομοίωση T φορές και αναφέρατε το μέσο όρο. % java Estimate 20.5 100000 0.050953 % java Estimate 20.6 100000 0.568869 % java Estimate 20.7 100000 0.980804 % java Estimate 40.6 100000 0.595995 Χρόνος εκτέλεσης. Ακόμα ανάλογος του T N 2. Κατανάλωση μνήμης. Ακόμα ανάλογος του N 2. 23
Διδάγματα Να αναμένετε σφάλματα. Εκτέλεση κώδικα σε μικρές περιπτώσεις ελέγχου. Να κρατάτε τις ενότητες μικρές. Δίνει τη δυνατότητα για έλεγχο και απασφαλμάτωση. Στοιχειώδης ανάπτυξη. Εκτέλεση και έλεγχος της εκτέλεσης του προγράμματος σε κάθε ενότητα όπως γράφεται. Να επιλύετε ένα ευκολότερο πρόβλημα. Παρέχει ένα πρώτο βήμα. Να εξετάζετε μία αναδρομική λύση. Απαραίτητο εργαλείο. Να δημιουργείτε επαναχρησιμοποιήσιμες βιβλιοθήκες. StdArrayIO, StdRandom, StdIn, StdDraw 24