2016-03-19 22:14:29 +01:00
|
|
|
# Simulations of Hanabi strategies
|
|
|
|
|
2016-03-30 07:24:29 +02:00
|
|
|
Hanabi is a cooperative card game of incomplete information.
|
|
|
|
Despite relatively [simple rules](https://boardgamegeek.com/article/10670613#10670613),
|
|
|
|
the space of Hanabi strategies is quite interesting.
|
2016-04-02 23:29:46 +02:00
|
|
|
This project provides a framework for implementing Hanabi strategies in Rust.
|
2016-03-30 07:24:29 +02:00
|
|
|
It also explores some implementations, based on ideas from
|
|
|
|
[this paper](https://d0474d97-a-62cb3a1a-s-sites.googlegroups.com/site/rmgpgrwc/research-papers/Hanabi_final.pdf).
|
2016-04-02 23:29:46 +02:00
|
|
|
In particular, it contains an improved version of their "information strategy",
|
|
|
|
which achieves the best results I'm aware of for games with more than 2 players ([see below](#results)).
|
2016-03-19 22:14:29 +01:00
|
|
|
|
2016-04-02 23:29:46 +02:00
|
|
|
Please feel free to contact me about Hanabi strategies, or this framework.
|
2016-03-19 22:14:29 +01:00
|
|
|
|
2016-04-02 23:29:46 +02:00
|
|
|
Most similar projects I am aware of:
|
2016-03-19 22:14:29 +01:00
|
|
|
- https://github.com/rjtobin/HanSim (written for the paper mentioned above)
|
|
|
|
- https://github.com/Quuxplusone/Hanabi
|
|
|
|
|
|
|
|
## Setup
|
|
|
|
|
2016-04-02 23:29:46 +02:00
|
|
|
Install rust (rustc and cargo), and clone this git repo.
|
2016-03-19 22:14:29 +01:00
|
|
|
|
2016-04-02 23:29:46 +02:00
|
|
|
Then, in the repo root, run `cargo run -- -h` to see usage details.
|
2016-03-19 22:14:29 +01:00
|
|
|
|
2016-04-02 23:29:46 +02:00
|
|
|
For example, to simulate a 5 player game using the cheating strategy, for seeds 0-99:
|
2016-03-19 22:14:29 +01:00
|
|
|
```
|
2016-04-02 23:29:46 +02:00
|
|
|
cargo run -- -n 100 -s 0 -p 5 -g cheat
|
2016-03-19 22:14:29 +01:00
|
|
|
```
|
|
|
|
|
2016-04-02 23:29:46 +02:00
|
|
|
Or, if the simulation is slow, build with `--release` and use more threads:
|
2016-03-31 19:17:22 +02:00
|
|
|
```
|
2016-04-01 11:08:46 +02:00
|
|
|
time cargo run --release -- -n 10000 -o 1000 -s 0 -t 4 -p 5 -g info
|
|
|
|
```
|
|
|
|
|
2016-04-02 23:29:46 +02:00
|
|
|
Or, to see a transcript of the game with seed 222:
|
2016-04-01 11:08:46 +02:00
|
|
|
```
|
2016-04-02 23:29:46 +02:00
|
|
|
cargo run -- -s 222 -p 5 -g info -l debug | less
|
2016-03-31 19:17:22 +02:00
|
|
|
```
|
2016-03-19 22:14:29 +01:00
|
|
|
|
2016-04-02 23:29:46 +02:00
|
|
|
## Strategies
|
|
|
|
|
2016-04-04 09:26:42 +02:00
|
|
|
To write a strategy, you simply [implement a few traits](src/strategy.rs).
|
2016-04-02 23:29:46 +02:00
|
|
|
|
|
|
|
The framework is designed to take advantage of Rust's ownership system
|
|
|
|
so that you *can't cheat*, without using stuff like `Cell` or `Arc` or `Mutex`.
|
|
|
|
|
|
|
|
Generally, your strategy will be passed something of type `&BorrowedGameView`.
|
|
|
|
This game view contains many useful helper functions ([see here](src/game.rs)).
|
|
|
|
If you want to mutate a view, you'll want to do something like
|
|
|
|
`let mut self.view = OwnedGameView::clone_from(borrowed_view);`.
|
|
|
|
An OwnedGameView will have the same API as a borrowed one.
|
|
|
|
|
|
|
|
Some examples:
|
|
|
|
|
|
|
|
- [Basic dummy examples](src/strategies/examples.rs)
|
|
|
|
- [A cheating strategy](src/strategies/cheating.rs), using `Rc<RefCell<_>>`
|
|
|
|
- [The information strategy](src/strategies/information.rs)!
|
|
|
|
|
2019-03-07 19:12:31 +01:00
|
|
|
## Results (auto-generated)
|
2016-03-19 22:14:29 +01:00
|
|
|
|
2016-04-01 09:14:13 +02:00
|
|
|
To reproduce:
|
|
|
|
```
|
2019-03-07 19:12:31 +01:00
|
|
|
time cargo run --release -- --results-table
|
|
|
|
```
|
|
|
|
|
|
|
|
To update this file:
|
|
|
|
```
|
|
|
|
time cargo run --release -- --write-results-table
|
2016-04-01 09:14:13 +02:00
|
|
|
```
|
2019-03-07 19:12:31 +01:00
|
|
|
|
|
|
|
On the first 20000 seeds, we have these average scores and win rates:
|
|
|
|
|
2019-03-09 14:41:18 +01:00
|
|
|
| | 2p (stderr) | 3p (stderr) | 4p (stderr) | 5p (stderr) |
|
|
|
|
|---------|------------------|------------------|------------------|------------------|
|
|
|
|
| cheat | 24.8594 (0.0036) | 24.9785 (0.0012) | 24.9720 (0.0014) | 24.9557 (0.0018) |
|
|
|
|
| | 90.59 % (0.21 %) | 98.17 % (0.09 %) | 97.76 % (0.10 %) | 96.42 % (0.13 %) |
|
|
|
|
| info | 22.3249 (0.0128) | 24.7278 (0.0046) | 24.8919 (0.0029) | 24.8961 (0.0027) |
|
|
|
|
| | 09.81 % (0.21 %) | 80.54 % (0.28 %) | 91.67 % (0.20 %) | 91.90 % (0.19 %) |
|