Wenn Sie eine Schachspiel-Engine schreiben würden, welches Programmierparadigma würden Sie verwenden (OOP, Prozedur usw.) und warum sollten Sie es wählen? Mit Schach-Engine meine ich den Teil eines Programms, der das aktuelle Board auswertet und über den nächsten Zug des Computers entscheidet.
Ich frage, weil ich dachte, es könnte Spaß machen, eine Schachmaschine zu schreiben. Dann kam mir der Gedanke, dass ich es als Projekt zum Erlernen der funktionalen Programmierung verwenden könnte. Dann kam mir der Gedanke, dass einige Probleme für das Funktionsparadigma nicht gut geeignet sind. Dann kam mir der Gedanke, dass dies ein gutes Diskussionsfutter sein könnte.
Antworten:
Die Evaluierung ist meines Wissens kein parallelisierbares Problem, aber die Evaluierung verschiedener Ketten ist es. Daher würde ich sie definitiv schreiben, um mehrere Kerne und Multithreading zu verwenden.
Ob Sie funktional oder semi-funktional gehen, ist Geschmackssache. Persönlich würde ich OOP gehen und die Unterstützung für funktionale Programmierung und Parallelisierung verwenden, die zum Beispiel in C # existiert
Wenn ich eine Schachengine schreiben würde, würde ich versuchen, eine zu entwickeln, die wirklich über Schach "nachdenken" kann. Die Verwendung der Board-Bewertung, um alle möglichen Kombinationen brutal zu erzwingen, wurde zu Tode und sehr gut durchgeführt, aber es wurden keine großen Fortschritte bei der Entwicklung einer Denk- / Fuzzy-Schach-Engine erzielt. Das wäre eine Herausforderung! :) :)
Finden Sie einige Spiele mit wirklich kniffligem Positionsspiel und starken Bewegungen (sie sind markiert! Oder !!) und verwenden Sie sie, um Ihren Motor zu trainieren und zu testen.
quelle
Ich denke, es hängt von Ihren Zielen ab, die ich als streng didaktisch betrachte. Wenn Sie versuchen, ein wettbewerbsfähiges Produkt zu schreiben, möchten Sie maximale Effizienz bei den Evaluatoren der niedrigsten Ebene. Hier gibt es viele Möglichkeiten für Parallelität auf Bitebene. Auch viele Möglichkeiten für Hash-Tabellen. Auch Möglichkeiten, Parallelität zu nutzen. Dann möchten Sie auf den höheren Ebenen wahrscheinlich ein System, das gut für die KI ist, was wahrscheinlich eine funktionale Programmiersprache bedeutet. Offensichtlich möchten Sie nicht alle diese Dinge tun, ein oder zwei davon auswählen und sich damit zufrieden geben, dass Ihr Projekt nicht mit den besseren Programmen konkurrieren kann.
quelle
Ich habe das OOP-Paradigma in meiner Schach-Engine namens The Turk gewählt . Die erste Version meiner Schach-Engine wurde eher prozedural als OOP geschrieben. Dann fiel es mir aufgrund langer Codeblöcke und schlechten Designs so schwer, meine Schach-Engine zu verbessern.
Dies hängt davon ab, was Sie beim Schreiben der Schachengine erreichen möchten. Wenn Sie eine Schachengine erstellen möchten, die zu stark ist, ist dies in OOP-Sprachen aufgrund langsamer, später Bindungen sogar nicht möglich. Wenn Sie nur Programmieren lernen und Spaß haben möchten, indem Sie eine Schachengine schreiben, werden verwaltete Sprachen und OOP Ihr Freund sein. Ich kann Ihnen vorschlagen, C # zu wählen, da es auch möglich ist, eine Schach-Engine prozeduraler damit zu schreiben.
quelle
Ich habe ein einfaches Schachprogramm portiert, um die Forth-Sprache zu lernen. Es stellte sich heraus, dass es sehr gut zu diesem sehr wichtigen Problem passt, und ich habe viel gelernt. Der offene Stapel ermöglichte es mir, die Alpha-Beta-Suche auf einzigartige Weise zu implementieren, wodurch ich einen besseren Einblick in den Algorithmus erhielt.
Man würde denken, dass funktionale Programmierung für Schachprogramme großartig wäre, da die Kernalgorithmen (Alpha-Beta-Tiefensuche, Auswertung) rekursiv und funktional streng sind. Ein Schachprogramm lebt und stirbt jedoch von Effizienz und keine der aktuellen funktionalen Sprachen hat dieses Ziel. Die Top-100-Engines auf dem neuesten Stand der Technik verwenden alle zwingende Sprachen (hauptsächlich C / C ++, dann Delphi), um maximale Kontrolle über die Speichernutzung, Multithreading, den globalen Status und die Codegenerierung zu haben. Alle funktionalen Sprachen verwenden die dynamische Speicherzuweisung für Kerndatenstrukturen, was für ein Schachprogramm der Tod ist.
Ich würde immer noch gerne sehen, wie jemand versucht, mit einer funktionalen Sprache in die Top 100 der Schach-Engines einzudringen.
quelle