Da sich die Fragen häufen, wie denn der zweite Programmierwettbewerb von uns genau gewertet wird, folgt hier eine detaillierte Beschreibung. Dies soll auch dabei helfen, zu entscheiden, auf welche Punkte man bei der KI Wert legen sollte.
Formel
Die Formel, um die Punkte später zu berechnen, sieht wie folgt aus
P = ( 2*M*S - (Z + 0.5*Y + K) ) / 10
Was heißt das nun in Deutsch? Zuerst eine Beschreibung der einzelnen Buchstaben:
- P - Punktezahl insgesamt
- M - Mittelwert der Anzahl aller Züge aller Spieler von gewonnenen Spielen
- S - Anzahl der gewonnenen Spiele (Gewinn = Zielflagge erreicht)
- Z - Anzahl der aus den gewählten Karten direkt entstandenen Züge bei gewonnenen Spielen
- Y - Anzahl der vom Spielfeld entstandenen Züge bei gewonnenen Spielen
- K - Anzahl der gewählten Karten bei gewonnenen Spielen
Details
Und nun noch einmal im Detail: Wichtig ist zuerst, dass überhaupt nur die gewonnenen Spiele, also die, in denen der Roboter das Ziel erreicht hat, gewertet werden. Für Spiele, bei denen der Roboter zerstört wurde oder die Karten ausgegangen sind, gibt es keine Punkte - weder positive, noch negative. Nach wie vor gilt aber die 75-Prozent-Hürde, dass also die KI bei mindestens 75% aller Spiele (auf allen Spielbrettern) ins Ziel gekommen sein muss, um überhaupt teilnehmen zu dürfen. Das heißt auch, dass es auf einzelnen ggf. "schweren" Spielbrettern auch mal weniger sein darf.
Für jedes gewonnene Spiel gibt es eine Grundpunktzahl, die sich aus dem Mittel der gebrauchten Züge aller Teilnehmer (in der jeweiligen Spielstufe natürlich nur) bei gewonnenen Spielen ergibt. Das heißt, wenn die Gesamtheit der Spieler recht lange unterwegs ist, ist M recht groß und damit auch der Grundwert. Ist das Teilnehmerfeld flott, sinkt die Grundpunktzahl.
Von dieser Grundpunktzahl werden Punkte subtrahiert. Zuerst natürlich die gebrauchten Züge (Bewegungen und Drehungen) bei den gewonnenen Spielen. Hierbei wird aber zwischen eigenen Zügen, die sich direkt aus der Kartenwahl ergeben und zwischen den Bewegungen (fremde Züge), die die Spielfelder erzwingen, unterschieden. Eigene Züge werden einfach nur subtrahiert, fremde Züge nur zur Hälfte subtrahiert. Das heißt, es wird weniger bestraft, wenn man die Spielfelder geschickt ausnutzt, um vorwärts zu kommen.
Die Züge werden dabei pro Feld erfasst, d.h. "MF 3" führt im Normalfall zu drei Zügen, "MF 2" zu zwei Zügen und alle anderen Karten zu je einem Zug. Läuft man gegen eine Wand und eine gespielte Karte "MF 3" verpufft, ist das auch kein Zug. Rutscht man dagegen über 10 Ölfelder, sind das 10 Fremdzüge.
Zu guter Letzt werden auch noch die gesamten gespielten Karten bei gewonnenen Spielen subtrahiert. Das soll dafür sorgen, dass "gegen die Wand fahren" etwas bestraft wird.
Die Punktezahl wird am Schluss noch durch 10 geteilt, was aber natürlich nichts an der Platzierung ändern sollte, sondern die Punktespanne nur etwas übersichtlicher hält.
Beispiel
Ein kleines Rechenbeispiel: Die KI wird wie angekündigt mit je 100 vorher erstellten Kartenstapeln auf (in diesem Beispiel) 3 Spielbrettern getestet. M sei als 50 berechnet worden. Die Ergebnisse sind:
Spielbrett | Gewonnenene Spiele S (von max. 100) | eigene Züge Z | fremde Züge Y | gespielte Karten K |
---|---|---|---|---|
brett1.dat | 98 | 2465 | 1496 | 1953 |
brett2.dat | 99 | 2782 | 1131 | 2162 |
brett3.dat | 84 | 4455 | 1496 | 3724 |
gesamt | 281 | 9702 | 4123 | 7839 |
Das Ergebnis für diesen Teilnehmer ist also
P = ( 2*50*281 - (9702 + 0.5*4123 + 7839) ) / 10 = 849.75
Neue Spieledateien
Im Zuge dessen gibt es auch neue Spieledateien, die sich aber nicht vom Ablauf geändert haben. Es wird nun nur am Ende eines Spiels eine Statistik ausgegeben, die die obige Tabelle leicht über folgendes Skript check_results erstellt:
#!/bin/bash echo "Datei | Gew. Spiele | Runden | Karten | eig. Zuege | fremde Zuege | Gesamtzuege | Zeit (fuer alle Spiele)" for FILE in $1 ; do echo $FILE "|" \ `egrep "reached" $FILE | wc -l` "|" \ `egrep "reached" $FILE | nawk '{ sum += $(NF-10) } END{ print sum }'` "|" \ `egrep "reached" $FILE | nawk '{ sum += $(NF-8) } END{ print sum }'` "|" \ `egrep "reached" $FILE | nawk '{ sum += $(NF-5) } END{ print sum }'` "|" \ `egrep "reached" $FILE | nawk '{ sum += $(NF-3) } END{ print sum }'` "|" \ `egrep "reached" $FILE | nawk '{ sum += $(NF-1) } END{ print sum }'` "|" \ `egrep "real" $FILE | nawk -Fm '{ print $2 }' | nawk -Fs '{ sum += $1 } END{ print sum }' | sed 's/\./,/1'` done exit 0
Hinweis: Da die obige Formel nur auf den Ergebnissen zweier KIs erstellt wurde, kann es sein, dass der Faktor 2 vor M*S noch angepasst wird.
Wir wünschen nach wie vor allem Teilnehmern viel Erfolg und freuen uns auf alle Einsendungen.
Ihre freiesMagazin-Redaktion
Oh, vielen Dank für die
Oh, vielen Dank für die Formel, darauf war ich schon gespannt :)
Dazu einige Fragen:
1. "Die KI wird wie angekündigt mit je 100 vorher erstellten Kartenstapeln auf 3 Spielbrettern getestet." Das ließt sich so, als ob es am Ende nur drei Spielbretter gäbe. Ist dem so?
2. Werden bei der Berechnung von M nur die "Kartenzüge", nur die "Spielfeldzüge" oder beide mit einbezogen?
Grüße, Keba.
Re: Oh, vielen Dank für die
1. Ich habe es im Text konkretisiert. Nur in diesem Beispiel waren es 3 Spielbretter.
2. Naja, "aller Züge" eben, d.h. sowohl Karten- als auch Spielfeldzüge.
Dominik Wagenführ
freiesMagazin-Redaktion
Statistische Auswertung
Hallo,
vieleicht ist es einfacher die schon vorhandenen Daten in stats.txt zu nutzen:
Die start_contest.sh Datein habe ich mal modifiziert:
Ausgabe:
Wenn nur die erfolgreichen Spiele zählt:
Finished 99
CardsOut 0
Destroyed 0( 1 nicht gezählt )
BoardMoves 885
CardMoves 2421
Rounds 418
Cards 1917
Re: Statistische Auswertung
Vielen Dank für die Modifikation. Da ich für den Wettbewerb noch mehr Skripte nutze (die nicht veröffentlicht wurden), wäre eine Umstellung für mich nicht sinnvoll, aber andere Mitspieler können so sicher gut einen Überblick über Ihre KI erhalten.
Viele Grüße
Dominik Wagenführ
freiesMagazin-Redaktion
Spalten
Kann es sein, dass Script eine Ausgabe zu viel ist? Oder fehlt im Kopf eine Spalte? Im Kopf gibt es 7 Spalten, aber am Ende werden pro Datei 8 Spalten angezeigt.
`egrep "reached" $FILE | nawk '{ sum += $(NF-8) } END{ print sum }'` "|"
gibt die Anzahl der Karten aus und steht als 4. Ausgabebefehl. Im Kopf steht aber "Karten" an 3. Position.Re: Spalten
Uh, tatsächlich fehlt bei der Überschrift die zweite Spalte "Gewonnene Spiele". Ich habe es ergänzt. Vielen Dank für den Hinweis.
Dominik Wagenführ
freiesMagazin-Redaktion