Autor Beitrag
fuulf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Di 13.04.10 00:46 
Hallo,
wenn man ein Schachprogramm mit unoptimierter Alpha-Beta-Suche schreibt und zum Ausrechnen beim Spielstart bei einer Tiefe von 6 Zügen (also 3 Spielzüge vom Spieler und 3 Züge vom Gegenspieler werden im Suchbaum berücksichtig) mit einem AMD Phenom(tm) 9650 Quad-Core Processor 2.30 GHz knappe 2 Minuten benötigt werden, stimmt dann was mit der Implementierung nicht, oder ist das normal, dass das so lange dauert?


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 13.04.2010 um 09:58
Thorsten83
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 191
Erhaltene Danke: 1



BeitragVerfasst: Di 13.04.10 14:20 
Hi,

hast du mal mitgezählt, wie viele Stellungen bewertet werden?
Ich würde mal darauf tippen dass die Implementierung ziemlich langsam ist, wie repräsentierst du das Spielbrett, wie generierst du Züge?

Ein beliebter Fehler ist auch
ausblenden Quelltext
1:
if(alpha > beta) ...					

statt
ausblenden Quelltext
1:
if(alpha >= beta) ...					
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Di 13.04.10 14:36 
Sagen wir mal so: mein Ansatz war ähnlich langsam (eher noch lahmer), als ich mal damit rumgespielt habe.

Man darf also annehmen, dass die erstbeste naive Implementation immer so lahm ist ;)

Langsam war damals vor allem die Zuggenerierung, die Bewertung war (obwohl ich das anders vermutet hatte) nicht so das Problem.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Di 13.04.10 18:14 
hi :)

Also erstmal musst du natürlich vom Quadcore nur den einen Core rechnen. 8)

Wenn du magst, kannst du den Quelltext hier mal hochladen. Ich habe selber mal ein Schachprogramm geschrieben und mich deshalb mit Optimierungen für aß beschäftigt - bin aber nur bis zur IDE gekommen, bis ich herausgefunden habe, dass man starke Schach-Engines kostenlos herunterladen und per Protokoll im Programm verwenden kann(Rybka, etc.). Wie viel diese Optimierungen ausmachen, würde mich mal interessieren: Rybka2.2 x64(Multithreading) schafft bei mir auf i5 Quad @2.67GHz folgendes:

ausblenden Analyse der Startstellung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
FEN: rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 

Rybka 2.2 64 bit:
   2  00:00           442  452.608  +0,05  Sb1c3
   3  00:00           648  663.552  +0,15  Sb1c3
   4  00:00         1.032  1.056.768  +0,13  Sb1c3
   5  00:00         2.042  130.688  +0,05  Sb1c3 Sb8c6
   6  00:00         3.885  248.640  +0,05  Sb1c3 Sb8c6 Sg1f3
   7  00:00        10.588  230.683  +0,08  Sb1c3 Sb8c6 Sg1f3 Sg8f6
   8  00:00        19.785  256.453  +0,04  Sb1c3 Sg8f6 Sg1f3 e7e6 d2d4
   9  00:00        29.643  242.835  +0,08  Sb1c3 Sg8f6 Sg1f3 Sb8c6 d2d4 e7e6
  10  00:00        56.477  246.095  +0,09  Sb1c3 Sg8f6 Sg1f3 Sb8c6 d2d4 e7e6 d4d5
  11  00:01       256.119  270.935  +0,06  Sb1c3 d7d5 e2e3 Sg8f6 Lf1b5+ Lc8d7 Sg1f3 Ld7xb5 Sc3xb5 a7a6
  11  00:01       274.464  264.892  +0,11  e2e4 Sb8c6 Sg1f3 Sg8f6 Sb1c3 d7d5 e4xd5 Sf6xd5 Lf1c4 Lc8e6
  12  00:01       316.418  262.783  +0,05  e2e4 Sb8c6 Sg1f3 Sg8f6 Sb1c3 e7e5 Lf1c4 Lf8c5 00
  13  00:02       615.665  288.531  +0,04  e2e4 Sb8c6 Sg1f3 e7e5 Sb1c3 Sg8f6 Lf1c4 Lf8c5 00 00
  14  00:03     1.075.407  328.231  +0,05  e2e4 Sb8c6 Sg1f3 e7e5 Sb1c3 Sg8f6 Lf1c4 Lf8c5 00 00 d2d3
  15  00:07     3.122.431  411.554  +0,04  e2e4 e7e5 Sb1c3 Sg8f6 Sg1f3 Sb8c6 Lf1c4 Lf8c5 00 00 d2d3 d7d6
  15  00:10     4.437.541  429.615  +0,10  Sb1c3 Sg8f6 Sg1f3 Sb8c6 d2d4 d7d5 g2g3 Lc8f5 Sf3h4 Lf5g4 Lf1g2 e7e6
  16  00:16     7.573.981  485.980  +0,05  Sb1c3 Sg8f6 Sg1f3 Sb8c6 d2d4 d7d5 g2g3 g7g6 Lf1g2 Lf8g7 00 00 Sf3e5
  17  00:24    12.955.941  531.845  +0,06  Sb1c3 Sg8f6 Sg1f3 Sb8c6 d2d4 d7d5 g2g3 g7g6 Lc1f4 Sf6h5 Lf4g5 Lf8g7 Lf1g2 00
  18  00:52    27.605.229  538.330  +0,07  Sb1c3 Sg8f6 Sg1f3 Sb8c6 d2d4 d7d5 g2g3 g7g6 Sf3e5 Lf8g7 Lf1g2 00 00 Lc8f5
  19  01:27    49.376.177  575.572  +0,05  Sb1c3 Sg8f6 Sg1f3 Sb8c6 d2d4 d7d5 Lc1f4 Sf6h5 Lf4e3 g7g6 g2g3 Lf8g7 Lf1g2 00
  19  02:46    91.393.909  562.559  +0,05  e2e4 e7e5 Sb1c3 Sg8f6 Sg1f3 Sb8c6 Lf1b5 Lf8c5 Sf3xe5 Sc6xe5 d2d4 a7a6 Lb5a4 Lc5d6
  20  06:07   208.831.786  582.049  +0,07  e2e4 e7e5 Sg1f3 Sb8c6 Sb1c3 Sg8f6 Lf1b5 Lf8c5 00 00 Sf3xe5 Sc6xe5 d2d4 Lc5d6


lg,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
fuulf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Mi 14.04.10 19:15 
Hallo,

ich würde den Quelltext eigentlich gerne einstellen, aber wenn es gut läuft will ich es vielleicht noch als Schulleistung verticken (notenmäßig) und wenn das dann schon vorher online war, wird einem dann ja manchmal vorgeworfen, man hätte es einfach nur von jemandem aus dem Internet kopiert.

Optimierung ist natürlich wichtig, aber ich denke am wichtigsten ist zunächst mal, dass es sich wirklich um eine korrekte Alpha-Beta-Suche handelt.

Ich hab mal ausgewertet, wieviele Bewertungen durchgefüht werden. Es handelt sich um die Startstellung und es wird der Zug für den Spieler unten mit den weißen Figuren ausgerechnet. Die Suchtiefe gibt die Anzahl der berücksichtigten (Halb-)zügen an. So werden beispielsweiße bei einer Suchtiefe = 3 der Zug von Weiß, der Gegenzug von Schwarz und der darauffolgende Gegenzug von Weiß in den Spielbaum aufgenommen. "MiniMax-Wert" steht für den Zahlenwert, der am Ende gefunden wurde. Dabei ist aus Sicht des Spielers Weiß der Zug umso besser, je größer der Wert. Eine Einheit steht für einen zu erwartenden Materialvorteil von einem Bauern.


Hier die Auswertung:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
Suchtiefe | Bewertungen | Cutoffs | Alpha-Cutoffs | Beta-Cutoffs | MiniMax-Wert
1         | 20          | 0       | 0             | 0            | 0
2         | 514         | 19      | 19            | 0            | -9
3         | 2103        | 149     | 19            | 130          | -5
4         | 70711       | 2483    | 2241          | 242          | -14
5         | 574992      | 118320  | 2467          | 115853       | -9
6         | 27959133    | 679119  | 598632        | 80487        | -13



Gibt es dafür eigentlich eine offizielle Tabelle, wie es richtig sein müsste?

Könnte das überhaupt sein, dass der MiniMax-Wert selbst bei ungerader Suchtiefe negativ ist? Und dass es bei einer Suchtiefe von 6 weniger Beta-Cutoffs als bei der Suchtiefe 5 gibt?
Thorsten83
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 191
Erhaltene Danke: 1



BeitragVerfasst: Mi 14.04.10 22:25 
Hey,

da stimmt irgendwas überhaupt nicht...

Mit 2 Halbzügen kann der Gegner ja auf jeden der 20 Züge von Weiß mit 20 Gegenzügen reagieren, daher sollte der komplette Spielbaum nur 400 Blätter haben...

Eine Tabelle kann's nicht geben, da die Anzahl der Stellungsbewertungen davon abhängt, wie die Züge sortiert und auch bewertet werden.

Als Größenordnung: Ein Alphabeta mit perfekter Zugsortierung braucht 2*b^(d/2)-1 Stellungsbewertungen für eine Suche mit gerader Suchtiefe d, wenn jeder der Spieler IMMER b Züge zur Auswahl hat.
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 378
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Di 20.04.10 22:23 
Hi,

der alpha-beta-Algorithmus ist verzwickter als er gelegentlich in der Literatur dargestellt wird. Ich hatte das einmal an der übersichlichen Situation "1r5q/1p5b/8/8/4n3/4R3/8/4R2R w - - 0 1" untersucht. Näheres anbei, vielleicht hilft es.

Gruß Guenther
Einloggen, um Attachments anzusehen!
JoelH
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 806
Erhaltene Danke: 17

Win10
Delphi Alexandria 11.2 Patch 1
BeitragVerfasst: Sa 19.06.10 11:43 
user profile iconfuulf hat folgendes geschrieben:

Könnte das überhaupt sein, dass der MiniMax-Wert selbst bei ungerader Suchtiefe negativ ist? Und dass es bei einer Suchtiefe von 6 weniger Beta-Cutoffs als bei der Suchtiefe 5 gibt?


Die Antwort kommt vielleicht spät aber ich bastle auch gerade an einem Programm, ds diesen Algo verwendet, auch wenn es nicht Schach spielt, sondern ein spielerisches Eigengewächs.

Aber zu den Fragen,
Ja, das mit den negativen Werten kann schon sein, wenn eine Seite wirklich schlecht steht bringen auch gute Züge nur noch wenig. U

nd das mit dem Alpha/Beta-Cuttoff-Wechsel ist auch richtig, da ja immer für die "andere Seite" optimiert wird ergibt sich das so. Zumindest hab ich das mit den Alpha/Beta so verstanden.

Vielleicht eine Seite die dir bei der Programmierung helfen kann

chessprogramming.wikispaces.com/

_________________
mfg. Joel