[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: computer-go: [Question] Alpha-Beta Pruning & Null Move



Hi Mark,

It sounds like your algorithm uses null  move to prune but without the
depth   reduction   factor.  This probably   makes   sense in tactical
reading.  You are  essentially trying a null move  to see if a line is
worth persuing, and this will be much more  accurate than using static
pruning rules.  With  a tactical search  in Go, the  tree is very deep
with a  very low branching factor.   The point is that depth reduction
does not have much meaning in this context because your stopping rules
are not primarly  based on depth  (although you probably still have an
upper limit.)

In  order to  be cheaper,   which would  be  neccesary to   rightfully
consider it a pruning algorithm, the null move search has to made very
cheap,  especially so if it doesn't  produce rich cutoffs.  Even if it
does it needs  to  be cheaper than  the search  you would normally  be
doing.  When  the null   move  search  fails,  it  just becomes   pure
overhead.

It may be that you can take steps to  severely constrain the null move
search.  I'm sure you've experimented with this.  In chess, getting an
extra  move  is SO  overwhelming, that   it usually returns  something
optimistic even  with depth reduction.   With tactical reading you may
have  something like this with   some other constraints you might  not
normally consider.  I don't really know.   

Don





   From: "Mark Boon" <tesuji@xxxxxxxxxxxxxxxxx>
   Date: Wed, 25 Apr 2001 17:38:09 +0200

   Don's description of 'null move pruning' is what I thought it would be. I
   used something similar in Goliath as one of the criteria to stop reading
   certain variations. It had rather vague concepts of 'urgency' and
   'stability' to decide whether to (continue to)read in a certain situation or
   not. The original driver was that static evaluation turned out to be almost
   useless in situations that are not stable. So unstable situations had to be
   read further. One of the ways to determine whether a situation was stable
   was to allow one side to move twice and see if it would lead to an
   unacceptable result for the side that 'passed locally', taking into account
   the average value of a move for the side that 'passed'.

   I wouldn't know how to measure the speed-up. For my program it actually
   caused it to slow down considerably, because it would do much more reading
   in variations the static evaluation would have given up. Plus that the
   situation after the two moves in a row by one side might still not be stable
   and therefore need more reading. But for the accuracy of the reading it was
   a great improvement. This method for determining whether a situation was
   stable or not was always a last resort. If you can do it by heuristics it is
   preferable since it saves a lot of time. The difficulty was to find a good
   balance for the heuristics.

   In tactical reading, a pass is also sometimes allowed but I wonder if it can
   be regarded as a null move. It is used to prevent one side of being forced
   to play and actually make his position worse because the only moves
   available to him are filling his own liberty or filling his own eye.

   One of the best usages of null moves I find in the endgame. Sente moves are
   generally doubled in value. To find out if a move is sente, try moving twice
   and see if the result gets doubled or more.

   Does anyone actually have experience with making a program play endgame
   properly? I have briefly looked into it using brute-force in a local
   situation, but wasn't very successful. What I wanted for example is a
   program to be able to see that the value of a gote move would be higher than
   evaluated if it could be followed up by a profitable sente sequence. This is
   a very basic technigue that even most kyu players master, but it seems
   surprisingly difficult for programs. A slightly more sophisticated
   technigue, which I also thought to be easy for computers, is to evaluate
   what gote moves either side can make locally, see which side can make the
   bigger move and award that side half of the difference. (For example, if
   black cannot make any points, but white can make two points, evaluate it as
   one point for white.) After a months worth of work the results were still
   very poor so I wondered if anyone else tried.

       Mark