| RandomSurferV2.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 * mit Anzeige der Datenstruktur und des Programmablaufs
6 * s. R. Sedgewick, K. Wayne. Introduction to Programming in
7 * Java: An Interdisciplinary Approach. Addison-Wesley, 2008.
8 * Aufruf: java RandomSurfer < randomsurfer.dat
9 */
10 public class RandomSurferV2 {
11 public static void main(String[] args) {
12
13 Scanner scanner = new Scanner(System.in);
14
15 /* 1. Einlesen der Webstruktur (Seiten und Links) */
16
17 // Anzahl der Seiten
18 Page[] pages = new Page[scanner.nextInt()];
19
20 System.out.println();
21 System.out.println("=============== web structure =======================");
22
23 // für jede Seite (i):
24 for (int i=0; i<pages.length; i++) {
25
26 // Erzeugen des Page-Objekts mit URL und Anzahl der Links auf der Seite
27 pages[i] = new Page(scanner.next(), scanner.nextInt());
28
29 }
30
31 // für jede Seite (i):
32 for (int i=0; i<pages.length; i++) {
33 System.out.print((i+1) + ". " + pages[i].getURL() + " -> ");
34
35 // für jeden Link auf dieser Seite (j):
36 for (int j=0; j<pages[i].getDegree(); j++) {
37
38 // Nummer der Seite, auf die der Link verweist (k)
39 int k = scanner.nextInt();
40
41 // Eintragen des Links: auf der i.ten Seite verweist
42 // der j.te Link auf das Page-Objekt "pages[k-1]"
43 pages[i].setLink( j, pages[k-1] );
44
45 System.out.print(pages[k-1].getURL() + " ");
46
47 }
48 System.out.println();
49 }
50 System.out.println("=====================================================");
51
52 /* 1.a Anzeige der Datenstruktur */
53
54 System.out.println();
55 System.out.println("--------------- data structure ----------------------");
56
57 System.out.println("pages.length = " + pages.length);
58 // für jede Seite (i):
59 for (int i=0; i<pages.length; i++) {
60
61 System.out.println();
62 System.out.println("pages[" + i + "] = <" + pages[i] + ">");
63 System.out.println("pages[" + i + "].url = \"" + pages[i].getURL() + "\"");
64
65 System.out.println("pages[" + i + "].links.length = " + pages[i].getDegree());
66 for (int j=0; j<pages[i].getDegree(); j++) {
67 Page p = pages[i].getLink(j);
68 System.out.println("pages[" + i + "].links["+ j + "] = <" + p + "> (\"" + p.getURL() + "\")");
69 }
70
71 System.out.println("pages[" + i + "].count = " + pages[i].getCount());
72 }
73
74 System.out.println();
75 System.out.println("-----------------------------------------------------");
76 System.out.println();
77
78 /* 2. Random-Surfer surft */
79
80 int totalVisits = scanner.nextInt(); // Anzahl der durchzuführenden Seitenaufrufe
81
82 Page currentPage = pages[0]; // startet mit der ersten Seite
83
84 System.out.println("start page: "+currentPage.getURL());
85
86 int visitCount = 0; // zählt Anzahl der Seitenaufrufe insgesamt
87 while ( visitCount++ < totalVisits ) {
88
89 // scanner.nextLine(); // nur im interaktiven Modus
90
91 System.out.println();
92 System.out.println("visit nr." + visitCount + ": " + currentPage.getURL());
93
94 /* Random-Surfer sitzt vor dem Browser und hat eine Seite vor sich.
95 Welche Seite sieht er sich als nächste an?
96 */
97
98 if (Math.random() < 0.90) {
99 // in 90% aller der Fälle wählt er irgendeinen der *Links* auf
100 // der aktuellen Seite (nach Zufallsprinzip)
101
102 // k ist eine Zufallszahl zwischen 0 und (Anzahl der Links - 1)
103 int k = (int)( Math.random() * currentPage.getDegree());
104
105 System.out.print("click link " + (k+1) + " (of " + currentPage.getDegree() + ") = ");
106
107 // gehe zur Seite, auf die dieser Link verweist
108 currentPage = currentPage.getLink(k);
109
110 }
111
112 else {
113 // in den restlichen 10% der Fälle wählt er irgendeine der
114 // vorhandenen *Seiten* (nach Zufallsprinzip)
115
116 // k ist eine Zufallszahl zwischen 0 und (Anzahl der Seiten)
117 int k = (int)( Math.random() * pages.length );
118
119 System.out.print("type page address: ");
120
121 // gehe zu dieser Seite
122 currentPage = pages[k];
123
124 }
125
126 System.out.println(currentPage.getURL());
127
128 currentPage.incrementCount(); // Hitcount der neuen Seite wird erhöht
129
130 }
131
132 /* 3. Ausgabe der Hitcounts */
133
134 System.out.println();
135 System.out.println("total visits: " + totalVisits);
136
137 // für jede Seite (i):
138 for (int i=0; i<pages.length; i++)
139 System.out.println( "page " + pages[i].getURL() + ": " + pages[i].getCount()
140 + " visits (" + ( pages[i].getCount() / (totalVisits/100.0) ) + " %)");
141
142 }
143
144 }
145