2012-03-23 6 views
3

Ich überarbeite eine Schach-Engine, die ich geschrieben habe, um auf magischen Bitboards zu laufen. Ich habe die magischen Funktionen geschrieben und sie nehmen ein Quadrat des Stückes und ein Belegungs-Bitboard als Parameter. Was ich mit mir selbst debattiere, ist, welches dieser Brettdarstellungsschemas schneller/praktischer ist:Was ist die praktischste Board-Darstellung für ein magisches Bitboard-Move-Generierungssystem?

Schema 1: Es gibt eine Tafel für jeden Typ von Stück, 1 für weiße Ritter, 1 für schwarze Türme. . . und um Bewegungen zu erzeugen und sie zum Verschiebungsstapel zu schieben, muss ich sie serialisieren, um das Quadrat des Stücks zu finden, und dann die magische Funktion aufrufen. Dann muss ich das Bitboard verschieben und schieben. Der Vorteil ist, dass die Angriffs- und Belegungs-Bitboards näher zur Hand sind.

Schema 2: Eine einfache Stück zentrische Array [2] [16] oder [32] enthält die quadratischen Indizes der Stücke. Ein einfacher Durchlauf und Aufruf der Funktionen genügt, um die Bitboards zu verschieben. Ich serialisiere dann diese Bitboards und schiebe sie zum Verschiebe-Stapel. Ich muss auch ein Belegungsbotboard führen. Ich denke, ein Angriffs-Bitboard sollte nicht anders sein: Ich muss noch einmal alle Move-Bitboards erzeugen, und statt sie zu serialisieren, betreibe ich sie bitweise in einem magischen Mashup.

Ich lehne mich zu Schema 2, aber aus irgendeinem Grund denke ich, es gibt eine Art von Implementierung ähnlich wie Schema 1, das Standard ist. Aus irgendeinem Grund kann ich keine Nachteile einer Bitboard-Engine finden, ohne Bitboards zu verwenden. Ich würde nicht mal Bitboards für King- und Knight-Daten verwenden, nur eine schnelle Array-Suche.

Ich denke, meine Frage ist mehr, ob es eine bessere Möglichkeit gibt, diese Brettdarstellung zu machen, weil ich mich erinnere, dass das Halten eines Bitboards für jeden Typ Standard ist (vielleicht ist das nur mit gedrehten Bitboards notwendig?). Ich bin relativ neu bei Bitboard-Engines, aber ich habe viel gelesen und die magische Methode implementiert. Ich mag sicherlich den Ansatz der stückzentrischen Anordnung - es macht eine Menge von willkürlichen Dingen wie das Drucken des Brettes auf den Bildschirm einfacher, aber wenn es einen besseren/gleichen/mehr Standard Weg gibt, kann jemand bitte darauf hinweisen? Vielen Dank im Voraus - ich weiß, dass dies eine ziemlich spezifische Frage ist und schwer zu beantworten, es sei denn, Sie sind mit der Schachprogrammierung sehr vertraut.

Last-Minute-Frage: Wie ist die Geschwindigkeit eines Nachschlagens in einem 2D-Array bis zur Verwendung eines 1D-Arrays und Hinzufügen von 16 * team_side zum normalen Index, um das Stück zu suchen?

bearbeiten: Ich dachte, ich sollte hinzufügen, dass ich Geschwindigkeit über fast alles andere in meiner Schachimplementierung wertschätze. Warum sonst würde ich mit magischen Bitboards gehen, im Gegensatz zu einfachen Arrays mit Slide-Daten?

Antwort

1

Es gibt keine Standardantwort, sorry.

Die Anzahl und Arten von Datenstrukturen, die Sie benötigen, hängt davon ab, genau was Sie in Ihrem Programm tun möchten. Wenn Sie zum Beispiel mehr als eine Darstellung der Teile auf dem Board haben, werden einige Operationen schneller. Auf der anderen Seite dauert es länger, Ihre Daten während jeder Bewegung zu aktualisieren.

Um die maximale Geschwindigkeit zu erhalten, ist es Ihre Aufgabe herauszufinden, was am besten für Ihr Programm funktioniert. Führt die Pflege einer zusätzlichen Reihe von Teilen zu einer Netto-Beschleunigung für ein Programm? Es kommt darauf an!

Manchmal ist es ein Nettogewinn, um eine Datenstruktur zu erhalten, manchmal können Sie die Berechnungen verzögern und das Ergebnis zwischenspeichern, und manchmal berechnen Sie es nur bei Bedarf (und hoffen, dass es nicht sehr oft benötigt wird).