NB. The latter portion of this code demonstrates
NB. various Markov chain computations.

Note 'code notes'
 Use Raul Miller's easy, useful
 NOUN Adverb Conjunction verb
 name convention.

 Data structure:
  o Board is a vector tallying *:N.  Apparently, I
    have  virtualized BOARD.  It exists in thought
    only.
  o The state is vector of 2 boxed knight paths
    with next to move at head.

 program should work for N in [3,9]
 The upper limit stems from the chess
 algebraic display algorithm.

 1 piece moves each ply
)

N=: 8

NB. convert array coordinates to vector index
index=: N&#.

GRID=: 2 ({@:# <@:i.) N
CELLS=: ,/@:> GRID

JUMPS=: (, |."1) 1 2 *"1 (1 1,_1 1,_1 _1,:1 _1)
LC=: 26 }. Alpha_j_               NB. lowercase
CD=: }. Num_j_              NB. counting digits
NAMES=: ((LC {~ {.) , (CD {~ {:))"1 CELLS

NB. T are the circle of moves from each square
T=: <"2 CELLS+"1/JUMPS

NB. VerifyRange Interval is (]
NB. 0 means in range, 1 for outside
VerifyRange=: &(1 ~: I.)
assert 1 1 0 0 0 0 1 1 1 1 -: 1 5 VerifyRange i.10
Note 'why adverb?'
I like adverbs.  When I write in other languages I
hard-code  constants,  then  I  have  to  rewrite,
extracting and  naming constants to  generalize my
code.  Adverbs will help me overcome this.
)

assert 0 -: 2 9 VerifyRange N    NB. process check

none=: +:/        NB. works for a pair of numbers
MOVES2D=: (#~ none"1@:((_1+0,N)VerifyRange))&.> T
MOVES=: index&.> MOVES2D

NB. sorry, I like commuted hook
'WN BN'=: 2 ((A.~ ?)~ index) 1 1 ,: N - 2 2

choose=: {~ ?@:#
move=: choose@:>@:({&MOVES)
While=: conjunction def 'u^:v^:_'
position=: {:@:>
continue=: ~:&position/
assert 1 -: continue 2 3;4
assert 0 -: continue 2 3;4 2 3
ply=: {: , (, move@:position)&.>@:{.

NB. run the simulation
PATHS=: WN ply While continue@:;&, BN

NB. report
WN 4 : 0 PATHS

NB. algebraic notation for the moves
AN=. (('N' , [ , ' N' , ])/"2) NAMES {~ ,.&>/ y

NB. display the numbered moves
smoutput 'Move 0 shows setup.'
smoutput 'White plays first.  Black wins.'
smoutput (,.~ '. ' ,"1~ ":@:,.@:i.@:#) AN
)


Note 'Markov chain'
Consider  an (*:N)  by  (*:N)  transition  matrix.
Each row  represents a square on  the chess board,
so  does each  column.   The row  is the  starting
square,  the column  is the  index of  end square.
The  value   at  each  row  column   cell  is  the
probability  to move  to  the cell  of the  column
starting from  the cell of the  row.  For example,
the first row represents the corner cell a1.  From
a1   there  are  two   legal  moves,   with  equal
probability.   Those two columns  in top  row will
have probability 1r2.

The  probability that  a  knight is  located at  a
square  is  the  matrix  product  of  the  current
location  vector  by  the  transition  probability
matrix.  Repeat the matrix multiplication for each
hop.  Begin!
)

NB. transition probability matrix
NB. sorry, I like commuted hook
P=: ((%@:x:@:#@:[`[`]}~ >)~"0 1 (0 $~ ,~@:#)) MOVES

Note 'transition probability matrix'
4x4 symmetric corner of 8x8 chess board.
The display is chopped at right hand side for email.
Perhaps difficult to understand.
    a1  a2  a3  a4..b1  b2  b3  b4..c1  c2  c3  c4..d
  +--------------------------------------------------
a1|  0   0   0   0   0   0 1r2   0   0 1r2   0   0
a2|  0   0   0   0   0   0   0 1r3 1r3   0 1r3   0
a3|  0   0   0   0 1r4   0   0   0   0 1r4   0 1r4
a4|  0   0   0   0   0 1r4   0   0   0   0 1r4   0
  .
b1|  0   0 1r3   0   0   0   0   0   0   0 1r3   0
b2|  0   0   0 1r4   0   0   0   0   0   0   0 1r4 1r
b3|1r6   0   0   0   0   0   0   0 1r6   0   0   0
b4|  0 1r6   0   0   0   0   0   0   0 1r6   0   0
  .
c1|  0 1r4   0   0   0   0 1r4   0   0   0   0   0
c2|1r6   0 1r6   0   0   0   0 1r6   0   0   0   0
c3|  0 1r8   0 1r8 1r8   0   0   0   0   0   0   0 1r
c4|  0   0 1r8   0   0 1r8   0   0   0   0   0   0
  .
d1|  0   0   0   0   0 1r4   0   0   0   0 1r4   0
d2|  0   0   0   0 1r6   0 1r6   0   0   0   0 1r6
d3|  0   0   0   0   0 1r8   0 1r8 1r8   0   0   0
d4|  0   0   0   0   0   0 1r8   0   0 1r8   0   0
)

start=: (i.@:# P)&=
mp=: +/ .*

Note 'various probabilities'
   NB. percent probability to land on a square
   NB. after 80 and 81 jumps.
   NB. Observe the white-black alternation.
   <.0.5+100*(_1 x: P)mp~^:80 81(start@:index 1 1)
1 0 2 0 2 0 2 0 0 2 0 4 0 4 0 2 2 0 5 0 5 0 4 0...
0 2 0 2 0 2 0 1 2 0 4 0 4 0 2 0 0 4 0 5 0 5 0 2...

   NB. probability sum 1, knight still on board.
   +/"1 (_1 x: P) mp~^:80 81 (start@:index 1 1)
1 1

   NB. compute probability to be on same square
   NB. after 6 hops.  Different question from
   NB. "The first time they meet is at move 6."

   NB. locations after 6 hops
   HOPS=: 6
   P_CELL=: WN mp&(_1 x: P)^:HOPS@:,:&start BN

   NB. show the probabilities (clipped at 50 colum
   _ 50 {. 6j3 ": P_CELL
 0.013 0.000 0.030 0.000 0.026 0.000 0.016 0.000 0
 0.007 0.000 0.016 0.000 0.018 0.000 0.016 0.000 0

   NB. Probability to share square at move 6
   mp/ P_CELL
0.0349013

   NB. Probability to share after
   NB. 0, 2, ... , 22 plies.
   NB. (display clipped!)
   mp/"2 WN mp&(_1 x: P)^:(<12)@:,:&start BN
0 0 0.0117188 0.0226508 0.0313695 0.0322698 0.0349
   NB. First capture can occur at move 2.
)


----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to