| 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