[ProgClub list] ai-checkers in jj5-test
John Elliot
jj5 at progclub.org
Tue Oct 18 07:13:48 AEDT 2011
Well I didn't think too hard about it, but I got my homework for the
first week of the AI class submitted, so that means I can spend a little
while this morning thinking harder about the checkers problem.
I was thinking: there are 32 spaces on the board, and each of these
spaces could be either empty (the board '.'), or occupied by a red piece
('x'), a red king ('X') a white piece ('o') or a white king ('O'). So
that's five possible values, which can be represented in 3 bits: '.'
000; 'x' 001; 'X' 010; 'o' 011; 'O' 100; with 101, 110, 111 unused. That
would make it pretty easy to pack 2 board positions into a byte (high
four bits and low four bits) giving a 16 byte data structure to
represent the state of a board. Using 3 bits you could pack the state of
all 32 board positions into a 12 byte data structure (3*32=96). Or
(assuming you could have between 0 and 32 pieces on the board, which you
can't) you could have a maximum of
5 ^ 32 = 33,554,432
= 10 0000 0000 0000 0000 0000 0000 (in binary)
board states, which is a 4 byte data structure (with 6 bits to spare).
At the moment in my simulation I'm using a 65 byte data structure, which
is way larger than necessary.
Coming at this from a different direction, given the state of the board
that we're starting with, there are 9 red pieces and 7 white pieces for
a total of 16 pieces on the board. Any piece could be located on one of
33 different locations, being any valid square (32) or 'off the board'
(1). A piece can also be either normal or a king, which is an extra bit.
So there are 34 states to model for each piece, being whether it is a
king or not, whether it is on the board or not, and where on the board
it is. You can represent 34 states in 6 bits, which you could pack into
8 bits having a 16 byte data structure for the location/state of each
piece, or a 6*16 = 96 bits = 12 byte data structure to model pieces and
their location.
So that's a 4 byte data structure representing board states, or a 12
byte data structure representing piece states. So, assuming I haven't
made a mistake, it's cheaper to model the state of a board (what
occupies each square) than it is to model the state of a set of pieces
(which location/king-state each piece is in).
I'm not sure how I would actually pack the board state into 4 bytes
though. I guess it would have something to do with representing numbers
in base 5. So if I had a (signed or unsigned) 32 bit value, and
converted it into a base 5 string representation, the digit in position
n would give me the state of board position n. That makes this problem
almost seem tractable. There are no more than 33,554,432 states. Many of
those states are impossible, and of those that are possible many of them
aren't possible given the starting configuration of this particular board.
So essentially I've established that we can pack a board state into a
single 32-bit integer, but I'm not sure yet about what sort of
algorithms, data structures or state management system I would need to
compute and model game trees. I'm starting to feel like this problem
might be computationally intractable. I'll think more about it in our
next instalment...
More information about the list
mailing list