BCC#25 (Künstliche Intelligenz)

Übersicht Sonstiges Projekte

Gehe zu Seite 1, 2, 3, 4  Weiter

Neue Antwort erstellen

BlitzMoritz

Betreff: BCC#25 (Künstliche Intelligenz)

BeitragMo, März 16, 2009 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Liebes BlitzForum,
für das neue Thema habe ich mir ziemlich den Kopf zerbrochen. Einerseits wollte ich den neuen Ansatz, den Holzchopf mit seinem schönen Thema anstrebte, nicht sofort wieder fallenlassen, sondern daran anknüpfen: Auch jetzt soll nicht die Graphik, sondern der Code im Vordergrund stehen.
Andererseits war mein Ansinnen, auch einige von jenen wieder ins Boot zu holen, die mit dem letzten Contest nicht so viel anzufangen wussten, sondern eher wieder irgend etwas spielen wollten, vor allem beim Testen Wink. Ich hoffe darum, mit dem neuen Thema trotz des hohen Anspruchs wenigstens ein bisschen Ausgleich geschaffen zu haben. Genug geredet - hiermit eröffne ich die

25.BlitzCodeCombo: Künstliche Intelligenz (Vier gewinnt)

Arrow Aufgabe:
Erstelle einen möglichst guten Vier-gewinnt-Gegner!
Konkret:
Entwickle ein siegreiches Verfahren, das bei einem Vieg-gewinnt-Spiel (7 Spalten, 6 Reihen) die beste Spalte für den nächsten Zug ermittelt.
Die komplette GUI wird vorgegeben: Keinerlei Graphiken oder Sounds dürfen hinzugefügt werden, es kommt einzig und allein auf eine Function an.
Ich habe mir daher die Mühe gemacht, innerhalb eines Tages ein Programmgerüst vorzubereitet, das quasi als Framework für das Spiel dienen möge. Ich bitte ausdrücklich um Nachsicht und Verständnis, dass dieses Rahmenprogramm aufgrund des Zeitdrucks graphisch und funktionell sehr spartanisch und auf das Nötigste beschränkt blieb, immerhin, man kann es benutzen ... Falls jemand allzu arg Anstoß daran nehmen sollte, bleibt es ihm natürlich unbenommen, die Graphik für den privaten Bereich den eigenen Wünschen anzupassen. Dies hätte dann allerdings nichts mit dem Contest zu tun.

Arrow Quellcode:
Zu verwenden sind alle hiesigen Basic-Dialekte in ihrer Basis-Installation, also ohne Zusatzmodule etc.
Zu diesem Zweck habe ich den Qellcode bereits sowohl für BlitzMax, als auch für BlitzBasic vorbereitet.
Der Code gliedert sich auf in zwei Dateien: Das "Hauptprogramm" sollte eigentlich gar nicht manipuliert werden. Mit ihm startet man das Programm. Für den Wettbewerb zu bearbeiten ist die als externe Datei ausgelagerte Function "BesteSpalte()", welche für die Spalte einen Wert zwischen 0 und 6 zurückgeben soll. Die Besetzung des Spielbretts wird in dem zweidimensionalen, globalen Array namens "Feld" gespeichert, dabei bedeutet 0 = leer, 1 = rot und 2 = gelb. Die Farbe, die gerade dran ist und für die die Function die beste Spalte ermitteln muss, wird in der gleichlautenden globalen Variable "Farbe" gespeichert.
Der Code muss selbst und neu entwickelt werden und darf keine bereits bestehenden Algorithmen enthalten.
Die Größe des Codes sei egal. Erlaubt ist das Hinzufügen von Dateien, die in irgendeiner Form reine Datensätze enthalten, die bestimmte Spielkonstellationen beschreiben. Denkbar wäre z.B., dass das Programm gespeicherte Spielzustände abfragt, um daraus eine Entscheidung herzuführen. Diese Datendateien müssten bei der Abgabe des Wettbewerbs hinzugefügt werden.
Edit (17.03.09): Alle Funktionen der zur Verfügung gestellten "Hauptprogramm"-Datei dürfen selbstverständlich verwendet werden.

Arrow Bewertung:
Für die Bewertung könnte man die folgenden vier objektiven Exclamation Maßstäbe in Betracht ziehen:
1.) Allerwichtigstes Argument sollte selbstverständlich sein, wie gut der "künstliche" Gegner spielt, d.h. wie oft er gewinnt. Vielleicht würde es sogar möglich sein, am Ende des Contests eine Art Wettkampf der künstlichen Intelligenzen zu veranstalten, bei dem man die verschiedenen Computergegner gegeneinander spielen lässt. Das Ergebnis müsste sich schnell und leicht mit einer entsprechenden Routine statistisch feststellen lassen.
2.) Ebenfalls bei der Bewertung zu berücksichtigen ist der nicht unwesentliche Unterhaltungsfaktor: Wie fantasie- und abwechslungsreich reagiert die künstliche Intelligenz? Wenn man bei bestimmten Situationen (v.a. bei der Eröffnung des Spiels) bereits vorher weiß, wie der Computer reagiert, wird's langweilig. Dies würde auch dann offensichtlich, wenn zwei Computergegner mehrmals gegeneinander spielen.
3.) Sekundär, aber nicht komplett zu vernachlässigen ist die Geschwindigkeit, mit der der nächste Zug ermittelt werden soll. Je nach Verfahren kann die nämlich ziemlich stark ausufern. Und mehr als höchstens drei bis vier Sekunden sollte man eigentlich nicht auf den nächsten Zug warten müssen.
4.) Besonders positiv zu würdigen wäre es, wenn jemand es schaffen würde, ein wirklich intelligentes Programm zu entwickeln, das tatsächlich "dazulernt", indem es beispielsweise verlorene Partien in externen "Gedächtnisdateien" speichert, um den gleichen Fehler, der ihm den Sieg gekostet hatte, nicht noch einmal zu begehen. Theoretisch würde dann die Spielstärke nach und nach durch die Menge gespeicherter Gedächtnispartien immer größer werden. Das wäre natürlich der Knüller. Ob das jedoch tatsächlich zu realisieren ist, kann ich noch nicht abschätzen.

Arrow Bedienungshinweis:
Zum Schluss noch ein paar Infos zur Bedienung der vorgegebenen GUI:
Der Einwurf der eigenen Steine ist intuitiv. Soll der Computergegner einen Stein einwerfen (also die Function BesteSpalte() zum Tragen kommen), muss auf den obersten Schalter PC spielt gedrückt werden.
Mit Speichern auf dem zweiten Schalter wird die momentane Spiel-Stellung (für etwaige Test-Wiederholungen) in der fixierten Datei "Spiel.txt" gespeichert und mit Laden wird zurückgeholt. Mit Neues Spiel wird das Brett ausgeleert. Die unteren drei Schalter sind (noch) ohne Funktion und können im Moment nach eigenen Gutdünken genutzt werden.

Arrow Preis:
Dem Sieger winkt als Belohnung die Ehre, den BCC26 austragen zu dürfen. Als kleines Zusatzpräsent spendiere ich zwei Original-DVD-Filme: James Bonds "Hauch des Todes" und WaltDisneys "Monster-AG".

Arrow Download des Rahmenprogramms:

https://www.blitzforum.de/upload/file.php?id=5148

Arrow Zeitrahmen:
Der Wettbewerb startet ab sofort, also am 16.März um 16.00 Uhr.
Edit:
Auf Teilernehmer-Wunsch habe ich die ursprüngliche Dauer des Contests um eine knappe Woche verlängert.
Das offizielle Ende ist nun am Sonntag, den 19.April um 06.00 Uhr in der Frühe.

Viel Spaß, Anregung und Erfolg wünscht Euch nun

BlitzMoritz
  • Zuletzt bearbeitet von BlitzMoritz am Mi, Apr 01, 2009 20:07, insgesamt 4-mal bearbeitet

Nicdel

BeitragMo, März 16, 2009 17:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Nette Idee, ich hätte aber eigentlich erwartet, dass der Code funktioniert:

user posted image

Rolling Eyes

Mfg Nicdel
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Skabus

BeitragMo, März 16, 2009 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab auch schon drüber geschaut und auch entsprechenden Fehler bereits gefunden.Aber es läuft noch nicht ganz befriedigend.

Aber nicht aufregen wie BlitzMoritz ja schrieb: Er hats unter Zeitdruck gemacht, da schleicht sich
immer mal nen Fehler ein^^


MfG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

Smily

BeitragMo, März 16, 2009 17:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde gern ein paar dinge dazu sagen:

Die funktion besteSpalte() sollte einen Parameter haben, der angibt, welche farbe die KI spielt. So kann man dann 2 KIs einfacher gegeneinander spielen lassen.

In bmax wäre ein KI-System sogar wunderbar per OOP umsetzbar.

grüße,
Smily
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

coolo

BeitragMo, März 16, 2009 18:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Sehr schöner Contest, ist sicherlich spaßig seinen Algo "aufzumotzen".
Wobei mir da eines im Wege steht, woher weiß man wer am Zug ist, sonst spielt der Gegner ja gegen sich selbst...

Edit: Bei mir kommt auch die Fehlermeldung, wenn der Debugger an ist.
http://programming-with-design.at/ <-- Der Preis ist heiß!
That's no bug, that's my project!
"Eigenzitate sind nur was für Deppen" -Eigenzitat

Xeres

Moderator

BeitragMo, März 16, 2009 18:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Steht doch im Code...
Code: [AUSKLAPPEN]
Global Farbe% = 1  ;gibt an, welche Farbe gerade dran ist: 1 = rot, 2 = gelb
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

BlitzMoritz

BeitragMo, März 16, 2009 18:24
Antworten mit Zitat
Benutzer-Profile anzeigen
@Nicdel.
So'n Mist, das tut mir leid - aber du hättest ruhig verraten können, wo der Fehler lag, ich vermute, in der Dimensionierung des Feld-Arrays bei BlitzBasic.
Bei BlitzMax hatte ich das Feld als [8,7] dimensioniert und bei BlitzBasic als (7,6). 'hab schon ewig nichts mehr mit BlitzBasic gemacht - da dachte ich, bei BB reicht die tiefere Dimensionierung. Bitte teilt mit, ob's das war

Edit: Nee, das wars nicht, immer noch Fehler (allerdings nur im Debugger-Modus). In BlitzMax läuft alles einwandfrei. Wie gesagt, BB ist lange her, keine Ahnung, was ich bei der Konvertierung von bmx nach bb groß anders gemacht haben könnte, werde jetzt mal suchen, aber wie gesagt, zeitsparender wäre es, Scabus sagt es allen sofort.

@Smily.
Wie Xeres schreibt, ist die Farbe, die gerade dran ist, in der globalen Variablen "Farbe" gespeichert - sorry, hätte ich gleich dazuschreiben müssen, ergänze es jetzt noch...
  • Zuletzt bearbeitet von BlitzMoritz am Mo, März 16, 2009 18:30, insgesamt einmal bearbeitet

coolo

BeitragMo, März 16, 2009 18:29
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMoritz, das ist nicht der fehler, die variable Reihe geht aus irgendeinem Grund ins Negative.
Edit: Fehler gelöst einfach
Code: [AUSKLAPPEN]
If Reihe=-1 Then Exit

Vor Reihe=reihe-1
http://programming-with-design.at/ <-- Der Preis ist heiß!
That's no bug, that's my project!
"Eigenzitate sind nur was für Deppen" -Eigenzitat

BlitzMoritz

BeitragMo, März 16, 2009 18:40
Antworten mit Zitat
Benutzer-Profile anzeigen
'hab was gefunden in der Einwurf-Function:
Während bei BlitzMax dies funktioniert:
Code: [AUSKLAPPEN]
   While Reihe >= 0 And Feld[Spalte, Reihe] = 0
      Reihe = Reihe - 1
   Wend

gibt haargenau das Gleiche bei BlitzBasic eine Fehlermeldung: Bei BM hört die Untersuchung der Bedingungen beim ersten False vor dem "and" auf, bei BlitzBasic scheint sie weiterzugehen. Wahrlich ein komischer Unterschied - fühle mich ein bisschen unschuldig Sad , könnte Nicdel vielleicht diesen riesigen Fehler-Screenshot wieder löschen - der sieht so hässlich aus gleich zu Beginn eines Contests. Auf folgende Art und Weise lässt sich die Debugger-Fehlermeldung vermeiden:
Code: [AUSKLAPPEN]
   While Reihe >= 0
      If Feld(Spalte, Reihe) <> 0 The Exit
      Reihe = Reihe - 1
   Wend

Das Gleiche gilt analog für eine andere While-Schleife, bei der 'raufgezählt wird.
Habe den Download korrigiert - bitte neu 'runterladen.
  • Zuletzt bearbeitet von BlitzMoritz am Di, März 17, 2009 8:40, insgesamt einmal bearbeitet
 

Pitje Puck

BeitragDi, März 17, 2009 18:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Gutes Thema, kurze Fragen:

Darf ich noch eigene Funktionen außer der "BesteSpalte"-Funktion zufügen?
Darf ich noch eigene Arrays im Hauptprogramm zufügen?
Gruß,
Pitje

Chester

BeitragDi, März 17, 2009 19:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Kleine Korrektur: In B3D muss das Dimfeld vor dem Include deklariert sein.

Edit:
Code: [AUSKLAPPEN]
If ErmittelteSpalte >= 0 And ErmittelteSpalte <= 5 Then


Durch diese Bedingung kann BesteSpalte() niemals die letzte Spalte zurückgeben.
  • Zuletzt bearbeitet von Chester am Di, März 17, 2009 20:16, insgesamt einmal bearbeitet

ComNik

BeitragDi, März 17, 2009 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
jepp,in B+ auch...
WIP: Vorx.Engine

BlitzMoritz

BeitragDi, März 17, 2009 22:12
Antworten mit Zitat
Benutzer-Profile anzeigen
@Pitje Puck:
Natürlich darfst du dir noch weitere Functions basteln! - Sonst wär's ja auch ziemlich beschränkt.
Auch zusätzliche globale Arrays sind erlaubt - man wird wohl gar nicht drumherumkommen.

Habe in der Themenbeschreibung noch ergänzt, dass sämtliche Funktionen der zu Verfügung gestellten Hauptprogramm-Datei selbstverständlich weiterverwendet werden dürfen.

Wichtiger Edit:
Danke für eure Korrekturhinweise bezügl. BB. Für den allerersten Fehler fühlte ich mich unschuldig, für diesen hier

If ErmittelteSpalte >= 0 And ErmittelteSpalte <= 5 Then (statt <= 6)

schäme ich mich. Es war nicht gedacht, dass ihr erst einmal das Rahmenprogramm durchforsten müsst auf Fehler, bevor ihr loslegen könnt. Ich entschuldige mich dafür - wenn ich was hastig mache, wird's 'ne Katastrophe. Ihr dürft jetzt ruhig auf mich schimpfen.
Habe den Download erneuert und hoffe, dass jetzt nichts mehr repariert werden muss.
Bitte ladet euch also die neue Version herunter!

skey-z

BeitragDi, März 17, 2009 23:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe es gerade getestet, läuft jetzt.

Ok, Schande über dein Haupt^^

muss mal schauen ob ich die Zeit finde mit zu machen, habe noch eine komplette Website zu erstellen.

Finde das Thema allerdings sehr interessant und würde gerne was abliefern.
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter

tft

BeitragFr, März 20, 2009 15:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi...

das hört sich richtig gut an......

Gruss TFT
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

Chester

BeitragFr, März 20, 2009 15:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie läuft eigentlich die Bewertung? Wird da abgestimmt, oder gegeneinander gespielt, oder wie läuft das ab? Smile

Und spielt eigentlich der Code selbst ein Rolle?

BlitzMoritz

BeitragFr, März 20, 2009 20:19
Antworten mit Zitat
Benutzer-Profile anzeigen
@Chester:
Selbstverständlich wird letztlich wieder jeder nach seinem subjektiven Empfinden abstimmen - warum sollte das jetzt anders sein?
Und welche Maßstäbe man anlegen könnte, hoffte ich eigentlich bei der Aufgabenstellung genügend beschrieben zu haben. Ich glaube, es wird nicht zu schaffen sein, ein echtes Wettkampfturnier der künstlichen Intelligenzen ohne Manipulationsmöglichkeiten zu veranstalten.
Ich könnte mir das Testen der Gegnerstärke konkret so vorstellen:
1.) Man spielt selbst gegen eine künstliche Intelligenz und nimmt wahr, wie schwer es ist, gegen sie zu gewinnen, wie abwechslungsreich sie spielt und ob sie aus verlorenen Partien lernt.
2) Man lässt verschiedene PC-Gegner über ein Netzwerk oder über's Internet gegeneinander spielen (wobei das Problem ist, zu gewährleisten, ob es tatsächlich die künstliche Intelligenz ist, die den nächsten Zug setzt).
3.) Man inkludiert zwei verschiedene BesteSpalte-Functions (unter unterschiedlichem Namen), lässt sie durch geringfügige Änderung des Hauptprogramm-Codes automatisch gegeneinander spielen und registriert die statistischen Daten: Anzahl der Siege, Niederlagen, Remis usw.
Diese dritte Möglichkeit wäre natürlich die schnellste und objektivste, allerdings birgt sie zwei Probleme: Die Code-Beiträge müssen im gleichen Basic-Dialect vorliegen (eine Konvertierung jedes Beitrags wäre mühsam und risikoreich Wink Wink Wink ). Zweitens könnte es sein, dass automatische PC-Gegner-Partien die Tendenz haben, immer oder zu häufig auf Remis zu enden. Wie gut sie tatsächlich sind, sollte dann eher über den individuellen ersten Weg zu ermitteln sein.

Natürlich steht auch die Übersichtlichkeit und Gliederung des Codes im Blickpunkt. In der Praxis werden das aber wohl nicht allzu viele tatsächlich bis ins Detail unter die Lupe nehmen.

Casiopaya

BeitragMo, März 23, 2009 12:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

also grundsätzlich hört sich das mal total cool an. Ich weis aber noch nicht ob ich mitmache. Weiso meinst du, dass das Spielen der KIs gegeneinander schwer zu realisieren sei? Zur Not könnte man ja zwei Programmdateien (jeweils ein "Spieler") gemeinsam in eine EXE-Datei kompilieren und laufen lassen.
Ok, dazu bräuchte es ein Interface, aber das sollte ja nur ein HAndvoll Methoden haben.

Vorallem könnte man dann 1000de Spiele spielen lassen und eine Statistik aufstellen. Alternativ könnte man eine MEisterschaft laufen lassen. Das fände ich absolut genial und spannend Smile

"Kampf der Maschinen" Smile

AnniXa

Betreff: so, hier ist meine schimpansenhirn "KI"

BeitragDo, März 26, 2009 14:01
Antworten mit Zitat
Benutzer-Profile anzeigen
meine Schimpansenhirn KI...



wirklich nen plan hat sie nicht,

sie prüft erst ob es potentielle gewinnchancen gibt das spiel in aktuellen zug zu gewinnen, wenn ja nutzt sie diese aus und gewinnt,
wenn es keine gibt fügt sie sinvolle positionen in eine liste mit "nogospots" also stellen wo sie nichts reinwerfen darf, weil sie sonst sich evtl. eine spätere gewinnchance verbaut.

als zweites prüft sie ob der gegner in seinem nächsten zug gewinnen könnte, wenn dies so ist wird das natürlich gleich vereitelt, ansonsten werden auch hier evtl dinge in die nogolist eingetragen, also stellen wo sie auf keinen fall etwas reinwerfen darf, weil sie sonst evtl den gegner den gewinn ermöglicht.

es gibt nogolist einträge stufe 1 und 2,
stufe 1 bedeutet, hier nichts reinwerfen, wenn der gegner was reinwirft in seinem zug kann sie vieleicht gewinnen.
stufe 2 bedeutet, hier nichts reinwerfen, denn wenn sie das tut kann der gegner gewinnen.

ansonsten wenn aber nichts zutrift, also weder sofort gewinnen, noch vereiteln, wird einfach zufällig nen platz ausgewält und was reingeworfen (sofern es nicht auf der nogo liste vertreten ist)

ja so funzt meine simple ki, lediglich ein prüfen der bedingungen und darauf reagieren.

https://www.blitzforum.de/upload/file.php?id=5128

veränderungen am Hauptprogramm.bb :
habe nur 1 zeile in die hauptschleife getan, damit die "ki" "sagen" kann was so los war und was sie getan hat etc.
Code: [AUSKLAPPEN]

Repeat
   Cls
   ZeigeSpielbrett()
   ZeigeSchalter()
   Interaktion()
   ShowAiMessage() <---------------------------------
   Flip
Forever



hf

Firstdeathmaker

BeitragDo, März 26, 2009 16:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, meine KI geht so ähnlich, will sie aber noch verfeinern. Sie baut sich einen Situationsbaum auf, welcher in einem binären Suchbaum gespeichert wird. Bei jeder Anfrage wird, falls diese Situation noch nicht eingetroffen ist, bis zu einer bestimmten Tiefe alle Nachfolgesituationen erstellt, und geschaut ob es irgendwo eine Niederlage oder einen Gewinn gibt, und dann die günstigste Zugfolge ermittelt.

Dadurch wird natürlich, je nach eingestellter Tiefe, sofort erkannt wenn der Gegner im nächsten Zug irgendwo gewinnen könnte. Meine KI kann zudem die gelernte Datenbank abspeichern und für ein weiteres Spiel wieder verwerten.


Für den Test der Codes würde ich vorschlagen, einfach ein Testprogram in BB und BMax zu erstellen, welches über eine Netzwerkverbindung das Spiel austrägt. Diese könnte man dann ja auch leicht auf einem PC laufen lassen, und darüber BMAX gegen BB code antreten lassen, oder auch BB gegen BB ohne das man die Funktionen umbenennen müsste.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Gehe zu Seite 1, 2, 3, 4  Weiter

Neue Antwort erstellen


Übersicht Sonstiges Projekte

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group