Einen schönen Abend noch
Alexander Peters
Bitte posten... würde mich auch interessieren...
CU
Stefan
> Aus diesem Grund suche ich Text Material über KI und Sourcen von Games
> wie Tic Tac Toe, Vier Gewinnt usw.
Besuche eine (Fach-)Bibliothek.
Wenn Du ohne Theorie loslegen willst baust Du zwei Hauptbestandteile: Einen
Zuggenerator und eine Bewertungsfunktion.
Der Zuggenerator erzeugt basierend auf einer gegebenen Stellung, und der
Information welcher Spieler dran ist, neue zulässige Stellungen. Stellt
also im Prinzip einfach fest, was denn alles an Zügen möglich ist.
Die Bewertungsfunktion ermittelt wie "gut" diese Stellung ist. Eine
Stellung, in der Spieler A gewonnen hat bekommt zum Beispiel 100 Punkte,
eine in der Spieler B gewonnen hat -100 Punkte, alle anderen eine Punktzahl
dazwischen, die sozusagen ausdrückt wie wahrscheinlich es ist, daß ein
Spieler gewinnt.
Und dann ist die Sache einfach. PseudoCode für einen Zug des Computers:
While Zeit_Übrig
bzw. bei einstellbarer Spielstärke
for i:=0 to Level do
begin
{ Erzeuge neue Züge }
{ Bewerte Züge }
end;
{ Führe Zug mit der maximalen Punktzahl aus }
Der Knackpunkt ist natürlich die Bewertungsfunktion. Aber dabei kann Dir
kein Buch helfen, dazu musst Du selber das Spiel sehr gut verstanden haben.
Eine unabhängige Herausforderung bestünde jetzt darin statt einer
klassischen Bewertungsfunktion eine selbstlernende zu schreiben. Zum
Beispiel ein neuronales Netz. Das könntest Du mit automatisch erzeugten
Partien trainieren...
Ciao, MM
--
http://www.marian-aldenhoevel.de
"'How do I get my program to act like a daemon' is a good read in this
regard. The FAQ mentions nothing about getting your program back from
the dark side. This matter is left as an exorcize for the reader."
> Ich möchte für mich ein kleines Vier gewinnt Spiel erstellen um
> so etwas über das erstellen von Computer Gegnern zu erfahren.
Wenn du fertig bist würde ich es mal gerne testen. Bis jetzt kenne ich
kein 4-Gewinn das eine annehmbare Spielstärke hat. Entweder ist das
Thema nich ganz so einfach oder es gibt keinen Algorythmus der den
Menschen überlegen ist.
Gruss Oliver
"Alexander Peters" <devi...@gmx.ch> schrieb im Newsbeitrag
news:3c436dc0$0$5870$9b62...@news.freenet.de...
Hallo!
Bei allen diesen Spielen wirst du um das Verständnis der diversen
Komponenten nicht herumkommen.
-) Der Zuggenerator
Das ist beim Schach eine relativ komplexe Sache und verwirrt den
Anfänger tatsächlich viel zu sehr, um als Einstieg geeignet zu sein.
Allerdings ist es bei 4 Gewinnt sehr einfach, einen Zuggenerator zu
schreiben, da du nur maximal 7 Möglichkeiten hast und das einzige, was
dir an Widerwärtigkeiten passieren kann, eine bereits volle Reihe ist.
-) Die Bewertungsfunktion
Die ist schon etwas schwieriger zu handhaben, wenn du nicht nur so
triviale Dinge wie "4 in einer Reihe => ich habe gewonnen/verloren"
erkennen willst. Du findest eine Stellung (z.B. in Form eines
zweidimensionalen Arrays, das mit Werten belegt ist) vor, und musst
dir jetzt Kriterien einfallen lassen, um dieser Stellung eine
Bewertung zu geben. Z.B. bekommt eine Stellung, in der du 3 in einer
Reihe hast eine etwas höhere Wertung. Für sich alleine genommen ist
die Bewertungsfunktion in den meisten Denkspielen jedoch wenig
nützlich, du brauchst auf jeden Fall noch
-) Die Baumsuche
Auch hier gibt es das relativ einfache "Brute Force": Du schaust dir
auf alle deine möglichen Züge sämtliche möglichen Gegenzüge an und
bewertest alle Endstellungen. Unter der Annahme, dass der Gegner den
(nach deiner Bewertungsfunktion) immer besten Zug machen wird, kannst
du dir bereits eine etwas schlauere KI machen, die einen Zug
vorausdenkt. Bei hohen Suchtiefen kommt man allerdings schnell auf
immens hohe Stellungszahlen, also gibt es auch hier jede Menge Tricks,
die aufzuzählen diesen Rahem sprengen würde.
Meistens sind diese drei Komponenten ineinander verflochten, sodass
man sie bei Profi-Programmen manchmal gar nicht mehr deutlich
unterscheiden kann.
Vielleicht hilft dir
http://www.computerschach.de/minimax/index.htm
ein bisschen weiter - ist zwar noch immer Schach, aber die Grundzüge
sind bei nahezu jedem dieser zugorientierten Spiele gleich.
Schöne Grüße
AlN
--
adressiert Akustik Appell asynchron Atmosphäre Autor Ellipse
Emission gesamt heraus Immission interessiert korreliert
korrigiert meistens nämlich offiziell Paket parallel reell
Satellit Standard Stegreif voraus
Ich habe da mal einen Link bei Delphi3000 gefunden:
http://www.delphi3000.com/articles/article_2470.asp
http://www.delphi3000.com/articles/article_2551.asp
Gruss
Pascal Enz
Ich habe sowas mal in TurboPascal geschrieben. Ist schon ne Weile her. Die
KI war aus Zeitgründen am Ende komplett in Assembler (286er Inline Assembler
von TP). Und die Spielstärke war erstaunlich gut.... Wenn jmd. das Programm
haben möchte suche ich es mal raus, evtl. kann ich die KI ja sogar mit
Delphi in ein schönes Win32-GUI reinbasteln... Dauert halt nur etwas...
Und zur Vorgehensweise: Genau wie oben schon angesprochen wurde - "Einfach",
je nach eingestelltem Level, alle bis zu einer gewissen Tiefe möglichen Züge
durchgehen (um Zeit zu sparen kann man da schon jede Menge Unsinn weglassen,
aber das ist wie schon bemerkt wurde nicht ganz trivial). Und die möglichen
Züge dann bewerten (auch das ist nicht ganz ohne...). Und dann den besten
Zug oder einen Zug der nahe am besten Zug liegt (damit der Rechner nicht
immer gleich spielt und berechenbar wird), nehmen.
Das Ergebnis der Berechnung auszuwerten hat wiederum einige Probleme in
sich. Wenn ich z.B. weis, das ein bestimmter Zug für mich in 5 Halbzügen zum
Sieg führen kann muss ich beachten, ob derselbe Zug nicht innerhalb von 4
Halbzügen dem Gegner zum Sieg verhilft..... Desweiteren kannst du dir ab
einer bestimmten Rechentiefe nicht alle Ergebnisse merken (das werden
schlicht zu viele), du musst, während du den Baum der möglichen Züge
durchgehst schon sehr viel wegschmeißen (dabei zu wissen was man wegschmeißt
und was nicht erfordert einiges an Gehirnschmalz, besonders wenn man's dann
in Assembler umsetzt).
CU
Marco
> Unter Google finde ich nicht so das richtige. Vieleicht kennt jemannd von
> euch einen guten Text oder Source dann würde ich mich freuen wenn
> er mir eine URL posten könnte oder mir eine eMail schickt.
Backtracking , evtl. optimiert mit Branch&Bound würde ich vorschlagen.
Du kannst das Nachlesen in diversen Informatik Grundstudiumsskripten.
Zum Beispiel:
http://web.informatik.uni-bonn.de/I/VL/III/index.html
(Das Skript steht ganz unten, das sind einige PDF's. Backtrackung steht
eher im letzten Viertel)
--
Bye,
Patrick Cornelißen
http://www.p-c-software.de
ICQ:15885533
Hi,
es ist bewiesen, dass der Spieler der anfängt immer gewinnen kann.
Dieser Algorithmus ist aber auch sehr stark, wenn er nicht anfängt
(...komischer Satz, irgendwie ;).
Das ganze ist eine Masterarbeit: "A Knowledge-based Approach of
Connect-Four - The Game is Solved: White Wins" von Victor Allis (Department
of Mathematics and Computer Science, Vrije Universiteit, Amsterdam).
Adresse: http://www.ce.unipr.it/~gbe/velena.html
Der Autor beschreibt auch sehr detailliert, welche Strategien man bei der
Bewertung der Züge anwenden kann und welche sinnvoll sind.
Gruss
Robert
>Ich möchte für mich ein kleines Vier gewinnt Spiel erstellen um
>so etwas über das erstellen von Computer Gegnern zu erfahren.
>Ich habe es schon mit diversen Schachkomponenten versucht
>aber diese waren für mich einfach noch zu schwer zu verstehen
>da es mir nicht nur um das benutzen der Komponente geht sondern
>auch um das verstehen damit ích selbst auch mal eine erstellen kann.
>Aus diesem Grund suche ich Text Material über KI und Sourcen von Games
>wie Tic Tac Toe, Vier Gewinnt usw.
Der einfachste Weg bei Tic Tac Toe oder Vier Gewinnt: Alle Möglichkeiten
durchprobieren und die beste (evt. auch nur eine gute) Möglichkeit
auswählen. Bei komplizierteren Spielen (z.B. Schach) wird es jedoch enorm
wichtig, möglichst viele Bereiche des Baumes wegzuschneiden (branch&bound),
da die Anzahl der Möglichkeiten exponentiell wächst. Bsp.: Bei Probleme der
Art "finde eine Anordnung von 1 König, 1 Königin, zwei Türmen [...], die das
ganze Schachbrett abdeckt" kommst Du z.B. ohne die Ausnutzung von Symmetrien
und frühzeitigem Erkennen von bereits "vermurksten" Anordnungen nicht weit.
Wenn Du mehrere Züge im Voraus berechnest kann es wichtig sein, dass Du
zuerst in die Tiefe suchst ("depth-first search"), also eine Zugabfolge
fertig stellst bevor Du eine neue beginnst. Dadurch sparst Du Speicher
gegenüber einer "breadth-first search".
Ob ein Neuronales Netz für Tic Tac Toe & Co. geeignet ist kann ich nicht gut
beurteilen. Allerdings wäre ich etwas pessimistisch was die
Generalisierungsfähigkeit betrifft (wenn Du einfach Muster aus
Spielsituation + Zug + Bewertung des Zuges trainierst wird das Netz
möglicherweise einfach diese Muster "auswendig lernen" und ab einer
bestimmten Anzahl auch stark zu überlagern beginnen; -> Netze, die ihre
Topologie selbstständig anpassen?).
Betreffend Tic Tac Toe: evt. hilft Dir folgende Seite weiter:
www.generation5.org , tic tac toe ins Suchfeld eingeben.
Mfg Pascal
> es ist bewiesen, dass der Spieler der anfängt immer gewinnen kann.
> Dieser Algorithmus ist aber auch sehr stark, wenn er nicht anfängt
> (...komischer Satz, irgendwie ;).
>
Das wuste ich noch. Dann brauche ich ja auch nicht Probe zu spielen,
weil ich sowieso nicht gewinnen kann.
Gruss Oliver
>Ich habe da mal einen Link bei Delphi3000 gefunden:
^^^^^
>http://www.delphi3000.com/articles/article_2470.asp
>http://www.delphi3000.com/articles/article_2551.asp
Ok. Du programmierst da schon mal nicht mit. Du kannst ja schon
Schwierigkeiten bei der einfachen Addition... ;)
Cheers,
Udo
--
Homepage: http://www.nesshoever.de/ [No mails please. Reply here.]
Delphi: W2K.sp2, D4Pro.sp3, D6Pro.sp1 [dcld-KUSS-Kasse: 90 Lewonzen]
Das angesprochene Programm verwendet keinen Algorithmus sondern ein
"OpenBook" (also eine Zugbibliothek, in der steht, in welcher Situation
welcher Zug zu wählen ist) von stattlichen 800kb Größe. Und es ging im
Ausgangsposting schließlich um einen Algorithmus bzw eine "KI".
CU
Marco
> Eine unabhängige Herausforderung bestünde jetzt darin statt einer
> klassischen Bewertungsfunktion eine selbstlernende zu schreiben. Zum
> Beispiel ein neuronales Netz. Das könntest Du mit automatisch erzeugten
> Partien trainieren...
Wow! Ich hatte das bisher für eine Spinnerei für irgendwelche Forscher
gehalten, die nix anderes machen als sowas. Ist sowas eigentlich schon im
simpelsten Stil unter Delphi realisierbar?
Das einzige neuronale Netz was mir jetzt spontan einfällt, sind die
persönlich
angepassten Menus von Micro$oft Office etc.
mfg
Michael
> Ist sowas eigentlich schon im simpelsten Stil unter Delphi realisierbar?
Neuronale Netze? Klar, das ist wirklich simpel.
Ob im vorliegenden Fall etwas sinnvolles dabei rauskommen könnte, weiß ich
nicht. Die Dinger tendieren dazu ein Eigenleben zu entwickeln sobald man
ihnen ernsthafte Dinge antrainieren will - und daran kann man dann auch gar
nichts ändern, ein neuronales Netz debuggt man nicht :-).
> Das einzige neuronale Netz was mir jetzt spontan einfällt, sind die
> persönlich angepassten Menus von Micro$oft Office etc.
Es würde mich schwer wundern, wenn dahinter mehr stecken würde als ein
einfaches "seit mehr als n Stunden/Tagen/Klicks nicht benutzt. Weg damit.".
"Marian Aldenhoevel" <mar...@mba-software.de> schrieb:
...
> Eine unabhängige Herausforderung bestünde jetzt darin statt einer
> klassischen Bewertungsfunktion eine selbstlernende zu schreiben. Zum
> Beispiel ein neuronales Netz. Das könntest Du mit automatisch erzeugten
> Partien trainieren...
Für "4 gewinnt"? Da reicht bei den heutigen Rechner dröges
Alpha-Beta-Pruning, um wahrscheinlich schon für den ersten Zug das
Endergebnis herauszubekommen.
Bye, Ralf
"Marian Aldenhoevel" <mar...@mba-software.de> schrieb:
...
> > Das einzige neuronale Netz was mir jetzt spontan einfällt, sind die
> > persönlich angepassten Menus von Micro$oft Office etc.
>
> Es würde mich schwer wundern, wenn dahinter mehr stecken würde als ein
> einfaches "seit mehr als n Stunden/Tagen/Klicks nicht benutzt. Weg
damit.".
Exakt. Irgendwo hat MS die Schwellenwerte dokumentiert, aber frag mich bitte
nicht wo :)
Bye, Ralf
"Pascal Lippmann" <pascal....@gmx.ch> schrieb im Newsbeitrag
news:a21l0m$u55of$1...@ID-85960.news.dfncis.de...
> Ich möchte mich sehr bei euch bedanken. Eine so heftige Beteiligung
> sieht man selten. Dank euch habe ich ein paar passende Informationen
> gefunden. Danke allen.
>[TOFU gelöscht]
Wie wär's wenn Du zum Dank dafür in Zuklunft die Vollzitate weglässt?
Bitte zitiere den Artikel, auf den Du antwortest, nicht komplett unter
Deinem eigenen Text.
1. Zitate gehören _über_ den eigenen Text, und zwar nur die Teile, auf die
man sich mit dem folgenden Text beziehen möchte.
2. Vollzitate ohne jeden Bezug sind unnötig.
3. Lies dazu bitte auch http://learn.to/quote
Danke.
Simon
--
Der Kopf ist rund, damit das Denken die Richtung wechseln kann.
Homepage: http://www.pics-software.de
Delphi Fundgrube: http://www.pics-software.de/faq.htm
> Für "4 gewinnt"?
Warum nicht? Je simpler das Problem, desto größer der Lerneffekt. Speziell
was NN angeht, darf man eh' nicht zuviel erwarten :-).
Cao, MM
> Mache ich... :-)
Haha, sehr witzig. Zunächst wußte ich erstmal gar nicht, was du meinst.
Ich hab mir mal die Reference besorgt und nun kann ich dir sagen: Zuviel
weglassen solltest du auch nicht...
--
rm -f /bin/laden
> rm -f /bin/laden
Prima Idee, Du solltest Dich als CIA-Berater bewerben.
> cannot remove /bin/laden
Und sie ist sogar etwa genauso effektiv wie alle bisherigen anderen
Maßnahmen, aber viel billiger.
Ciao, MM
> procedure TForm1.EndCardDrag(Sender: TObject; Button: TMouseButton;
> pile[x,y].onmousedown:=TForm1.BeginCardDrag;
> --> Inkompatible Typen: 'TMouseEvent' und 'Procedure'
der Programmierer der Komponente hat TMouseEvent benutzt. Das mußt du dann
ebenfalls tun.
Form1 = class (....... usw
....
public
MyCardsMouseEvent: TMouseEvent;
end;
Im Code:
for deck:=1 to decks do begin
for suit:=1 to 4 do begin
for card:=lowvalue to highvalue do begin
i:=((deck-1)*4*(highvalue-lowvalue+1))
+((suit-1)*(highvalue-lowvalue+1))
+(card-lowvalue)
+1;
shuffledeck[i]:=tcards.create(form1);
// die hier fügst du ein
shuffledeck[i].onmousedown := form1.MyCardsMouseEvent;
.... usw .....
DragDrop:
Ich könnte mir durchaus vorstellen, daß die DragEvents eine eigenen "Typ"
haben. Es macht meist Sinn, bei DragDrop-Events andere Parameter zu liefern,
als bspw. beim MouseDown. Finde heraus, wie der Typ für BeginCardDrag heißt.
Dann gehts wie mit OnMouseDown (PS.: nachfolgend nehme ich TDragEvent als
Beispiel; kenne die Komponente nicht).
Im Form: MyBeginnCardDragEvent: TDragEvent;
Im Code: shuffledeck[i].OnBeginCardDrag := form1.MyBeginCardDrag;
Hope it helps.
Grüße, Tomas
______________
<werbung>
www.camo-pfeiffer.de
www.germandevnet.de
www.dulzinea.de
</werbung>
>> pile[x,y].onmousedown:=TForm1.BeginCardDrag;
>> --> Inkompatible Typen: 'TMouseEvent' und 'Procedure'
>
>der Programmierer der Komponente hat TMouseEvent benutzt. Das mußt du
>dann ebenfalls tun.
>
>Form1 = class (....... usw
>....
>public
> MyCardsMouseEvent: TMouseEvent;
>end;
Keine gute Idee... Michael will ja eine Prozedur definieren, keinen weiteren
Prozedurpointer deklarieren.
Tillmann
>der Programmierer der Komponente hat TMouseEvent benutzt. Das mußt du dann
>ebenfalls tun.
Na huch?!
Spinnt mein Agent, oder wie kommt es, daß ich das hier nur zufällig
gelesen habe, weil es in einem völlig anderen Thread stand?
>Grüße, Tomas
Gruß, Michael
PS: Problem hat sich soeben erledigt, siehe mein Posting im 'originalen'
Thread. Danke für eure Hilfe!
/\/\ichael
--
// Michael Rittweger, Bothwellstr. 8, 24143 Kiel, +49-431-7209360
// 2:240/2120 @ fidonet, +49-431-7209361 (Mailer, FAX, BBS)
// <http://home.t-online.de/home/m.rittweger/>
> Neuronale Netze? Klar, das ist wirklich simpel.
Hast Du da detailiertere Infos drüber,
wo ich ein Beispiel für so ein Netz finde?
> Hast Du da detailiertere Infos drüber,
> wo ich ein Beispiel für so ein Netz finde?
Neuronale Netze im Allgemeinen?
Füttere eine Suchmaschine, ich bin sicher bei den ersten Versuchen gehst Du
in Treffern unter. Ich habe meine Spielereien auf dem Gebiet seinerzeit auf
gedruckte Literatur gegründet. Programme, die künstliche neuronale Netze
simulieren, sind wirklich sehr einfach gestrickt.
Ein Netz für Vier Gewinnt?
Nein, habe ich nicht. Ich hatte das auch nicht so ganz ernst gemeint, und
wenn ich mich recht erinnere waren wir uns später im Thread auch einig, daß
nicht viel dabei herauskommen kann. Es ging doch darum ein "Spielprojekt"
zu definieren, das nicht zu schwer aber auch nicht zu langweilig ist.
Ciao, MM
--
Marian Aldenhövel, Hainstraße 8, 53121 Bonn
Mein Flug um die Welt (aktuelle Position: La Paz)
http://www.marian-aldenhoevel.de/ATW
Marian Aldenhoevel schrieb:
>Ein Netz für Vier Gewinnt?
>
>Nein, habe ich nicht. Ich hatte das auch nicht so ganz ernst gemeint, und
>wenn ich mich recht erinnere waren wir uns später im Thread auch einig, daß
>nicht viel dabei herauskommen kann. Es ging doch darum ein "Spielprojekt"
>zu definieren, das nicht zu schwer aber auch nicht zu langweilig ist.
NN sind hier meiner Meinung nach nicht der richtige Ansatz oder
zumindest nicht der einfachere.
Ich habe 4Gewinnt in Delphi programmiert und nun verliere ich ständig
gegen mein eigenes Programm...
Mal im ernst: Vier Gewinnt ist wie weiter oben schon gesagt ein gelöstes
Spiel: Wer anfangen darf, kann forciert gewinnen. Es gibt eine 8-Steiner
Datenbank, welche alle nicht-trivialen Positionen mit 8Steinen enthält
und die perfekte Bewertung (Gewinnen, Verloren, Remis) liefert. Die
Datenbank und ein paar Sekunden Rechenzeit reichen aus um bis zu einem
gewinnbringenden Vorteil oder gar zum Spielende zu rechnen.
Interessenten können unter:
http://www.bauer-schweitzer.de/four/index_four.html
vorbeischauen und das Freewarespiel runterladen.
Einige Schlagworte, nach denen man suchen sollte, wenn man an
Spielbaumprogrammierung interessiert ist:
- Min-Max Search
- AlphaBeta cutoff (evtl mit aspiration window)
- Iterative Deepening
- hashing, hashtabellen
- Nullmove (Bei 4Gewinnt vermutlich nicht so Sinnvoll)
- Quiescent Search usw.
Eine brauchbare Einführung zu den Begriffen gibt es unter:
http://www.seanet.com/~brucemo/topics/topics.htm
Dort wird alles am Beispiel Schach erläutert, sollte sich aber auch auf
andere Spiele übertragen lassen.
Weiter oben im Thread wurde empfohlen:
>Vielleicht hilft dir
>http://www.computerschach.de/minimax/index.htm
>ein bisschen weiter - ist zwar noch immer Schach, aber die Grundzüge
>sind bei nahezu jedem dieser zugorientierten Spiele gleich.
Dazu kann ich nur sagen, dass die Seite tot ist. Die haben vor Jahren
mir den Text 1:1 von meiner Seite geklaut und seither nichts mehr daran
geändert. Um der Mühe aus dem Weg zu gehen wird dann bei Fragen
letztendlich doch zu mir verwiesen. Aktuell betreut und weiterentwickelt
wir das Projekt MiniMAX in Delphi unter:
http://www.bauer-schweitzer.de/minimax/minimax.html
Das Ganze ist ein einfach und übersichtlich gehaltenes Schachprogramm,
welches ich nach Delphi übersetzt habe. Der Quellcode steht zum Download
bereit. Die Suchtechniken habe ich dann auch für mein "Four or more"
verwendet. Das Schachprogramm wurde mittlerweile um Hashtabellen und
Nullmove erweitert.
Bei Fragen zu den verwendeten Algorithmen kann man sich an des
Diskussionsforum wenden.
Leider habe ich den Anfang vom Thrad verschlafen, deshalb kam diese
Antwort erst hier, obwohl sie weiter oben besse aufgehoben wäre.
Gruß
Martin
> NN sind hier meiner Meinung nach nicht der richtige Ansatz oder
> zumindest nicht der einfachere.
Ich teile diese Meinung.
> Leider habe ich den Anfang vom Thrad verschlafen
Der ist Asbach. Sollte dennoch Interesse bestehen findet man bei Google
was. Aber die Implementation einer Strategie für den Computerspieler war da
nur ganz am Rande Thema.