Schiffeversenken mit T-SQL (und KI)

Auf den SQLdays in Erding  habe ich, Torsten Ahlemeyer, den aktuellen Status des Projektes „BattleShips“ vorgestellt. Dabei programmieren wir mit reinem T-SQL  von der „grünen Wiese“ aus ein netzwerkfähiges Schiffeversenken. Dieses dient dazu massenhaft Übungssätze zu generieren, um damit eine künstliche Intelligenz unter Microsoft Azure zu trainieren. Den so erstarkten Gegner lassen wir gegen unseren T-SQL-Algorithmus spielen oder fordern ihn gleich selber heraus. Kannst Du als menschlicher Spieler die KI von Microsoft schlagen?

Die Idee: "KI gegen menschlichen Spieler"...

Auf dem Rückweg von der SQL Server Konferenz, wo ich kurzfristig als Sprecher für einen Kollegen eingesprungen war, diskutierte ich angeregt mit meinem Chef. Es ging darum weitere Themen zu finden, mit denen wir die erfolgreiche Session-Reihe (u.a. die T-SQL-Kopfnüsse) fortsetzen könnten. Außerdem galt es die enorme technologische Bandbreite aufzuzeigen, die die arelium GmbH mittlerweile mit ihren Spezialisten abdeckt. Da das Thema auch noch dazu geeignet sein musste, sich auf einer Konferenz in einer 60-Minuten-Session präsentieren zu lassen, fiel die Wahl relativ schnell auf das Thema „Schiffeversenken“. Es ist leicht zu lernen, allgemein bekannt und liegt ohnehin schon in einer Art Tabellenform vor. Außerdem war es ein schönes und vor allem durchgehendes Anwendungsszenario, um Werkstudenten und neuen Mitarbeitern die Grundlagen der Abfrage- und Programmiersprache T-SQL näher zu bringen.

BattleShips-Logo

Mit dem Projekt "BattleShips" schafft Torsten Ahlemeyer ein durchgehendes Beispiel, um von Grund auf das Programmieren mit T-SQL zu lernen.

Schritt 1: Schiffeversenken als Übungsmaterial für Werkstudenten

Zunächst galt es also eine Umgebung zu schaffen, an der Anfänger üben konnten eine Datenbank anzulegen. Diese sollte mit entsprechen Objekten wie Tabellen, Sichten sowie später auch Prozeduren und Funktionen gefüllt werden. Auch fortgeschrittene Fragestellungen wie Trigger, Indizierung oder die Relationen zwischen den Tabellen sollten erklärt und trainiert werden. Neben der DDL (Data Definition Language), die sich mit der Anlage, der Änderung und der Löschung von Datenbankobjekten beschäftigt, kam natürlich auch die DML (Data Manipulation Language) zur Sprache. Hier ging es um die Manipulation der Inhalte. Datensätze wurden in Tabellen gespeichert, nachträglich geändert und wieder gelöscht. 

Als letztes Element wurden auch Abfragen ausführlich besprochen und an diversen Beispielen geübt. Diese SELECT-Statements sind äußerst mächtig und reichen in ihrem Schwierigkeitsgrad von einfach bis sehr komplex. Das Material ist so ausgelegt, dass sich das Level langsam aber kontinuierlich steigert, bis man sogar die Pivotierung, die Rekursion, Window Functions und diverse exotische JOINs beherrscht. 

Schritt 2: Eine 60-Minuten-Session extrahieren

Kaum hatte ich alle Trainingsthemen zusammen habe ich diese in Kapitel gruppiert, die aufeinander aufbauen. Die grundsätzliche Idee war skriptgesteuert nach und nach die Objekte bereit zu stellen. Zuerst kam die Anlage der Datenbank . Dann wurden Basistabellen erzeugt und mit Inhalt versorgt. Später wurden Abfragen auf diese Daten realisiert – erst auf einzelne Tabellen, später als Kombination aus mehreren Datenquellen. Die dabei eingeführten Views wurden im Laufe des Projektes immer weiter verfeinert, so dass eine vollständige Grafikausgabe für unser Schiffeversenken entstand.

Die Spielbretter des Schiffeversenken-Clons

Einen großer Abschnitt der Session für eine IT-Konferenz sollte dann der eigentliche Programmablauf einnehmen. Ich integrierte also Prozeduren und Funktionen zur Anlage der Spieler, zur Abgabe eines Schusses und der Auswertung des Ergebnisses. Zunächst waren dies einfache ausgelagerte Codeblöcke, später kamen aufwendige Parameterübergaben, Fehlerroutinen und Protokolleinträge dazu.

Schritt 3: mehr Komplexität! ... mehr T-SQL!

Bis zum ersten Spiel „Mensch vs Mensch“ (auf Wunsch sogar über das Netzwerk) waren es nur ein paar Stunden Programmierarbeit. Doch schnell wollten wir mehr. Also schrieb ich noch einen T-SQL-Algorithmus, der diverse Schwierigkeitsstufen eines automatisch agierenden Computergegners nachrüstete. Außerdem wurden die Regeln komplett über Nachschlagetabellen abgebildet und somit einstellbar. Der Computergegner platzierte die konfigurierten Schiffe per Zufall. Er konnte je nach Einstellung wie ein 5-jähriges Kind mit rein zufälligen Schüssen agieren oder wie ein Profi mit taktischen Überlegungen aufwarten.

Dazu griff ich schon tief in die Trickkiste und implementierte eine Schussverfolgung, eine Mustererkennung und diverse Optimierungen. Hierunter fielen z.B. die Intelligenz nach einem Treffer sofort zu versuchen das getroffene Boot auch vollständig zu versenken. Auch die Erkennung von „unmöglichen“ Felder, die laut Spielregeln keine Boote verbergen durften, gehörte in diese Kategorie. Der so geschaffene Gegner war schon extrem stark…

Schritt 4: jetzt muss die KI ran...

Mit der künstlichen Intelligenz aus der Microsoft Azure Cloud haben wir uns dann den ultimativen Endgegner erschaffen. Mit Ken Schimanski bekam ich einen ehemaligen Werkstudenten zur Seite gestellt, den wir nach seinem erfolgreichen Master in Mathematik fest angestellt hatten und der nun bei der arelium GmbH die Themen „Artificial Intelligence“ und „Machine Learning“ voran treibt. Er entwarf ein entsprechendes Muster und implementierte es mit Python in der Cloud. Ich schuf mit ein paar speziellen Prozeduren und Views eine saubere API für den KI-Zugriff auf die BattelShips-Datenbank.

Wir ließen meinen T-SQL-Algorithmus einige tausend Partien gegen sich selber spielen und loggten die Ergebnisse Zug für Zug mit. Diese Massendaten verfütterten wir als Trainingsinformationen an die künstliche Intelligenz. Zuerst spielte diese auf sehr niedrigem Niveau. Da wir in Richtung der künstlichen Intelligenz keinerlei Spielregeln fest implementiert hatten, unterstützten wir den Lernvorgang durch gezielt eingesetzte Belohnungen (ein Schiff wurde getroffen oder sogar versenkt) oder Strafen (es wurde ein Feld beschossen, welches im selben Spiel schon beschossen wurde). Die Routine auf Azure lernte extrem schnell, da sie auf Punkteoptimierung hin ausgerichtet wurde. Aus eher zufälligen Schüssen wurden nach ausreichend Trainingspartien schnell erste erfolgversprechende Schussmuster. Die Entwicklung ähnelte einem Kleinkind, welches nach und nach Taktiken entwickelt und diese ausbaut, wenn es Erfolge feiert.

Schritt 5: ein Ganztagesworkshop

Für SQLdays in Erding  nutzte ich das nahezu abgeschlossene Projekt dazu einen Ganztagesworkshop zum Thema „Programmierung mit T-SQL“ anzubieten. Dieses Jahr war die Veranstaltung in Erding bei München unter den Einflüssen der Corona-Pandemie als Hybrid-Event ausgelegt. Bis zu 50 Interessierte durften vor Ort den Sessions lauschen und an den Workshops partizipieren. Auf Basis der virtuellen Teilnahme gab es keinerlei Einschränkungen. 

Ankündigung vom Battleship Workshop für die SQLdays

Über 8 Stunden hinweg habe ich dort meinen Teilnehmern Einblick in die Geheimnisse der Entwicklung mit T-SQL gegeben. Wir haben an diesem Tag das gesamte Projekt nachgebaut und dabei alle relevanten Programmiertechniken und Datenbankobjekte durchgesprochen. Auch blieb etwas Zeit für die berühmten Tricks und Kniffe aus über 17 Jahren Entwicklererfahrung. Bei einem sehr unterschiedlichen anfänglichen Kenntnisstand der Lernwillegen ist es aufgrund der guten Vorbereitung jederzeit gelungen alle Teilnehmer individuell abzuholen, in Übungsaufgaben einzubinden und entsprechend ihrer Fortschritte weiter zu fordern und fördern.

In der abschließenden Feedbackrunde war die Begeisterung über die Möglichkeit ein durchgehendes Projekt zum Erlenen derart vieler Befehle und Techniken zu nutzen der meistgenannte Punkt. Alle Teilnehmer (und auch der Referent) hatten viel Spaß und haben eine Menge neuer Ideen und Anregungen mitgenommen. Bei Bedarf ist dieser Workshop natürlich auch in eine mehrtägige Inhouse-Schulung wandelbar und man könnte so noch tiefer in die Thematik einsteigen.

und wie geht es weiter?

Das Projekt „BattleShips“ wird nach wie vor weiterentwickelt. Gerade die KI-Seite ist noch ausbaufähig und hier sehen wir noch Verbesserungspotential, damit unser Computergegner noch spielstärker wird. Aktuell läuft die Programmierung einer zweiten Stufe mit erweiterten Spielregeln, die auch Verteidigungswaffen wie Wasserminen und Schiffe vorsieht, die nicht rein waagerecht oder senkrecht platziert werden müssen. Diese Anpassungen hebt den taktischen Anspruch an das Spiel auf ein völlig neues Niveau und reizt die Möglichkeiten der KI deutlich mehr. Beispielsweise kann man sich als Spieler mit Zugrecht nun entscheiden, ob man lieber im Modus „Dauerfeuer“ mehrere Schüsse abgibt oder sich mit der sehr durchschlagsstarken Küstenbatterie auf genau einen Schuss für diese Runde beschränkt. Treffer mit dieser Waffe führen allerdings dazu, das gegnerische Boote sofort sinken, auch wenn es noch ungetroffene Bauteile gibt.

Wasserminen und Küstenbatterie im Einstaz

Mittelfristig werden wir wohl dem Projekt eine Weboberfläche spendieren, so dass man mit beliebigen Zugangsgeräten eine Partie Schiffeversenken spielen kann. Bist Du taktisch raffinierter als die künstliche Intelligenz von Microsoft ?

Besonders spannend ist allerdings, dass mit dem Heise Verlag mittlerweile der Herausgeber des anerkannten IT-Fachmagazins <c’t> auf das Projekt aufmerksam geworden ist. Mit „Heise Knowledge“ wurde gerade eine neue Gesellschaft für digitale Weiterbildung gegründet, die diesen Kurs in Form eines Videotrainings angefragt hat. Die Verträge sind schon unterschrieben und ich habe bereits über 9 Stunden Videomaterial aufgezeichnet. Auf der Plattform des Heise-Verlags wird man also zukünftig jede Zeile dieses spannenden Programmiervorhabens erklärt bekommen…

Teilen:

Share on xing
Share on email
Torsten Ahlemeyer

Torsten Ahlemeyer

Schreiben Sie einen Kommentar

Blog abonnieren:
Loading

Weitere Beiträge: