yamcts

Crates.ioyamcts
lib.rsyamcts
version0.1.0
sourcesrc
created_at2024-09-12 00:46:25.805327
updated_at2024-09-12 00:46:25.805327
descriptionAn implementation of Monte Carlo Tree Search.
homepage
repositoryhttps://github.com/nowl/yamcts
max_upload_size
id1372385
size28,948
John (nowl)

documentation

README

(Yet Another) Monte Carlo Tree Search

Crates.io link

This is an implementation of Monte Carlo Tree Search (MCTS) in rust.

The features that potentially make this library a bit different from the many other MCTS libraries out there:

  • Zero-dependency (all dependencies are optional)
  • Pluggable RNG (default uses nanorand::WyRand)
  • Multi-threaded

Usage

Add dependency

cargo add yamcts

or in the Cargo.toml file

[dependencies]
yamcts = "0.1.0"

Running MCTS

  • Implement GameState
  • Call run_with_duration or run_with_iterations on the game state to calculate next MCTS move
  • apply_move on the game state and repeat

Example implementing Nim 21 variation

see examples/nim.rs

Run with cargo run --example nim or cargo run --release --example nim

Using a custom random number generator

The default RNG uses nanorand but if you don't want that dependency and/or would like to use a different RNG it's just necessary to implement RngProvider and Rng.

use rand::prelude::*;

// Wrapper struct, in this case rand::StdRng
struct CustomRng(StdRng);

// Implement RngProvider to return an instance of CustomRng/StdRng
impl yamcts::rng::RngProvider for CustomRng {
    fn init() -> Self {
        CustomRng(StdRng::from_entropy())
    }
}

// Implement Rng for gen_range
impl yamcts::rng::Rng for CustomRng {
    fn gen_range(&mut self, bounds: Range<usize>) -> usize {
        self.0.gen_range(bounds)
    }
}

Then to use this RNG:

let mcts = yamcts::MCTS::<CustomRng>::default();

License

This project is licensed under the MIT License. See the LICENSE file for details.

Commit count: 0

cargo fmt