PhiLIOsoph

18.05.2007

Künstliche Intelligenzen gegeneinander kämpfen lassen…

Filed under: Informatik,Spiele — Robert @ 22:09:47

AntMe! Logo
© Microsoft

Heute morgen habe ich von “AntMe!” gelesen, einer Programmierumgebung, die man innerhalb von Microsoft®s .NET-Programmierumgebungen (IDEs) nutzen kann. Anscheinend kann man die zur Nutzung von “AntMe!” nötige Funktionalität nachträglich in eine beliebgie .NET-IDE integrieren (als Plugin o.ä.). Dann kann man offenbar (ich habe es noch nicht selbst probiert) die “Programmierung” eines Ameisenvolkes vornehmen, das im Anschluss gegen beliebige andere Ameisenvölker unterschiedlicher Programmierung antreten kann. Es gilt, Nahrung zu sammeln und ggf. zu kämpfen – nur einer übersteht auf Dauer die Konkurrenz. Der “Kampf” wird natürlich visuell veranschaulicht und man kann seinen Ameisen live beim Kampf zusehen:

AntMe! Visualisierung
© Microsoft

Was mich daran besonders fasziniert, ist die Idee, gegen die Ameisenvölker anderer Programmierer anzutreten und das eigene Ameisenvolk von mal zu mal zu perfektionieren. Im Moment bin ich deswegen dabei, Microsoft® Visual C#® 2005 Express herunterzuladen und zu installieren.

Alternativen zu AntMe!

Bis gerade eben habe ich Alternativen zu AntMe! ausprobiert – für Linux. Erstmal war es aufwändig, welche zu finden… dann fand ich Seed7 bzw. DNA Fight, konnte es aber leider trotz mehrerer Versuche nicht kompilieren (typisches Problem) konnte es aber erst nach dem Fertigstellen dieses Artikels erfolgreich kompilieren. Siehe dazu Kommentar 3 und folgende…
Nebenbei fand ich allerdings auch NERO, womit nicht das allseits bekannte Brennprogramm, sondern ein Spiel mit ähnlichen Funktionen und einem ähnlichen Spielziel, wie dem von AntMe!. Allerdings konnte ich auch hier die Linux-Version nicht zum Laufen bringen (diesmal konnte mein Packer das Archiv nicht entpacken)…

Wikipedia:

Im Spiel trainiert man Roboter, die für ihr Handeln vom Spieler entweder eine positive oder eine negative Bewertung bekommen. Gut bewertete virtuelle Genkonfigurationen haben eine höhere Chance, bei der simulierten Evolution mit einem anderen Gen verschmolzen zu werden.

> Offizielle Website von NERO

KI-Schlachtfelder mit dem Warcraft® 3 – Welteneditor…

Zum Abschluss hatte ich die Idee, ein Strategiespiel für mein Ziel zu zweckentfremden … dazu nahm ich Warcraft® 3 (bzw. die Erweiterung TFT) und erstellte mir im Welten-Editor eine sehr triviale Karte mit dem Titel “AI Wars” (deutsch: Krieg der künstlichen Intelligenzen), auf der 2 Spieler gegeneinander antreten konnten. Die 2 “Spieler” sind in Wirklichkeit die beiden künstlichen “Intelligenzen”. Man selbst kann nur zusehen (dafür gibt es 3 weitere Spielerslots).

Das Hauptfenster des Editors:
AI Wars - Editor

Damit auch überhaupt ein Kampf stattfinden kann, starten die KIs mit jeweils 15 Gold. Alle 15 Sekunden wird das vorhandene Gold in neue Einheiten umgesetzt. Die erste KI hat dabei ihr Lager in der oberen linken Ecke der Karte, die zweite KI genau gegenüber. Überdies hinaus haben beide KIs in ihrem Lager einen Brunnen der Gesundheit, an dem Einheiten sehr schnell geheilt werden können, falls sie verletzt sind.

Die KIs agieren hauptsächlich über einen Code, der alle 15 Sekunden ausgeführt wird. Dieser Code veranlasst z.B. alle Einheiten in der jeweiligen Basis zum aggressiven Vorrücken zur Basis des jeweiligen Gegners. Am Anfang rennen also sofort alle 15 Soldaten los und treffen sich in der Mitte mit den Einheiten des Kontrahenten. Da ein einzelner Code, der alle 15 Sekunden aufgerufen wird, allerdings weder eine ordentliche Programmierung zulässt, noch sehr viele Möglichkeiten zulässt, kann man natürlich jeder KI auch weitere “Auslöser” verpassen.

Ein Auslöser im Welten-Editor ist eine Einheit von Ereignissen, Bedingungen und Aktionen … als Ereignis kann z.B. ein Timer gelten, der alle X Sekunden ausgelöst wird. Im Welten-Editor von Warcraft® sind aber schier unendlich viele Möglichkeiten vorhanden… so kann man auch auf das “Angegriffenwerden” einer Einheit reagieren… und diese Einheit dann zum Gegenangriff oder Fliehen veranlassen. Wann immer ich also in diesem Artikel von einem “Code” rede, meine ich in Wirklichkeit einen oder mehrere Auslöser…

Der Auslöser-Editor:
AI Wars - Auslöser

Übrigens erhält eine KI für jeden feindlichen Soldaten, den sie tötet, 1 Gold, d.h. für jeden Soldaten, der getötet wird, erhält die KI einen eigenen Soldaten dazu. Damit eine KI deswegen nicht allzu schnell gewinnt, haben beide KIs in ihrem Lager einen starken Wachturm, der auf feindliche Einheiten schiesst und selbst sehr viel Leben (“Trefferpunkte”) hat. Es dauert also ein paar Minuten, bis sich das Spiel entschieden hat. Außerdem wird diese Karte von mir noch stark erweitert werden, sodass die KIs sich dann nicht nur bekämpfen müssen, sondern auch eine kleine Wirtschaft steuern müssen können. Dann relativieren sich die kleinen Vorteile beim Spielbeginn (wer zuerst zuschlägt usw.).

Das erste Anzeichen von Intelligenz…

Damit auch ich als Programmierer meinen Spaß habe, habe ich mir sogleich eine etwas überlegene KI geschaffen. Sie verfährt nicht mehr nur nach dem “Haudrauf”-Prinzip … jedes Mal, wenn eine Einheit einen Schlag kassiert, wird überprüft, ob diese Einheit noch mindestens 20% ihrer Trefferpunkte besitzt. Falls nicht, so rennt sie sofort zurück in die Basis zum “Brunnen des Lebens”, wo sie dann eine sehr hohe Regenerationsrate genießt. Sobald ihre Trefferpunkte auf über 90% der maximalen TP angestiegen sind, nimmt sie wieder an der Schlacht teil.
Dadurch werden gleich zwei Dinge erreicht: in der Basis steht immer eine kleine “Reserve”, die im Falle des Angriffes – obwohl sie natürlich geschwächt ist – dem Gegner etwas Kontra geben kann …
Außerdem, und das ist viel wichtiger, gelingt es der gegnerischen KI nun fast überhaupt nicht mehr, irgendwelche Soldaten zu töten. Damit versiegt also, zumindest in der jetzigen Version von “AI Wars”, die Hauptgeldquelle des Gegners…

Vorteile und Nachteile des Welteneditors für KI-Schlachten

Vorteile:

  • nahezu unendlich viele Möglichkeiten der KI-Programmierung
  • ebenfalls unendlich viele Möglichkeiten beim Gestalten der Umgebung/der Umstände
  • eine äußerst schöne grafische Darstellung der Schlachten ;-)

Nachteile:

  • beide Programmierer benötigen das Originalspiel
  • das Spiel ist nicht plattformunabhängig (es läuft aber dennoch nativ sowohl auf Windows®- als auch Mac-Systemen)
  • das Antreten zweier KIs ist etwas schwerfällig: man muss jedes Mal, wenn man 2 KIs gegeneinander kämpfen lassen möchte, die Karte editieren (die Auslöser des anderen Programmierers importieren und die eigene KI hineinepfriemeln…)

Solange es keine bessere Lösung gibt, werde ich diese Methode weiter ausfeilen und die Möglichkeiten des Warcraft – Welteneditors so gut es geht ausschöpfen. Da ich bisher nicht eine einzige Karte mit diesem Editor erstellt habe, ist das auch gleich eine gute Gelegenheit für mich, mich damit auseinanderzusetzen. Und wie man an den Screenshots und meinem Gerede erkennt, ist es gar nicht so schwer, wenn man sich ein paar Stunden Zeit nimmt (oder sie einfach hat).

Download der Karte

Für diejenigen, die bis hierher gelesen haben und sich trotzdem im Besitz von Warcraft 3 (+Erweiterung TFT!) befinden, biete ich meine Warcraft-Karte zum Download an. So könnt ihr auch gleich sehen, wie ich bestimmte Dinge realisiert habe. Ich würde mir sowas als Leser auf jeden Fall wünschen. ;)

Download: AI Wars 1.00

Wer eine KI schreibt, die gegen meine KI gewinnt (“KI 1″ bzw. Spieler 11 stellt meine KI dar, KI 2 ist die dumme “Haudrauf”-Truppe), der darf mir seine KI natürlich gerne zukommen lassen. Dann werde ich meinerseits eine bessere KI schreiben und sie zurückschicken. ;)

AI Wars mit Python

Ich träume im Moment von einem Python-Modul, mit dem man AI Wars ausführen kann – 2 ambitionierte Pythonprogrammierer lassen dann ihre künstlichen Intelligenzen gegeneinander antreten – das Modul gibt lediglich die Schnittstelle und damit auch die Spielregeln vor… außerdem ermöglicht es auch gleich die grafische Ansicht des “Kampfes”.

Innerhalb der nächsten Tage werde ich mich diesem noch nicht existenten Modul mal annehmen … zuerst überlege ich mir aber ein geeignetes Szenario für meine “AI Wars”. ;) Für Vorschläge bin ich jederzeit offen – ich würde mich sehr über Ideen und Ratschläge freuen!

Share and Enjoy:
  • del.icio.us
  • Facebook
  • Technorati
  • Google Bookmarks
  • Yigg
  • Digg

8 Kommentare »

  1. Im Bereich Racing Games gibt es da auch einige interessante Sachen bei denen man seine eigene Fahrer KI entwickeln kann.
    http://rars.sourceforge.net/
    http://torcs.sourceforge.net/

    Kommentar by MagicMAD — 18.05.2007 @ 22:56:15

  2. Danke für den Tipp! Mit TORCS habe ich bereits Bekanntschaft gemacht… negativer Art. Bei mir wollte es einfach nicht ohne schwerste Grafikfehler laufen. Eben habe ich es nochmals installiert und siehe da, es funktioniert endlich. Allerdings ist es auch hier sehr aufwendig die KI zu programmieren und einzusetzen. Das Tutorial zu diesem Thema ist ja brechend lang …

    Ich suche aber v.a. nach einfachen und schnellen Methoden, KI-Schlachten auszutragen, sonst vergeht zumindest mir auf Dauer der Spaß…
    Mal sehen, was sich da mit Python so machen lässt. (Die Idee hat sich offensichtlich in meinem Kopf festgesetzt. :) )

    Kommentar by Robert Nitsch — 19.05.2007 @ 12:56:19

  3. Hallo,

    mich würde interessieren, welches Problem Du beim kompilieren von Seed7 hattest.
    Welche Distribution benutzt Du?
    Ist die Entwicklungsumgebung (gcc, make, glibc, include files, X11, usw.) vorhanden?
    Welche Fehlermeldungen tauchten auf?
    Warum war das ein “typisches Problem”?

    Vielleicht handelt es sich um ein allgemeines Problem welches ich im readme
    erwähnen sollte.

    Gruss Thomas Mertes

    Seed7 Homepage: http://seed7.sourceforge.net
    Project page: http://sourceforge.net/projects/seed7

    Kommentar by Thomas Mertes — 22.05.2007 @ 15:38:47

  4. Oh, unerwarteter Support von erster Stelle. :)

    Ich verwende Kubuntu Feisty Fawn (7.04).
    Die Entwicklungsumgebung war fast komplett vorhanden, allerdings fehlten mir offenbar noch die X11-Includes, denn unter anderem heisst es:
    drw_x11.c:39:22: error: X11/Xlib.h: No such file or directory
    drw_x11.c:40:23: error: X11/Xutil.h: No such file or directory

    Nach relativ langem Suchen habe ich nun die folgenden Pakete installiert: libx11-dev und x-dev. Deine Auflistung der nötigen Programme hat mich darauf gebracht…

    Das Kompilieren hat jetzt auch endlich funktioniert und ich habe einen weiteren Fehler von mir entdeckt. Ich wollte die Skripte (.sd7-Dateien) immer mit “hi hello” – nur als Beispiel – starten. Dabei musste ich aber “./hi hello” eingeben, damit “hi” aus dem aktuellen Verzeichnis verwendet wird. Das wusste ich nicht…
    Wenn ich mich im Verzeichnis /prg befinde, dann funktioniert der Aufruf “./hi hello” übrigens nicht, denn:

    HI INTERPRETER Version 4.5.2357 Copyright (c) 1990-2007 Thomas Mertes
    *** hello.sd7(25):3: Include file “seed7_05.s7i” not found
    $ include “seed7_05.s7i”;

    Ich habe die Datei dann um folgende Anweisung ergänzt: $ library “../lib”;
    Und jetzt funktioniert auch das Hello-Skript.

    Zu deiner Frage, warum das ein typisches Problem ist:
    C++ hat mich schon mehrmals enorm gefrustet… die Eigenarten einzelner Compiler machen mir extrem zu schaffen und so habe ich es immer ziemlich schnell wieder aufgegeben. Mit C++ habe ich einseitig negative Erfahrungen gemacht. Teilweise konnte ich ja nicht mal minimalistische Einzeiler kompilieren. :(

    Umso mehr freut es mich, dass es mit Seed7 jetzt geklappt hat. Nun werde ich gleich mal einige Dinge ausprobieren und dir ggf. bei Fehlern Bescheid geben.

    Danke!

    Kommentar by Robert Nitsch — 22.05.2007 @ 16:39:08

  5. Ich sollte vielleicht im read_me darauf hinweisen, dass ein Aufruf von
    ./hi statt hi notwendig ist, wenn das aktuelle Verzeichnis nicht in
    der PATH Variable vorkommt.

    Die Meldung: ‘Include file “seed7_05.s7i” not found’ wundert mich.
    Wie schaut die Datei seed7/src/version.h aus? Dort sollte ein define
    für den Pfad zu den library (bzw. include) Dateien stehen. Zum Beispiel:

    #define SEED7_LIBRARY “/home/tm/seed7/lib”

    Dadurch sollte der ‘hi’ interpreter stets wissen, wo er die include
    Dateien findet. Die Datei version.h wird bei der Ausführung des Befehls

    make depend

    erzeugt (vorrausgesetzt sie wurde vorher gelöscht). Ich sehe soeben,
    dass die Anweisung zum Kompilieren unter Linux (bzw. UNIX, BSD …)
    im read_me lauten sollte:

    rm version.h
    make depend
    make

    Dadurch wird die Datei version.h neu erstellt, und sollte somit
    den korrekten Pfad in dem define für SEED7_LIBRARY enthalten.

    Gruss Thomas Mertes

    Seed7 Homepage: http://seed7.sourceforge.net
    Project page: http://sourceforge.net/projects/seed7

    Kommentar by Thomas Mertes — 23.05.2007 @ 15:03:17

  6. Das mit der Datei version.h kann ich bestätigen, sie wurde bei mir offenbar nicht neu erstellt. Denn darin finde ich:
    ‘#define SEED7_LIBRARY “/home/tm/seed7_5/lib’, was ja zweifellos falsch ist.

    Darüber hinaus ist bei Ubuntu der aktuelle Pfad ‘.’ nicht standardmäßig in der PATH Variable enthalten, was dazu führt, dass eine ganze Menge Leute erstmal auflaufen werden… daher würde ich den Befehl gleich in “./hi hello” ändern. Außerdem wurde trotz “hi hello” ein anderes Programm ausgeführt wird, nämlich hmake. Das war etwas, das mich zusätzlich irritiert hat.

    Gruss zurück, Robert Nitsch

    Kommentar by Robert Nitsch — 23.05.2007 @ 16:37:01

  7. Hallo,
    ich habe gestern ein neues Release von Seed7 gemacht.
    Der Download dafür ist hier:

    http://sourceforge.net/project/showfiles.php?group_id=151126

    Die Datei version.h kommt im Release nicht vor und wird jetzt mit
    dem Befehl ‘make depend’ erzeugt. Zum Kompilieren reicht jetzt:

    make depend
    make

    In der read_me Datei habe ich auch vermerkt, dass der ‘hi’ interpreter
    z.B. mit

    ./hi hello

    gestartet wird. Das ein anderes Program auch ‘hi’ heisst wusste
    ich bisher nicht.

    Gruss Thomas Mertes

    Seed7 Homepage: http://seed7.sourceforge.net
    Project page: http://sourceforge.net/projects/seed7

    Kommentar by Thomas Mertes — 25.05.2007 @ 11:09:16

  8. Super!
    Dann bedanke ich mich hiermit für die Hilfe und werde demnächst mal einen Artikel über Seed7 und vor allem DNA Fight verfassen.

    Gruss, Robert Nitsch

    Kommentar by Robert Nitsch — 25.05.2007 @ 12:34:52

RSS Feed für Kommentare zu diesem Artikel. TrackBack URL

Hinterlasse einen Kommentar

© Robert Nitsch
(Powered by WordPress)