In previous versions of Orego, I have added one node per playout. I just changed that to add a child to a node only if that node has at least A runs, where A is the area of the board (e.g., 81). This seems to make the program stronger, if only because it allows me to get in more runs. Specifically, it allows me to get (a bit) more out of my 4- processor-core machine, because the parts where the threads have to synchronize on the tree (generating in-tree moves and incorporating the playout) are shorter.

Remi (and, I think, others) were already doing this. I wasn't, because I got the idea into my head that this would be throwing away information. It is, but it's throwing away information that you're almost certainly not going to use. If a move is truly bad, random playouts will generally reveal this; it's not worth constructing a subtree to figure out WHY it's bad.

Has anyone tried requiring more than A playouts before adding a child to a node? This seems an arbitrary threshold, but I have no idea how (other than empirically) to find the right tradeoff between tree search and preemptive sampling.

On a related note, where are people applying heuristics? I see three possibilities:

1) Incorporate heuristics into the UCT formula.
2) Use heuristics to order moves added as children to tree nodes that don't have all their children yet. It is possible to preemptively prune here, never exploring some moves that are rated as awful in the heuristics.
3) Use heuristics in the playouts.

I have (recently) avoided 3, on the theory that the playouts need to be very fast and are largely nonsensical. Given my new realization that the playout threads are often waiting for the tree anyway, this may not be valid. Again, it's a question of finding the right balance...

Peter Drake
http://www.lclark.edu/~drake/



_______________________________________________
computer-go mailing list
[email protected]
http://www.computer-go.org/mailman/listinfo/computer-go/

Reply via email to