[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [computer-go] Groups, liberties, and such
"Harri Salakoski" <harri.salakoski@xxxxxxxxxxxxxxxxx> wrote:
O(?) is little unknown, but that kind of AI
I think goal is to get as much info from one board situation than you can
and not focusing "how much boards you can evaluate per second".
In GoGame where alfatree grows like factor of 100? or something I dont see
small peformance improvements in board evaluation important. Like average
human sees about 90% of one board situation in average when making move :)?
The "merge smaller group into larger one and incrementally update liberties"
algorithm that Remi mentioned is O(log2 s) amortized cost over the course of
a game, where s is the size of the largest group in the game, so s is
bounded by both the size of the board and the duration of the game. The
O(log2 s) average is not guaranteed for pathological tree searches instead
of linear games, but I doubt that would ever make a real difference. Better
performance is much more likely than worse performance, I think.
In contrast, incremental merges performed with a disregard to which group is
larger has big-O performance no better than recomputing from scratch --
recomputing may be faster than that, because it's simpler. Put it this way:
merging in random order (or recomputing from scratch) is O(log s) if the
merged groups have similar size or up to O(s) if they are very different,
while merging the smaller into the larger is O(log s) or as little as O(1)
in those two respective cases. So as Remi pointed out, you need to get the
order right.
The algorithm is simpler than the math. Just move stones one at a time from
the smaller group to the larger one, and as you add each stone, update the
larger group's liberty count appropriately. You have to check each of the
stone's liberties to see if they are already liberties of the larger group,
so it's not something you can do in a few CPU cycles -- but it's not that
bad. (At least that's what I do; I'm guessing that's what Remi and many
others do also.)
I also agree that the disjoint-set data structure is probably not worth it
if you compute liberties this way. Reassigning all stones to the new group
at the same time you assign their liberties to it is natural and only
marginally increases the time cost.
The "merge bitmaps of liberties" approach that Heiki mentioned is an
O(boardsize/wordsize) algorithm. I wouldn't equate that with O(1), but it's
still fast. If you're going to store liberty bitmasks to begin with, it is
a natural way to go. One might implement it something like this, to
minimize time spent doing bitcounts (untested Java pseudocode).
class Worm {
void absorb(Worm other) {
// stone-merge code goes here...
...
// Liberty-counting code goes here.
for (int i = 0; i < other.libertyMasks.length; i++) {
long newLibertiesMask = other.libertyMasks[i] &
~libertyMasks[i];
if (newLibertiesMask != 0) {
libertyMasks[i] |= newLibertiesMask;
libertyCount += Long.bitCount(newLibertiesMask);
}
}
}
}
For choices when rolling your own bitCount, see
http://groups.google.com/group/sci.crypt/msg/23104e0c36f96e7d
Tangent: what clever tricks can you do with liberty lists or liberty
bitmaps? Okay, first off, if two worms' liberty bitmasks intersect once,
they're at least half-connected, and if they intersect twice, they're
connected. Second, you can use liberty lists to compute second- and
higher-order liberties. What else?
The cost of doing liberty updates would be swamped by the cost of other
evaluations in many situations, but maybe not all. For quick local
searches, liberty counts might be as compute-intensive as the node
evaluation gets. You could skip the liberty count too, but liberty counts
are good for presorting move candidates to improve performance of
alpha-beta, for short-circuiting branches that are guaranteed to exceed
preset limits (e.g. you can't kill a 4-liberty group in less than 7 plies),
etc.
_________________________________________________________________
On the road to retirement? Check out MSN Life Events for advice on how to
get there! http://lifeevents.msn.com/category.aspx?cid=Retirement
_______________________________________________
computer-go mailing list
computer-go@xxxxxxxxxxxxxxxxx
http://www.computer-go.org/mailman/listinfo/computer-go/