Automatisierung der Berechnungen

Simulation mit einem Surfmodell

Wir gehen weiterhin von der folgenden Webseitenwelt aus:

Graph - Webseiten

Wir machen folgende Annahmen zum Surfverhalten von Nutzern:

(A1) Zu Beginn wird jede Webseite von einer bestimmten Anzahl von Nutzern besucht. Wir bezeichnen die Anzahlen mit a, b, c, d, e und f (im Beispiel: 300).

(A2) Gelegenheitsjumper: Ein bestimmter Prozentsatz der Nutzer (im Beispiel: 20%) springt in jedem Takt zu einer beliebigen Webseite. Sie teilen sich dabei gleichmäßig auf alle zur Verfügung stehenden Webseiten auf.

(A3) Surfer: Alle anderen Besucher (im Beispiel: 80%) folgen im gleichen Takt einem Link auf eine weitere Webseite. Wenn auf einer Webseite mehrere Links vorkommen, dann verteilen sich die Besucher gleichmäßig auf die verschiedenen Links.

(A4) Sackgassenjumper: Besucher, die in eine Sackgasse geraten (d.h. Webseiten besuchen, die keine Links auf weitere Seiten enthalten), besuchen im nächsten Schritt irgend eine der gegebenen Webseiten. Sie teilen sich dabei gleichmäßig auf alle zur Verfügung stehenden Webseiten auf.

Aufgabe 1

(a) Erkläre mit den Annahmen die Berechnungsausdrücke in der folgenden Abbildung. Was beschreiben sie?

Graph - Webseiten

(b) Ergänze entsprechende Berechnungsausdrücke an den weiteren Pfeilen.

Berechnungen mit Python

Die Berechnungen zum Surfverhalten einer großen Anzahl von Nutzern sollen jetzt automatisiert durchgeführt werden. Bearbeite hierzu die folgenden Aufgaben.

Aufgabe 2

Wir beginnen mit dem folgenden Python-Programm:

a = 300
b = 300
c = 300
d = 300
e = 300
f = 300

a_neu = (0.8*c)/3 +                         \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
b_neu = (0.8*a)/2 + (0.8*e) +               \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
c_neu = (0.8*a)/2 + (0.8*b)/2 + (0.8*d) +   \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
d_neu = (0.8*c)/3 + (0.8*b)/2 +             \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
e_neu = 0 +                                 \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
f_neu = (0.8*c)/3 +                         \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6
print(a_neu, b_neu, c_neu, d_neu, e_neu, f_neu)

(a) Analysiere zunächst das Programm. Versuche, die Bedeutung von jeder Programmzeile zu erklären. Beachte, dass das Backslashsymbol "\" in Python benutzt wird, um Zeilen zu verbinden. Hier einige zu klärende Fragen:

(b) Lass das Programm von Python ausführen. Vergleiche die ausgegebenen Ergebnisse mit den selbst berechneten.

Aufgabe 3

Jetzt soll ein weiterer Simulationsschritt hinzukommen:

Ein erster Vorschlag für ein erweitertes Programm könnte so aussehen:

a = 300
b = 300
c = 300
d = 300
e = 300
f = 300

a_neu = (0.8*c)/3 +                         \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
b_neu = (0.8*a)/2 + (0.8*e) +               \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
c_neu = (0.8*a)/2 + (0.8*b)/2 + (0.8*d) +   \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
d_neu = (0.8*c)/3 + (0.8*b)/2 +             \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
e_neu = 0 +                                 \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
f_neu = (0.8*c)/3 +                         \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6
print(a_neu, b_neu, c_neu, d_neu, e_neu, f_neu)

a_neu = (0.8*c)/3 +                         \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
b_neu = (0.8*a)/2 + (0.8*e) +               \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
c_neu = (0.8*a)/2 + (0.8*b)/2 + (0.8*d) +   \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
d_neu = (0.8*c)/3 + (0.8*b)/2 +             \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
e_neu = 0 +                                 \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
f_neu = (0.8*c)/3 +                         \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6
print(a_neu, b_neu, c_neu, d_neu, e_neu, f_neu)

(a) Teste dieses Programm. Was fällt auf? Können die ausgegebenen Ergebnisse alle stimmen?

(b) Irgendetwas stimmt in dem Programm nicht. Hast du schon eine Vermutung, warum das Programm nicht die beabsichtigten Ergebnisse liefert?

(c) Ergänze im Programm weitere print-Anweisungen (s.u.). Ist jetzt alles klar?

a = 300
b = 300
c = 300
d = 300
e = 300
f = 300
print(a, b, c, d, e, f)

a_neu = (0.8*c)/3 +                         \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
b_neu = (0.8*a)/2 + (0.8*e) +               \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
c_neu = (0.8*a)/2 + (0.8*b)/2 + (0.8*d) +   \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
d_neu = (0.8*c)/3 + (0.8*b)/2 +             \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
e_neu = 0 +                                 \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
f_neu = (0.8*c)/3 +                         \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6
print(a, b, c, d, e, f)
print(a_neu, b_neu, c_neu, d_neu, e_neu, f_neu)

a_neu = (0.8*c)/3 +                         \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
b_neu = (0.8*a)/2 + (0.8*e) +               \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
c_neu = (0.8*a)/2 + (0.8*b)/2 + (0.8*d) +   \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
d_neu = (0.8*c)/3 + (0.8*b)/2 +             \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
e_neu = 0 +                                 \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
f_neu = (0.8*c)/3 +                         \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6
print(a, b, c, d, e, f)
print(a_neu, b_neu, c_neu, d_neu, e_neu, f_neu)

Aufgabe 4

Zur Behebung der Schwierigkeiten werden weitere Zuweisungen im Programm ergänzt.

a = 300
b = 300
c = 300
d = 300
e = 300
f = 300
print(a, b, c, d, e, f)

a_neu = (0.8*c)/3 +                         \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
b_neu = (0.8*a)/2 + (0.8*e) +               \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
c_neu = (0.8*a)/2 + (0.8*b)/2 + (0.8*d) +   \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
d_neu = (0.8*c)/3 + (0.8*b)/2 +             \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
e_neu = 0 +                                 \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
f_neu = (0.8*c)/3 +                         \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6
print(a, b, c, d, e, f)
print(a_neu, b_neu, c_neu, d_neu, e_neu, f_neu)

a = a_neu
b = b_neu
c = c_neu
d = d_neu
e = e_neu
f = f_neu
print(a, b, c, d, e, f)
print(a_neu, b_neu, c_neu, d_neu, e_neu, f_neu)

a_neu = (0.8*c)/3 +                         \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
b_neu = (0.8*a)/2 + (0.8*e) +               \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
c_neu = (0.8*a)/2 + (0.8*b)/2 + (0.8*d) +   \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
d_neu = (0.8*c)/3 + (0.8*b)/2 +             \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
e_neu = 0 +                                 \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
f_neu = (0.8*c)/3 +                         \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6
print(a, b, c, d, e, f)
print(a_neu, b_neu, c_neu, d_neu, e_neu, f_neu)

a = a_neu
b = b_neu
c = c_neu
d = d_neu
e = e_neu
f = f_neu
print(a, b, c, d, e, f)
print(a_neu, b_neu, c_neu, d_neu, e_neu, f_neu)

(a) Teste auch dieses Programm. Jetzt sollten die ausgegebenen Ergebnisse stimmen.

(b) Kannst du erklären, was die hinzugefügten Zuweisungen (wie z.B. a = a_neu) hier bewirken?

Aufgabe 5

Die Ausgabe der jeweiligen Besucherzahlen soll etwas verbessert werden. Hierzu soll eine Art Schrittzähler eingeführt werden.

zaehler = 0
a = 300
b = 300
c = 300
d = 300
e = 300
f = 300
print(zaehler)
print(a, b, c, d, e, f)
print()

zaehler = zaehler + 1
a_neu = (0.8*c)/3 +                         \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
b_neu = (0.8*a)/2 + (0.8*e) +               \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
c_neu = (0.8*a)/2 + (0.8*b)/2 + (0.8*d) +   \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
d_neu = (0.8*c)/3 + (0.8*b)/2 +             \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
e_neu = 0 +                                 \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
f_neu = (0.8*c)/3 +                         \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6
a = a_neu
b = b_neu
c = c_neu
d = d_neu
e = e_neu
f = f_neu
print(zaehler)
print(a, b, c, d, e, f)
print()

zaehler = zaehler + 1
a_neu = (0.8*c)/3 +                         \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
b_neu = (0.8*a)/2 + (0.8*e) +               \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
c_neu = (0.8*a)/2 + (0.8*b)/2 + (0.8*d) +   \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
d_neu = (0.8*c)/3 + (0.8*b)/2 +             \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
e_neu = 0 +                                 \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6                                      
f_neu = (0.8*c)/3 +                         \
        (0.2*(a+b+c+d+e+f))/6 +             \
        (0.8*f)/6
a = a_neu
b = b_neu
c = c_neu
d = d_neu
e = e_neu
f = f_neu
print(zaehler)
print(a, b, c, d, e, f)
print()

(a) Analysiere zunächst das gezeigte Programm. Stelle Vermutungen auf, was das Programm leistet.

(b) Überprüfe deine Vermutungen, indem du das Programm von Python ausführen lässt.

(c) Kannst du die Wirkung der Zuweisung zaehler = zaehler + 1 erklären?

(d) Wie kann man das Programm weiter ergänzen, um die Ergebnisse von 4 Simulationsschritten zu erhalten?

X

Fehler melden

X

Suche