UCI Computerschach Engine



  • Ich entwickle seit vielen Monaten neben der Arbeit eine Schachengine für 32-Bit und 64-Bit Systeme in C++.

    Die UCI-Engine spielt auch bereits ganz schönes Schach und ist von Grund auf neu entwickelt.

    Jetzt suche ich einen C++ Entwickler, der Interesse hätte sich diesem Freizeitprojekt anzuschließen (zB GitHub).

    Die Voraussetzung wären gute Kenntnisse in C++ (STL, BOOST, C++11, Multithreading, etc.), eine saubere Arbeitsweise und viel Freude an einem spannenden Projekt 😋

    Ist auf jeden Fall eine tolle Beschäftigung für die langen Winterabende...



  • wie gut ist die engine? 🙂



  • Dieser Thread wurde von Moderator/in rapso aus dem Forum Spiele-/Grafikprogrammierung in das Forum Projekte verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • rapso schrieb:

    wie gut ist die engine? 🙂

    Hallo!

    Aktuell sollte die Engine bei etwa 2300 Elo spielen.

    Bisher implementiert:

    • Board: GenCaptures, GenNonCaptures, GenEvasions, GenChecks, SEE
    • Pawn-King-Tables: Hashing, einfache Evaluation
    • Material-Tables: Hashing, einfache Evaluation
    • Transposition-Tables
    • History-Tables
    • Evaluation mit den meisten Interfaces, aber noch sehr einfach
    • Search: RootSearch, Search mit Nullmoves, QSearch, ohne Heuristiken
    • Move-List: Zugeselektion via TT-Move, SEE, MVV-LVA, History-Tables
    • UCI-Protokoll (nicht vollständig)
    • Perft
    • Interface für Endgame Evaluation

    Es gibt also in der Suche und der Evaluation, sowie Endspiel noch sehr viel zu tun. Es ist sicher nicht sehr schwer einige 100 Hundert in kurzer Zeit herauszuprogrammieren (Futility-Pruning, History-Pruning, LMR, King-Safety-Evaluation, etc.). Spielstärke ist aber derzeit noch nicht das primäre Ziel. Erstmal ist noch viel Grundlagenarbeit nötig.

    Wer sich das zutraut und einen sauberen Programmierstil (cpplint von Google) hat, kann gern mitmachen.

    Viele Grüße



  • Eine Ergänzung zu den bisher verwendeten Tools, Hilfsmitteln und Styleguides:

    Weitere Tools zur Verbesserung der Codequalität sind jederzeit willkommen!

    Die Engine wurde von Beginn an plattforumunabhängig entwickelt und sollte es auch bleiben (Windows, Android, etc.). Spezielle Branches sind natürlich kein Problem.

    Die Engine wird nach dem KISS Prinzip entwickelt 🙂

    http://de.wikipedia.org/wiki/KISS-Prinzip



  • Ich frage mich gerade, Schach sollte doch in einer Art Baum evaluiert werden, oder? Ob man das wohl auf die Grafikkarte schieben könnte...



  • Ja, wobei Speicher wohl das groessere Problem ist.



  • cooky451 schrieb:

    Ich frage mich gerade, Schach sollte doch in einer Art Baum evaluiert werden, oder? Ob man das wohl auf die Grafikkarte schieben könnte...

    Meines Wissens gibt es bereits Ansätze, die Baumsuche auf der Grafikkarte zu parallelisieren. Bisher aber mit wenig Erfolg. Selbst die Parallelisierung auf die Kerne der CPU will nicht so richtig gut gelingen. Nach meinem Wissen skalieren Schachengines mit wachsender Zahl Rechenkerne immer schlechter.

    2 Kerne -> ~1.8x schneller als sequentielle Baumsuche
    4 Kerne -> ~3.2x schneller - " -
    8 Kerne -> ~5.0x schneller - " -
    etc.

    An die Quelle kann ich mich jetzt leider nicht mehr erinnern.



  • knivil schrieb:

    Ja, wobei Speicher wohl das groessere Problem ist.

    Ja, die Hashtabellen (Transpositionstabellen) benötigen Einiges. Aber das ist recht unabhängig von der Parallelisierung auf der CPU. Zur Grafikkarte kann ich leider nichts sagen.



  • Ich habe bereits eine Engine unter C++ entwickelt, die unter ARENA recht gut spielt.
    Zur Zeit interessiert mich C# und ich würde gerne meinen Quellcode anpassen.
    Leider funktioniert die Kommunikation nicht.

    In C++ habe ich folgendes:
    setbuf(stdout, NULL);
    setbuf(stdin, NULL);
    while(1) GetUciCommand();
    return 0;

    void GetUciCommand(void)
    {
    if(fgets(Command, 4096, stdin) == NULL)
    strcpy(Command, "quit\n");
    HandleCommand(Command);
    }

    void HandleCommand(char* command)
    {
    if(strncmp(command, "ucinewgame", 10) == 0)
    return;
    else if(strncmp(command, "uci", 3) == 0)
    UciStart();
    else if(strncmp(command, "isready", 7) == 0)
    puts("readyok\n");
    else if(strncmp(command, "position", 😎 == 0)
    UciSetPosition(command + 9);
    else if(strncmp(command, "quit", 4) == 0)
    UciQuit();
    else if(strncmp(command, "go", 2) == 0)
    UciGo(command + 3);
    else if(strncmp(command, "setoption name", 14) == 0)
    UciSetOption(command + 15);
    else if(strncmp(command, "test",4)==0)
    {
    UciSetPosition("");
    //UciGo("go movetime 20000");
    UciGo("go depth 8");
    }
    }

    Kann jemand helfen???????



  • Hallo Tomahawk,

    ich habe Interesse, mitzuwirken. Schreib mir doch über mein Profil eine E-Mail.

    Edit: Ich würde unter anderem Sachen aus http://chessprogramming.wikispaces.com/Search und http://chessprogramming.wikispaces.com/Evaluation einfügen wollen.


Anmelden zum Antworten