Update für AbstractPlayer und SimpleGossip

Moderator: Praktikum: Kommunikation in Peer-to-peer-Netzen

pkabus
Mausschubser
Mausschubser
Beiträge: 48
Registriert: 7. Aug 2006 15:31

Update für AbstractPlayer und SimpleGossip

Beitrag von pkabus » 6. Mär 2008 16:12

Hallo,

da eine Gruppe mich gestern auf einen kleinen Bug in der Bewertungsfunktion hingewiesen hat, habe ich mir den Code noch einmal vorgeknöpft und da ein paar Ungereimtheiten beseitigt.

Achtung: Folgendes gilt nur, sofern zwei Bedingungen erfüllt sind:
1. Euer Protokoll erfüllt die Vorgabe, dass eine Nachricht mindestens einen Zyklus braucht, um von einem Knoten zum anderen zu gelangen (SimpleGossip ist diesbezüglich fehlerhaft, siehe unten)
2. Das Control "UpdatePlayer" wird am Anfang des Zyklus aufgerufen

Wenn die Protokollqualität am Anfang des Zyklus X berechnet wird, liegen nur Updates aus Zyklus X-1 vor. Das Alter eines jeden Updates muss um eins reduziert werden, um das auszugleichen. Dazu kann man in AbstractPlayer direkt nach

Code: Alles auswählen

if (knownPosition != null)
{
	age = CommonState.getTime() - knownPosition.getCreationTime();
}
else
{
	age = CommonState.getTime();
}
ein

Code: Alles auswählen

age--;
einfügen.

Allerdings reicht das nicht. Da es jetzt keinen Sinn mehr macht in Zyklus 0 und in Zyklus 1 die Qualität auszuwerten, sollte man den Anfang von estimateQuality() entsprechend ändern:

Code: Alles auswählen

if (CommonState.getTime() < 2)
{
	return;
}
Zu guter Letzt muss bei der Gesamtqualität ein Zyklus weniger berechnet werden, die Zeile, die die PQ ausgibt muss nun wie folgt aussehen:

Code: Alles auswählen

System.out.println("PQ:"+CommonState.getTime()+":"+this.node.getID()+":"+protocolQuality+":"+(this.totalProtocolQuality/(CommonState.getTime()-1)));
Das ganze ist nicht so dramatisch, wie es aussieht. Eure Verbesserungen am Protokoll müssen nicht geändert werden, lediglich die Ergebnisse dürften jetzt sogar noch etwas besser ausfallen.


Bei SimpleGossip gab es zwei Fehler, die dafür gesorgt haben, dass Nachrichten manchmal zu früh ausgeliefert wurden. Wer nicht blind das Protokoll abgeschrieben hat, sollte damit kein Problem haben :D Alle anderen müssen ihren Code noch mal gründlich prüfen :roll:

Nach

Code: Alles auswählen

this.oldDeliverEvents = this.newDeliverEvents;
muss unbedingt die newDeliverEvents neu initialisiert werden:

Code: Alles auswählen

this.newDeliverEvents = new HashSet<Event>();
Ausserdem muss

Code: Alles auswählen

this.events.add(event);
this.eventIDs.add(event);
aus receive(Event event) entfern werden und in nextCycle in die

Code: Alles auswählen

for (Event event : this.oldDeliverEvents)
{
    ...
}
Schleife integriert werden. Ob das nun wirklich alles so funktioniert, könnt ihr ja gerne mal selbst überprüfen :lol:

Zurück zu „Praktikum: Kommunikation in Peer-to-Peer-Netzen“