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