#tree-search #monte-carlo #tree #search #carlo #monte #mcts

mocats

一个快速、易于使用、通用的蒙特卡洛树搜索库。适用于任何游戏、任何数量的玩家以及任何树策略(默认包括UctPolicy策略)。

3个不稳定版本

0.2.1 2023年5月26日
0.2.0 2023年5月24日
0.1.0 2023年5月23日

2346算法

32 每月下载量

MIT 许可证

30KB
455

mocats

Crates.io License

一个快速、易于使用、通用的蒙特卡洛树搜索库。适用于任何游戏、任何数量的玩家以及任何树策略(包括默认的UctPolicy策略)。当前版本,搜索是单线程的。

功能

  • 快速高效的蒙特卡洛树搜索实现
  • 易于使用的API
  • 可自定义玩家数量(对于超过2个玩家使用偏执方法)
  • 可自定义树策略
  • 调试时格式化的输出显示

用法

在项目的根目录中,将 mocats 依赖项添加到您的 Cargo.toml 文件中

cargo add mocats

...或添加此内容到您的 Cargo.toml

[dependencies]
mocats = "0.2.1"

定义游戏

要使用 mocats,您必须定义一个游戏和一个树策略。游戏由三个特性定义

  • GameState: 表示游戏状态。
  • GameAction: 表示可以应用于某些 GameState 的合法游戏动作。
  • Player: 表示游戏中的玩家。应该是一个枚举。

树策略由一个特性定义

  • TreePolicy: 表示树策略。

UctPolicy 结构体被包括为默认的树策略。

要运行搜索,使用游戏和树策略创建一个 SearchTree 结构体,然后调用其上的 run

use mocats::{tic_tac_toe, UctPolicy};

fn foo() {
    let game = tic_tac_toe::TicTacToePosition::new();
    let tree_policy = UctPolicy::new(2.0);
    let mut search_tree = mocats::SearchTree::new(game, tree_policy);
    search_tree.run(2000);
    let best_action = search_tree.get_best_action();
    println!("{}", search_tree);
    println!("Best action: {}", best_action.unwrap());
}

示例

查看 mocats::tic_tac_toe 模块,了解使用 mocats 实现井字棋的完整示例。您可以将 tic_tac_toe 导入以在您的代码中使用。

use std::fmt;
use std::fmt::{Display, Formatter};

#[derive(Debug, Clone, Copy, PartialEq)]
pub struct TicTacToeMove {
    pub pos: u16
}

impl mocats::GameAction for TicTacToeMove {}

impl Display for TicTacToeMove {
    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
        todo!()
    }
}

#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
pub enum TicTacToePlayer {
    X,
    O
}

impl TicTacToePlayer {}

impl mocats::Player for TicTacToePlayer {}

impl Display for TicTacToePlayer {
    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
        todo!()
    }
}

#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
pub struct TicTacToePosition {
    pub board_x: u16,
    pub board_o: u16,
    pub turn: TicTacToePlayer,
}

impl TicTacToePosition {
    pub fn new() -> TicTacToePosition {
        todo!()
    }
}

impl Display for TicTacToePosition {
    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
        todo!()
    }
}

impl mocats::GameState<TicTacToeMove, TicTacToePlayer> for TicTacToePosition {
    fn get_actions(&self) -> Vec<TicTacToeMove> {
        todo!()
    }

    fn apply_action(&mut self, action: &TicTacToeMove) {
        todo!()
    }

    fn get_turn(&self) -> TicTacToePlayer {
        todo!()
    }

    fn get_reward_for_player(&self, player: TicTacToePlayer) -> f32 {
        todo!()
    }
}

文档

有关更详细的文档和使用示例,请参阅API文档

贡献

欢迎以拉取请求的形式进行贡献!如果您遇到任何问题或对改进有建议,请在GitHub仓库上打开一个问题。

许可证

本项目采用MIT许可证。有关详细信息,请参阅许可证文件

依赖项

~305KB