1 unstable release
0.1.0 | Sep 12, 2024 |
---|
#856 in Algorithms
15KB
327 lines
(Yet Another) Monte Carlo Tree Search
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
orrun_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.
Dependencies
~1MB
~19K SLoC