#棋引擎 # #uci #人工智能 #ai #棋盘 #nnue

bin+lib timecat

一个基于NNUE的棋引擎,实现了Negamax算法,可以作为库集成到任何项目中。它具有走法生成、通过NNUE的高级位置评估和走法搜索功能。

134个稳定版本

1.33.8 2024年8月24日
1.33.7 2024年8月21日
1.31.1 2024年7月29日
1.25.1 2024年6月30日
0.1.0 2024年5月24日

38游戏开发

Download history • Rust 包仓库 195/week @ 2024-05-18 • Rust 包仓库 1932/week @ 2024-05-25 • Rust 包仓库 249/week @ 2024-06-01 • Rust 包仓库 1681/week @ 2024-06-08 • Rust 包仓库 3999/week @ 2024-06-15 • Rust 包仓库 1820/week @ 2024-06-22 • Rust 包仓库 1149/week @ 2024-06-29 • Rust 包仓库 1612/week @ 2024-07-06 • Rust 包仓库 736/week @ 2024-07-13 • Rust 包仓库 543/week @ 2024-07-20 • Rust 包仓库 1145/week @ 2024-07-27 • Rust 包仓库 449/week @ 2024-08-03 • Rust 包仓库 364/week @ 2024-08-10 • Rust 包仓库 319/week @ 2024-08-17 • Rust 包仓库

每月2,288次下载

自定义许可

5.5MB
235K SLoC

Timecat 棋引擎

Timecat 是一个用Rust编写的UCI兼容棋引擎,它结合了强大的算法和高级评估技术,以提供顶级的棋分析和游戏体验。通过使用alpha-beta剪枝和negamax算法以及NNUE评估方法,Timecat在游戏分析中实现了更深的深度和更高的精度。

Timecat 作为库

Timecat最初是一个个人项目。然而,随着一个新的与棋相关的项目的开始,我意识到将Timecat发布为库以避免过度代码复制的优势。最初为个人使用而设计,Timecat现在将经过改进和更新,以提高其作为库的功能性和可用性,使其更易于其他用户访问并受益。同时,文档也将得到进一步改进。

主要功能

  • UCI兼容性:完全兼容通用棋接口(UCI)标准。
  • 高级算法:利用alpha-beta剪枝和negamax算法进行高效的走法搜索。
  • NNUE评估:采用NNUE(高效可更新的神经网络)进行最先进的位置评估。
  • 可定制构建:支持通过可配置的cargo功能进行定制构建。

棋库集成

最初,Timecat依赖于外部chess库,该库可在https://github.com/jordanbray/chess找到。为了更接近特定的要求,该库被直接集成到Timecat中。这种集成允许对功能进行重大修改和扩展,从而提高了引擎的整体能力。这种集成展示了致力于适应和改进工具以确保在棋分析中取得最佳性能和准确性的承诺。

用户控制

在库中,仅使用 pub 或非 pub 可见性修饰符(除非极有必要以防止用户犯灾难性错误)。这种方法确保所有可能有用的函数和结构对用户都是可访问的,避免了 pub(crate) 可能限制对有价值组件的访问的情况——这是我在使用 chess 库时遇到的问题。因此,只有被认为必需的功能被包含在 timecat::prelude 中;所有其他功能都可以直接从 timecat 库导入。

还引入了几个 cargo 功能,以使用户能够完全控制代码的行为。

NNUE 支持

Timecat 目前使用 Stockfish NNUE 进行评估(仅支持 HalfKP)。计划在未来过渡到自定义训练的 NNUE。

引擎强度

尽管尚未彻底测试,但我的棋引擎能够击败 chess.com 的最大机器人,该机器人的 Elo 分数为 3200。

安装

作为二进制文件安装

优化您的设置以获得最佳性能

RUSTFLAGS="-C target-cpu=native" cargo install timecat

从源代码编译

克隆存储库并使用本地优化编译

git clone https://github.com/Gourab-Ghosh/timecat-rs.git
cd timecat-rs
RUSTFLAGS="-C target-cpu=native" cargo run --release

使用 Docker 编译

克隆存储库并使用本地优化编译

git clone https://github.com/Gourab-Ghosh/timecat-rs.git
cd timecat-rs
sudo docker build -t timecat .
sudo docker run -it --rm timecat

作为库使用

最小依赖集成

以最小依赖将 Timecat 集成到您的 Rust 项目中

cargo add timecat --no-default-features

示例

此示例演示了如何使用 timecat 库设置棋盘,进行移动,评估棋盘位置,并利用内置引擎找到最佳移动。需要启用一些可选功能。

首先,将带有必要功能的 timecat 包添加到您的项目中

cargo add timecat --no-default-features --features "inbuilt_nnue extras"

然后,您可以继续使用以下 Rust 代码

use timecat::prelude::*;

fn main() {
    // Initialize a chess board with the default starting position.
    let mut board = Board::default();

    // Apply moves in standard algebraic notation.
    board.push_san("e4").expect("Failed to make move: e4");
    board.push_san("e5").expect("Failed to make move: e5");

    // Evaluate the current board position using the inbuilt_nnue feature.
    let evaluation = board.evaluate();
    println!("Current Evaluation: {}\n", evaluation);

    // Initialize the engine with the current board state.
    let mut engine = Engine::from_board(board);

    // Configure the engine to search for the best move up to a depth of 10 plies.
    let response = engine.go_verbose(GoCommand::Depth(10));
    let best_move = response.get_best_move().expect("No best move found");

    // Output the best move found by the engine.
    println!(
        "\nBest Move: {}",
        best_move
            .san(engine.get_board())
            .expect("Failed to generate SAN")
    );
}

您可以使用 UCI 命令,尽管在生产环境中不推荐这样做,因为可能会出现解析延迟。此上下文还需要 inbuilt_nnue 可选功能。

与之前一样,将 timecat 包添加到您的项目中

cargo add timecat --no-default-features --features inbuilt_nnue

然后,您可以继续使用以下 Rust 代码

use timecat::prelude::*;
use std::error::Error;

fn main() -> Result<(), Box<dyn Error>> {
    // Create the default engine initialized with the standard starting position.
    let mut runner = timecat::TimecatBuilder::<Engine>::default().build();

    // List of UCI commands to be executed on the chess engine.
    let uci_commands = [
        // Checks if the engine is ready to receive commands.
        "isready",
        // Sets the move overhead option.
        "setoption name move overhead value 200",
        // Display the current state of the chess board.
        "d",
        // Sets a new game position by applying the moves.
        "position startpos moves e2e4 e7e5",
        // Instructs the engine to calculate the best move within 3000 milliseconds.
        "go movetime 3000",
    ];

    // Process each UCI command and handle potential errors.
    for command in uci_commands {
        runner.run_uci_command(command)?;
    }

    Ok(())
}

或者只需享受引擎自我对战

use timecat::prelude::*;
use std::time::Duration;
use std::error::Error;

fn main() -> Result<(), Box<dyn Error>> {
    self_play(
        &mut Engine::default(),
        GoCommand::MoveTime(Duration::from_millis(10)),
        // set to verbose mode (true/false)
        true,
        // Limit to number of moves to play (u16/Some(u16)/None), None denoting no limit
        100,
    )?;

    Ok(())
}

selfplay 命令也适用于二进制文件。

Cargo 功能

  • binread:支持 binread。
  • nnue_reader:通过读取 nnue 文件添加对 NNUE 评估的支持。
  • inbuilt_nnue:通过直接将 nnue 文件包含到二进制文件中,并使用 minreq 库获取,来集成内置的 NNUE 评估支持。
  • extras:添加了一些在二进制文件中不需要的功能,以更好地了解代码的行为。此功能默认禁用,因为这些计算对于二进制文件不是必需的。
  • colored:以视觉上吸引人的彩色格式显示所有信息,以提高可读性。
  • serde:通过 serde 启用序列化和反序列化支持。
  • wasm:WebAssembly 支持(仍处于测试阶段)。
  • pyo3:Python 支持(仍处于测试阶段)。
  • debug:仅用于开发。
  • experimental:为即将推出的功能开发中的代码。

默认功能包括 inbuilt_nnuecolored

TODO

  • 实现其他棋类变体。
  • 实现 Syzygy Tablebase。
  • 整理 Polyglot Table 代码以便使用。
  • 整理与 pgn 相关的代码以便使用。
  • 实现 xboard 功能。
  • 添加SVG功能,类似于Python库 chess,以实现更好的可视化。

许可协议

Timecat遵循GNU通用公共许可证开源。您可以在相同许可协议下自由使用、修改和分发。

贡献

请随意Fork存储库,进行改进并提交拉取请求。您也可以通过GitHub问题跟踪器报告问题或建议功能。

支持开发者

如果您喜欢Timecat,请考虑进行小额捐赠。

GitHub Link PayPal Link

依赖项

~0.6–11MB
~72K SLoC