go-atari-montecarlo, v1.3
Posted on

The library that implements an Atari Go engine based on the Monte Carlo tree search algorithm.
Use the board interface and the separate move generator.
Change Log
- use:
- board interface;
- separate move generator.
Examples
searchers.MoveSearcher.SearchMove() with the separate move generator:
package main
import (
"fmt"
"log"
"math"
models "github.com/thewizardplusplus/go-atari-models"
"github.com/thewizardplusplus/go-atari-montecarlo/builders"
"github.com/thewizardplusplus/go-atari-montecarlo/builders/terminators"
"github.com/thewizardplusplus/go-atari-montecarlo/searchers"
"github.com/thewizardplusplus/go-atari-montecarlo/selectors"
"github.com/thewizardplusplus/go-atari-montecarlo/selectors/scorers"
"github.com/thewizardplusplus/go-atari-montecarlo/simulators"
"github.com/thewizardplusplus/go-atari-montecarlo/simulators/bulky"
"github.com/thewizardplusplus/go-atari-montecarlo/tree"
)
func main() {
// +-+-+-+-+-+
// |W|W|W|W|X|
// +-+-+-+-+-+
// |W|W|W|W|W|
// +-+-+-+-+-+
// |W|W|W|W|W|
// +-+-+-+-+-+
// |W|W|W|W|W|
// +-+-+-+-+-+
// |W|W|W|W|W|
// +-+-+-+-+-+
board := models.NewBoard(models.Size{Width: 5, Height: 5})
points := board.Size().Points()
for _, point := range points[:len(points)-1] {
board = board.ApplyMove(models.Move{Color: models.White, Point: point})
}
generator := models.MoveGenerator{}
randomSelector := selectors.RandomMoveSelector{}
generalSelector := selectors.MaximalNodeSelector{
NodeScorer: scorers.UCBScorer{Factor: math.Sqrt2},
}
simulator := bulky.FirstNodeSimulator{
Simulator: simulators.RolloutSimulator{
MoveGenerator: generator,
MoveSelector: randomSelector,
},
}
builder := builders.IterativeBuilder{
Builder: builders.TreeBuilder{
NodeSelector: generalSelector,
MoveGenerator: generator,
Simulator: simulator,
},
Terminator: terminators.NewPassTerminator(2),
}
searcher := searchers.MoveSearcher{
MoveGenerator: generator,
Builder: builder,
NodeSelector: generalSelector,
}
preliminaryMove := models.NewPreliminaryMove(models.Black)
root := &tree.Node{Move: preliminaryMove, Storage: board}
node, err := searcher.SearchMove(root)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", node.Move)
// Output: {Color:0 Point:{Column:4 Row:4}}
}
Repository
Link: https://github.com/thewizardplusplus/go-atari-montecarlo/tree/v1.3.
Content: code.
License: MIT.