Bewertung des zweiten Programmierwettbewerbs

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:

#!/bin/bash

GAMES=$1
DECKS=`find decks -name "*.dat" | sort`
LEVEL=$2


# Die Statistischen Daten werden einfach aneinandergehaengt
rm allstats.txt 
echo "robots-contest $LEVEL" >>allstats.txt
date
date >>allstats.txt
for GAME in $GAMES
do
    echo "$GAME" >>allstats.txt
    for DECK in $DECKS
    do
        echo "./robots-contest $GAME $DECK $LEVEL" 
        ./robots-contest $GAME $DECK $LEVEL
        echo "$DECK" >>allstats.txt
        #jetzt die Daten "eingerahmt" anhaengen
        echo "vvvvv" >>allstats.txt
        cat stats.txt >>allstats.txt
        echo "^^^^^" >>allstats.txt
    done
done
date >>allstats.txt
date

Ausgabe:

robots-contest normal
Do 29. Okt 20:48:51 GMT-1 2009
gameboards/chop.dat
decks/carddeck000.dat
vvvvv
Cards: 17
Rounds: 4
Card Moves: 25
Board Moves: 6
Destroyed (X): 0
Cards Out (Y): 0
Finished (Z): 1
^^^^^
decks/carddeck001.dat
vvvvv
Cards: 19
Rounds: 4
Card Moves: 26
Board Moves: 10
Destroyed (X): 0
Cards Out (Y): 0
Finished (Z): 1
^^^^^
  ...
# Mein schönstes Spiel! nur 2 Runden
decks/carddeck072.dat
vvvvv
Cards: 10
Rounds: 2
Card Moves: 17
Board Moves: 8
Destroyed (X): 0
Cards Out (Y): 0
Finished (Z): 1
^^^^^
...
decks/carddeck099.dat
vvvvv
Cards: 16
Rounds: 4
Card Moves: 20
Board Moves: 9
Destroyed (X): 0
Cards Out (Y): 0
Finished (Z): 1
^^^^^
Do 29. Okt 20:49:38 GMT-1 2009

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