Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

18.05.2012, 11:15

breadth-first search Umsetzung

Hallo!

Ich schreibe derzeit eine kleine Schach Engine (C++/SQL). Leider hängt es bei mir zur Zeit an der Breitensuche. Inzwischen macht sich mir der Verdacht nahe, dass ich einen Denkfehler habe in der Umsetzung der Breitensuche. Vielleicht hat von euch einer eine Idee?

Folgendermaßen gehe ich vor:

1. Ich habe eine Startstellung
2. Aus dieser Stellung generiere ich alle möglichen Züge
3. Aus den generierten Züge entstehen neue Stellung, die ich gleich einer Stellungsbewertung unterziehe

Die neuen Stellungen mit Bewertung, Suchtiefe und den anziehenden-Zug (erster Zug mit dem eine Variante berechnet wird) speichere ich in eine Liste. Jede Stellung bekommt eine fortlaufende Id.

4. Ich nehme nun die Stellung mit der nächsten Id, generiere wieder alle möglichen Züge
5. Ebenfalls füge ich den neuen Stellungen gleich wieder die Stellungsbewertung hinzu.

Schritte 4. und 5. wiederholen sich, bis die Stellungsid auch eine Suchtiefe von X erreicht hat.

Nun bin ich der Annahme gewesen, das die Stellung, mit der höchsten Suchtiefe und der höchsten Wertungszahl (bzw. der niedrigsten Wertungszahl wenn Schwarz am Zug ist), auch der beste Zug von Weiß ist.

Tatsächlich aber spielt das Programm nur harrakiri. Es Opfert z. B. die eigene Dame fröhlich für einen Springer. Grundsätzlich wird der wertvollste Stein geopfert.
Bei meiner Untersuchungen stellte ich dann fest, dass das Programm stellungsmäßig zwar sieht, dass die Dame wieder zurück genommen werden kann, entscheidet sich aber für eine andere Fortsetzung für Schwarz - und somit ist der Opferzug der beste Zug geworden (ganz gleich wie tief ich rechnen lasse). Doch sollte er auch den besten Zug für Schwarz wählen und auch die Dame nehmen.

Ich dachte, bei meiner Liste bräuchte ich nur die höchste bzw. niedrigste Wertungszahl nehmen. Dem scheint aber nicht so.

Wo liegt mein Denkfehler??

Die Liste hat übrigens folgends Muster:
[anziehender Zug (erster Zug einer Variante)] [id (fortlaufend)] [wertung] [stellung] [suchtiefe]

Diese Liste Sortiere ich einfach 1. die höchste Suchtiefe nach oben 2. die höchste Wertung nach oben

Experementiert habe ich auch mit weiteren Spalten, dass er pro anziehenden Zug die wertungen summieren soll, er den höchsten kleinste wertungszahl nehmen soll.... nur experementieren ist nicht nachdenken ;)
Zeitweiße dachte ich auch, dass ich nur die neue Stellung mit der "alten" Stellung vergleichen muss, und mir diejenige Wertungszahl merken muss, die besser ist. Aber das brachte auch keine Besserung. Ich habe nun auch meine Breitensuche aufgemalt,....

Würde mich freuen, falls das jemand nachvollziehen kann! Wie muss ich richtig vorgehen?

Lg,
Stefan