RandomSurfer.java |
1 import java.util.Scanner; 2 /** 3 * 183.592 Programmierpraxis TU Wien WS2014/15 H.Moritsch 4 * Random-Surfer Modell zur Berechnung des PageRank einer Webseite 5 * s. R. Sedgewick, K. Wayne. Introduction to Programming in 6 * Java: An Interdisciplinary Approach. Addison-Wesley, 2008. 7 * Aufruf: java RandomSurfer < randomsurfer.dat 8 */ 9 public class RandomSurfer { 10 public static void main(String[] args) { 11 12 Scanner scanner = new Scanner(System.in); 13 14 /* 1. Einlesen der Webstruktur (Seiten und Links) */ 15 16 // Anzahl der Seiten 17 Page[] pages = new Page[scanner.nextInt()]; 18 19 // für jede Seite (i): 20 for (int i=0; i<pages.length; i++) { 21 22 // Erzeugen des Page-Objekts mit URL und Anzahl der Links auf der Seite 23 pages[i] = new Page(scanner.next(), scanner.nextInt()); 24 25 } 26 27 // für jede Seite (i): 28 for (int i=0; i<pages.length; i++) { 29 System.out.print((i+1) + ". " + pages[i].getURL() + " -> "); 30 31 // für jeden Link auf dieser Seite (j): 32 for (int j=0; j<pages[i].getDegree(); j++) { 33 34 // Nummer der Seite, auf die der Link verweist (k) 35 int k = scanner.nextInt(); 36 37 // Eintragen des Links: auf der i.ten Seite verweist 38 // der j.te Link auf das Page-Objekt "pages[k-1]" 39 pages[i].setLink( j, pages[k-1] ); 40 41 System.out.print(pages[k-1].getURL() + " "); 42 43 } 44 System.out.println(); 45 } 46 47 /* 2. Random-Surfer surft */ 48 49 Page currentPage = pages[0]; // startet mit der ersten Seite 50 51 System.out.println("start page: "+currentPage.getURL()); 52 53 int totalVisits = scanner.nextInt(); // Anzahl der durchzuführenden Seitenaufrufe 54 55 int visitCount = 1; // zählt Anzahl der Seitenaufrufe insgesamt 56 while ( visitCount++ < totalVisits ) { 57 58 /* Random-Surfer sitzt vor dem Browser und hat eine Seite vor sich. 59 Welche Seite sieht er sich als nächste an? 60 */ 61 62 if (Math.random() < 0.90) { 63 // in 90% aller der Fälle wählt er irgendeinen der *Links* auf 64 // der aktuellen Seite (nach Zufallsprinzip) 65 66 // k ist eine Zufallszahl zwischen 0 und (Anzahl der Links - 1) 67 int k = (int)( Math.random() * currentPage.getDegree()); 68 69 // gehe zur Seite, auf die dieser Link verweist 70 currentPage = currentPage.getLink(k); 71 72 // System.out.println("90%: "+currentPage.getURL()); 73 74 } 75 76 else { 77 // in den restlichen 10% der Fälle wählt er irgendeine der 78 // vorhandenen *Seiten* (nach Zufallsprinzip) 79 80 // k ist eine Zufallszahl zwischen 0 und (Anzahl der Seiten - 1) 81 int k = (int)( Math.random() * pages.length ); 82 83 // gehe zu dieser Seite 84 currentPage = pages[k]; 85 86 // System.out.println("10%: "+currentPage.getURL()); 87 88 } 89 90 currentPage.incrementCount(); // Hitcount der neuen Seite wird erhöht 91 92 } 93 94 /* 3. Ausgabe der Hitcounts */ 95 96 System.out.println("total visits: " + totalVisits); 97 98 // für jede Seite (i): 99 for (int i=0; i<pages.length; i++) 100 System.out.println( pages[i].getURL() + ": " + 101 ( pages[i].getCount() / (totalVisits/100.0) ) + " % of visits" ); 102 103 } 104 105 } 106