Suche Ratschläge für Schachengine



  • Hi, ich schreibe gerade mit dem UCI-Protokoll eine Schachengine (das ist dann nur die 'KI').

    Ich habe die komplette Komonikation mit Fritz gemanaged und nun bin ich an eine stelle gestossen an der ich mich nicht entscheiden kann wie ich vorgehen soll.

    Ich möchte möglichst effectiv und schnell die Züge berechnen (ist ja klar).

    Jetzt habe ich zwei Möglichkeiten:

    1. Entweder ich benutze ein Byte Array mit 64 Einträgen dann kann ich dort dass komplette Feld speichern und jeden Durchgang die einzelnen Felder Testen und dann für alle möglichen Züge neue Äste im Baum erstellen und für diese neue Position die Stellung bewerten.

    Vorteile: Die zugberechnung ist (glaube ich) leichter und es braucht etwas weniger Speicher.
    Nachteil: Dadurch das ich nicht fürs ganze Feld Bitfunktionen nutzen kann ist die Stellungsbewertung relativ lang.

    2. Ich benutze zur repräsentierung des Feldes 8 x __int64 für Weisse/Scharze Figuren, Bauer, Turm, Springer, Läufer, Dame, König. Mit diesen ist es glaube ich relativ schwer die möglichen züge zu errechnen da ich ja immer schauen muss weches Bit (bei den Figuren) gesetzt ist. Dabei kommt noch hinzu das ich jedes Bit testen muss da ich ja mehr als 2 Figuren eines Typs haben kann (Bauer ereicht gegnerische Grundlinie). Dafür ist die Stellungsbewertung sehr einfach durch die Bitfunktionen (weclhes Feld ist angegriffen etc..).

    Vorteile: Schnell Stellungsbewertung
    Nachteile: Langsame Zugberechnung und mehr Speicherplatz.

    So nun kann ich mich nicht entscheiden der Speicherpltz der Positionen ist an sich ja auch recht wichtig da ich ja viel mehr nodes in dem Ram bekomme wenn die Stukturen schön klein sind.

    Jetzt was würdet ihr machen 1 oder zwei oder was ganz anderes? Gibt es ASM hacks die das vieleicht zu vorteil einer Seite ausgehen lassen?

    ICh schreibe das hier da ich mit diesem Projekt (gerade bei der Zugberrechnung die ja sehr schnell sein sollte) mein ASM verbessern möchte.

    Gibt es vieleicht bei SSE oder so schaen die ich ausnutzen könnte?

    Schreibt einfach mal was ihr davon haltet, darüber würde ich mich sehr freuen.

    Danke



  • Hi.

    Ehrlichgesagt kann ich mir unter deinen 2 Programmierstrategien (vor allem die 2. 😃 ) nicht wirklich viel vorstellen. 🙄

    Aber als Tipp: Warum nimmst du nicht ein Array von 32Byte (=> 4Bit Pro Feld), um das Spielfeld darzustellen.
    Da ist das Handling noch ziemlich ueberschaubar und du hast gegenueber 64Byte schonmal die Haelfte an Speicher gespart.
    Ich weiss ja nun nicht, wie weit du mit deiner KI in die Tiefe gehen willst, aber um zB. 1MB vollzukriegen braeuchtest du bei 32Byte/Feld schon immerhin 32768 Kopien vom Spielfeld... Das sollte bei heutzutage ueblichen 512MB noch zu verschmerzen sein, denke ich. 😉


Anmelden zum Antworten