Author: Omid David Tabibi
Date: 20:31:01 10/04/03
Go up one level in this thread
On October 04, 2003 at 22:22:33, Omid David Tabibi wrote:
>On October 04, 2003 at 18:57:18, Vincent Diepeveen wrote:
>
>>On October 04, 2003 at 18:40:08, Russell Reagan wrote:
>>
>>Just put next in your engine:
>> - checks in qsearch at the first ply (or when you already did them
>> just stick to what you did now; in diep i do them at any ply in qsearch
>> btw, but most have problems controlling that so i do not mind it if you
>> just try 1 ply)
>> - nullmove search with window alfa,beta = -mate+1000,
>> so you'll find 100% sure a mate threat
>>
>> - if you see a mate threat you extend that position by 1 ply and store
>> in hashtable this position got a mate extension.
>>
>> - now you extend moves double sometimes. So recapture that gives extension,
>> you extend. If the same move also gives opponent a check, another extension.
>> So you can extend 2 plies then.
>
>2 plies extension at once? What if you detected a mate threat and played a move
>which is a recapture and also checks the opponent? Extend by 3 plies?!
>
>Seems a little frightening! But will try it tonight...
Interesting... very interesting...
[D]1r4k1/1q2bp2/3p2p1/2pP4/p1N4R/2P2QP1/1P3PK1/8 w - - 0 1
Doing all what you said, i.e. calling null-move search with (-beta, 9000),
extending for mate, check, recapture, (which can result in up to 3 ply
extensions at one time) and not limiting any extensions, the following is
Falcon's analysis of the above position on a slow 733 MHz system:
depth time nodes nps score variation
1/ 3-> 0.00 0k 0k 1.26 1.h4h1
2/ 6-> 0.00 0k 0k 0.55 1.h4h6 g8f8
3/11-> 0.01 2k 202k 1.10 1.h4h6 b8e8 2.h6h1
4/10-> 0.04 7k 187k 0.49 1.h4h6 b8e8 2.g2g1 g8f8
5/13-> 0.07 15k 219k 0.76 1.h4h6 b7b3 2.f3e4 e7g5 3.h6h1
6/13 0.09 20k 228k 0.50 1.h4h6 b7b3 2.f3e4 e7g5 3.h6h1 f7f5
6/18-> 0.16 38k 241k 0.50 1.h4h6 b7b3 2.f3e4 e7g5 3.h6h1 f7f5
7/15 0.29 73k 254k 0.33 1.h4h6 e7f8 2.h6h1 f7f5 3.f3d3 b8e8
4.d3d2
7/17 0.41 104k 255k 0.62 1.h4h1 f7f5 2.g3g4 b7b5 3.f3e2 b5d7
4.g4f5 g6f5
7/17-> 0.47 120k 256k 0.62 1.h4h1 f7f5 2.g3g4 b7b5 3.f3e2 b5d7
4.g4f5 g6f5
8/18 0.79 198k 251k 0.50 1.h4h1 f7f5 2.g3g4 f5g4 3.f3e4 g8g7
4.f2f3 g4f3 5.e4f3 b8f8
8/33 4.71 1192k 253k 0.92 1.c4d6
8/64 11.47 2915k 254k 5.97 1.c4d6 e7d6 2.f3f6 b7d5 3.g2h2 d5h5
4.h4h5 g6h5 5.f6d6 b8b2 6.d6c5
8/64-> 11.48 2915k 254k 5.97 1.c4d6 e7d6 2.f3f6 b7d5 3.g2h2 d5h5
4.h4h5 g6h5 5.f6d6 b8b2 6.d6c5
In 4 seconds it reached a depth of 33 and failed high on the correct move, then
re-searched it to the max-depth of 64 plies and finished the iteration in 11
seconds.
Now I removed the 64 ply depth limit:
depth time nodes nps score variation
1/ 3-> 0.01 0k 6k 1.26 1.h4h1
2/ 6-> 0.02 0k 28k 0.55 1.h4h6 g8f8
3/11-> 0.02 2k 101k 1.10 1.h4h6 b8e8 2.h6h1
4/10-> 0.04 7k 187k 0.49 1.h4h6 b8e8 2.g2g1 g8f8
5/13-> 0.06 15k 255k 0.76 1.h4h6 b7b3 2.f3e4 e7g5 3.h6h1
6/13 0.09 20k 228k 0.50 1.h4h6 b7b3 2.f3e4 e7g5 3.h6h1 f7f5
6/18-> 0.16 38k 241k 0.50 1.h4h6 b7b3 2.f3e4 e7g5 3.h6h1 f7f5
7/15 0.28 73k 263k 0.33 1.h4h6 e7f8 2.h6h1 f7f5 3.f3d3 b8e8
4.d3d2
7/17 0.42 104k 248k 0.62 1.h4h1 f7f5 2.g3g4 b7b5 3.f3e2 b5d7
4.g4f5 g6f5
7/17-> 0.48 120k 251k 0.62 1.h4h1 f7f5 2.g3g4 b7b5 3.f3e2 b5d7
4.g4f5 g6f5
8/18 0.78 198k 254k 0.50 1.h4h1 f7f5 2.g3g4 f5g4 3.f3e4 g8g7
4.f2f3 g4f3 5.e4f3 b8f8
8/33 4.67 1192k 255k 0.92 1.c4d6
8/219 4.67 1192k 255k 1.c4d6 (1/37)
Reached the depth of 219 plies until the engine crashed!!! :)
>
>Looking at Fritz's parameters, the default values are selectivity=2, and
>futility pruning activated. So, we can assume that Fritz is using R=2. However,
>looking at its analysis it rapidly reaches very deep while not ignoring any
>significant tactical threats. That's also the case with Shredder, which uses
>selectivity=-1 (it is not a typo, -1 ?!) and futility=2.
>
>Falcon's tactical strength is somewhat superior to that of Crafty, but comparing
>it to other null-movers, Fritz and Shredder, it is way behind in tactics...
>
>BTW, when in quiescence you detect that one side is in check, do you do the
>following:
>
>int quiesce(int alpha, int beta) {
> ...
> if (checked)
> return search(alpha, beta, 1);
> ...
>}
>
>
>I haven't implemented checks in quiescence yet, but it seems inevitable...
>
>
>>>I don't think Christophe uses null move. At least, if he does, I don't think
>>>it's the "main algorithm" contributing to Chess Tiger's strength. I remember
>>
>>May i beg your pardon?
>>
>>Without nullmove you can go home.
>
>Junior and Rebel are good examples of non null-mover successful programs. And
>there are some strange programs like Hiarcs; I don't think it is using null-move
>pruning, at least not anything with R > 1.
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.