Zum Inhalt springen
# Smaug (2026)
Ein Auktions-Bot in Python, der live gegen die Agenten meiner ganzen Klasse an der University of Agder antrat
Smaug ist der Auktionsagent, den ich während meines Austauschsemesters an der University of Agder für den Kurs Artificial Intelligence Architecture (IKT110) entwickelt habe. Die Aufgabe: in Python einen Bot für ein Auktionsspiel des Dozenten schreiben und ihn dann live gegen die Agenten der ganzen Klasse antreten lassen, in zwei Partien zu je 1000 Runden. Die Note hängt von der Schlussrangliste ab.
Im Spiel versteigert ein Drache jede Sekunde rund dreissig Truhen voller Punkte. Das höchste Gebot gewinnt und wird voll bezahlt, die anderen erhalten die Hälfte ihres Gebots zurück; jeder Spieler bekommt einen Lohn in Gold, kann bei einer Bank sparen, die Zinsen zahlt, und am Ende zählen nur die Punkte. Mein Agent spielt wie ein vorsichtiger Anleger: Er lässt sein Erspartes bis zur Zinsgrenze auf der Bank, ignoriert Auktionen, die zu wenig wert sind, bietet auf die besten den aktuellen Marktpreis pro Punkt plus eine Marge, verkauft der Bank ein paar Punkte zurück, wenn sie zu viel dafür zahlt, und gibt sein Erspartes in den letzten hundert Runden aus, vor dem grossen Ansturm am Schluss.
Jede Einstellung wurde gemessen statt geraten. Ich habe auf der Spiel-Engine des Dozenten einen Simulator gebaut, der eine ganze Partie in etwa zehn Sekunden mit genau dem Code meines Agenten spielt, und dann ein Turnier mit rund 2300 Partien durchgeführt, bei dem ich jeweils nur eine Einstellung änderte. Der Wettkampf zeigte mir aber auch die Grenze dieses Ansatzes: Eine Simulation ist nur so gut wie ihre Gegner, und meine Mitstudierenden boten viel aggressiver als die Beispielagenten, gegen die ich trainiert hatte.
Da ein abgestürzter Agent Runden verpasst und der Dozent angekündigt hatte, dass der Server absichtlich fehlerhafte Daten schicken würde, vertraut der Agent nie dem, was er empfängt: Jedes Feld wird geprüft, eine ungültige Runde wird übersprungen, und jedes Gebot läuft durch einen «Airbag», der es gültig macht. Ich habe ihn mit 10 000 fehlerhaften Nachrichten, Netzwerkunterbrüchen und einem gewaltsam beendeten Prozess getestet. Daneben zeigt ein mit Textual gebauter Terminal-Monitor seine Signale live an (Gewinnquote, verlorenes Gold, Marktpreis) und erlaubt mir, während einer Partie die Marge anzupassen oder Funktionen abzuschalten, über eine kleine Anweisungsdatei, die der Agent vor der Verwendung begrenzt.
Technisch: Python 3.12 und numpy für den Agenten, Textual für den Monitor, pytest für 163 Tests und GitHub Actions, das sie vor jedem Merge ausführt.
Am Wettkampftag liefen die Partien mit einer Runde pro Sekunde vor der ganzen Klasse, ohne zweiten Versuch: eine stressige Übung, bei der jede Entscheidung unter Druck und ohne Überreaktion fallen musste. In der ersten Partie war die Klasse viel aggressiver als meine Simulationen, und ich habe die Marge Schritt für Schritt erhöht. Für die zweite bin ich höher gestartet und habe den Punkteverkauf abgeschaltet: Der Agent gewann 87 % seiner Gebote und wurde Fünfter von 20, mit der Note B.
Ich wollte den bestmöglichen Bot bauen, und es ist gut gelaufen. Es war aber auch eine echte Herausforderung: ein sehr grosses Python-Projekt, aufgeteilt auf Agent, Monitor und Simulator, entstanden in etwas mehr als zwei Wochen über 22 Pull Requests.