Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Adaptive Null Move Pruning

Author: Vincent Diepeveen

Date: 16:09:43 09/27/00

Go up one level in this thread


On September 27, 2000 at 14:12:59, Ernst A. Heinz wrote:

>Hi Vincent,
>
>>[...]
>>program doesn't nullmove at all (with 1 piece),
>>i'm searching up to 9 plies deeper, because
>>i can use nullmove there, perhaps something for you to mention
>>in your articles?
>
>I use to write about my own rather than other people's
>ideas and experiments.
>
>Why don't you try to publish something serious yourself?

>You always claim to have developed and know so many things
>much better than most everybody else. So, why not write
>about and submit it to the usual scientific peer review?

Oh well that's a pretty good idea, because i need just about 2 minutes
of data collecting and an hour for writing the article if i put the
same effort into it as most scientists do :)

>The "double null move" you mention might be a good first
>shot in this direction.

I lack the time and especially motivation to create articles,
also i don't get paid to write them.

>If you already explained what it is, I missed it. I do not
>know what you mean exactly by "double null move". How and
>when do you apply it? What about experimental evaluation?

the double nullmove enhancement is real simple explained by a few
lines of code
when to nullmove, assuming you store in an array movelist[128]
the moves, and the current real depth is realdepth (the actual
number of moves made).

if( !incheck && !pawnendgame
 && (movelist[realdepth-1] != nullmove
      || movelist[realdepth-2] != nullmove)( { // then allow nullmove
  movelist[realdepth++] = nullmove;
  ..
}

>Which test results support your claim of "double null move"
>being a technique worthwhile to implement?

It's not a technique, rather a small enhancement to catch zugzwang.

Just implement these lines as your conditions to decide *when* to
nullmove. You'll see it catches zugzwangs (if not too many) and
makes nullmove a correct form of searching (correct being defined
as: at a depth n which i may chose it solves any problem).

What it basically does is doing a normal search after 2 nullmoves.

If you add more conditions that are side dependant (or alfa beta
dependant which is also a form of side dependancy) then you might
not catch zugzwangs already.

    THAT IT CATCHES ZUGZWANG:

A position posted here at CCC today where nullmove normally fails:

[D]8/8/p3R3/1p5p/1P5p/6rp/5K1p/7k w - - 0 1

00:00 28 (0) 1 -5.83 Re6-e1 Rg3-g1 Re1-e7
00:00 30 (0) 1 -4.73 Re6xa6
00:00 76 (0) 2 -4.95 Re6xa6 Rg3-g1
00:00 302 (0) 3 -4.75 Re6xa6 Rg3-g2 Kf2-f3 Rg2-g1
00:00 809 (0) 4 -4.58 Re6xa6 Rg3-g1 Ra6-a8 Rg1-g2 Kf2-f3
00:00 2299 (0) 5 -4.53 Re6xa6 Rg3-g5 Ra6-a1 Rg5-g1 Ra1-a8 Rg1-g2 Kf2-f3 Rg2-g1
00:00 4952 (443) 6 -4.52 Re6xa6 Rg3-g5 Ra6-a1 Rg5-g1 Ra1-a6 Rg1-g2 Kf2-f3 Rg2-g5
 Ra6-a1 Rg5-g1 Ra1-a7 Rg1-f1 Kf3-e4 Kh1-g2
00:00 17457 (7143) 7 -4.97 Re6xa6 Rg3-g2 Kf2-f3 Rg2-g5 Kf3-f4 Rg5-g1 Ra6-a2 Rg1-
g2
00:00 25462 (7420) 8 -4.58 Re6xa6 Rg3-g2 Kf2-f3 Rg2-g5 Ra6-a1 Rg5-g1 Ra1-a8 Rg1-
b1 Ra8-d8 Rb1-b3 Kf3-f2
00:00 37460 (7816) 9 -4.65 Re6xa6 Rg3-g2 Kf2-f3 Rg2-g5 Ra6-a1 Rg5-g1 Ra1-a8 Rg1-
b1 Kf3-f2 Rb1-b2 Kf2-f3 Rb2-b3 Kf3-f2
00:00 47849 (7967) 10 -4.49 Re6xa6 Rg3-g2 Kf2-f3 Rg2-g5 Ra6-a1 Rg5-g1 Ra1-a8 Rg1
-g3 Kf3-f2 Rg3-g4 Ra8-a1 Rg4-g1 Ra1-a5 Rg1-g2 Kf2-f3 Rg2-g5 Ra5-a1
00:01 59178 (9578) 11 -4.49 Re6xa6 Rg3-g2 Kf2-f3 Rg2-g5 Ra6-a1 Rg5-g1 Ra1-a8 Rg1
-g3 Kf3-f2 Rg3-g4 Ra8-a1 Rg4-g1 Ra1-a5 Rg1-g2 Kf2-f3 Rg2-g5 Ra5-a1
00:01 75500 (9982) 12 -4.49 Re6xa6 Rg3-g2 Kf2-f3 Rg2-g5 Ra6-a1 Rg5-g1 Ra1-a8 Rg1
-g3 Kf3-f2 Rg3-g2 Kf2-f3 Rg2-g1 Kf3-f4 Rg1-e1 Ra8-g8 Re1-f1 Kf4-e5 Rf1-b1
00:01 119501 (14319) 13 -4.49 Re6xa6 Rg3-g2 Kf2-f3 Rg2-g5 Ra6-a1 Rg5-g1 Ra1-a8 R
g1-g3 Kf3-f2 Rg3-g2 Kf2-f3 Rg2-g1 Kf3-f2 Rg1-b1
00:03 292790 (38137) 14 -4.92 Re6xa6 Rg3-g2 Kf2-f3 Rg2-g5 Ra6-a1 Rg5-g1 Ra1-a8 R
g1-f1 Kf3-e3 Rf1-f7 Ra8-g8 Rf7-c7 Ke3-f3 Rc7-c3 Kf3-f2 Rc3-c4 Kf2-f3 Rc4xb4 Rg8-
b8
00:04 522912 (63890) 15 -5.02 Re6xa6 Rg3-g2 Kf2-f3 Rg2-g5 Ra6-a1 Rg5-g1 Ra1-a8 R
g1-f1 Kf3-e3 Rf1-f7 Ra8-g8 Rf7-c7 Ke3-f3 Rc7-c3 Kf3-f2 Rc3-c4 Kf2-f3 Rc4-c3
00:08 1121847 (89898) 16 -5.65 Re6xa6 Rg3-g2 Kf2-f3 Rg2-g5 Ra6-a1 Rg5-g1 Ra1-a8
Rg1-f1 Kf3-e3 Rf1-f7 Ra8-g8 Rf7-c7 Ke3-f3 Rc7-c3 Kf3-f2 Rc3-c4 Kf2-f3 Rc4xb4 Rg8
-e8 Rb4-b3 Kf3-f2 Rb3-b2 Kf2-f3 Rb2-b1 Re8-d8
00:15 2033969 (172871) 17 -5.66 Re6xa6 Rg3-g2 Kf2-f3 Rg2-g5 Ra6-a1 Rg5-g1 Ra1-a8
 Rg1-f1 Kf3-e3 Rf1-f7 Ra8-g8 Rf7-c7 Ke3-f3 Rc7-c3 Kf3-f2 Rc3-c4 Rg8-a8 Rc4-f4 Kf
2-e2
++ e6-e1
00:15 2089162 (173038) 17 MATE07 Re6-e1 Rg3-g1 Re1-f1 Rg1xf1 Kf2xf1 a6-a5 b4xa5
b5-b4 a5-a6 b4-b3 a6-a7 b3-b2 a7-a8Q
00:15 2098043 (173038) 18 MATE07 Re6-e1 Rg3-g1 Re1-f1 Rg1xf1 Kf2xf1 a6-a5 b4xa5
b5-b4 a5-a6 b4-b3 a6-a7 b3-b2 a7-a8Q
00:16 2117322 (173800) 19 MATE07 Re6-e1 Rg3-g1 Re1-f1 Rg1xf1 Kf2xf1 a6-a5 b4xa5
b5-b4 a5-a6 b4-b3 a6-a7 b3-b2 a7-a8Q
00:16 2136745 (174272) 20 MATE07 Re6-e1 Rg3-g1 Re1-f1 Rg1xf1 Kf2xf1 a6-a5 b4xa5
b5-b4 a5-a6 b4-b3 a6-a7 b3-b2 a7-a8Q
00:16 2181692 (174281) 21 MATE07 Re6-e1 Rg3-g1 Re1-f1 Rg1xf1 Kf2xf1 a6-a5 b4xa5
b5-b4 a5-a6 b4-b3 a6-a7 b3-b2 a7-a8Q
00:17 2240891 (174334) 22 MATE07 Re6-e1 Rg3-g1 Re1-f1 Rg1xf1 Kf2xf1 a6-a5 b4xa5
b5-b4 a5-a6 b4-b3 a6-a7 b3-b2 a7-a8Q
00:17 2267612 (174522) 23 MATE07 Re6-e1 Rg3-g1 Re1-f1 Rg1xf1 Kf2xf1 a6-a5 b4xa5
b5-b4 a5-a6 b4-b3 a6-a7 b3-b2 a7-a8Q
00:18 2301432 (174571) 24 MATE07 Re6-e1 Rg3-g1 Re1-f1 Rg1xf1 Kf2xf1 a6-a5 b4xa5
b5-b4 a5-a6 b4-b3 a6-a7 b3-b2 a7-a8Q
00:18 2335058 (174627) 25 MATE07 Re6-e1 Rg3-g1 Re1-f1 Rg1xf1 Kf2xf1 a6-a5 b4xa5
b5-b4 a5-a6 b4-b3 a6-a7 b3-b2 a7-a8Q
00:19 2414393 (174689) 26 MATE07 Re6-e1 Rg3-g1 Re1-f1 Rg1xf1 Kf2xf1 a6-a5 b4xa5
b5-b4 a5-a6 b4-b3 a6-a7 b3-b2 a7-a8Q
00:20 2491663 (174752) 27 MATE07 Re6-e1 Rg3-g1 Re1-f1 Rg1xf1 Kf2xf1 a6-a5 b4xa5
b5-b4 a5-a6 b4-b3 a6-a7 b3-b2 a7-a8Q
00:20 2530860 (174815) 28 MATE07 Re6-e1 Rg3-g1 Re1-f1 Rg1xf1 Kf2xf1 a6-a5 b4xa5
b5-b4 a5-a6 b4-b3 a6-a7 b3-b2 a7-a8Q
00:21 2591785 (174879) 29 MATE07 Re6-e1 Rg3-g1 Re1-f1 Rg1xf1 Kf2xf1 a6-a5 b4xa5
b5-b4 a5-a6 b4-b3 a6-a7 b3-b2 a7-a8Q
00:22 2663804 (174942) 30 MATE07 Re6-e1 Rg3-g1 Re1-f1 Rg1xf1 Kf2xf1 a6-a5 b4xa5
b5-b4 a5-a6 b4-b3 a6-a7 b3-b2 a7-a8Q
00:23 2754707 (175006) 31 MATE07 Re6-e1 Rg3-g1 Re1-f1 Rg1xf1 Kf2xf1 a6-a5 b4xa5
b5-b4 a5-a6 b4-b3 a6-a7 b3-b2 a7-a8Q
00:24 2822168 (175070) 32 MATE07 Re6-e1 Rg3-g1 Re1-f1 Rg1xf1 Kf2xf1 a6-a5 b4xa5
b5-b4 a5-a6 b4-b3 a6-a7 b3-b2 a7-a8Q
00:25 2854728 (175133) 33 MATE07 Re6-e1 Rg3-g1 Re1-f1 Rg1xf1 Kf2xf1 a6-a5 b4xa5
b5-b4 a5-a6 b4-b3 a6-a7 b3-b2 a7-a8Q
00:26 2915639 (175196) 34 MATE07 Re6-e1 Rg3-g1 Re1-f1 Rg1xf1 Kf2xf1 a6-a5 b4xa5
b5-b4 a5-a6 b4-b3 a6-a7 b3-b2 a7-a8Q
00:27 2975900 (175259) 35 MATE07 Re6-e1 Rg3-g1 Re1-f1 Rg1xf1 Kf2xf1 a6-a5 b4xa5

guess you already saw the big advantage of the double nullmove in the
far endgame especially. You don't need to turn nullmove off at all
(except pawn endgame where usually there is more as a single nullmove),
so if you're searching in an endgame say  KRB KRN with a bunch of pawns
on the board or any similar endgame, where after exchanging a single piece
most turn off their nullmove, now you can easily keep using nullmove.

No nodes lost, you keep searching with nullmove turned on!


>Good luck with your writing,

You're welcome

>=Ernst=



This page took 0 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.