Robert Hyatt
Joined: 27 Feb 2006 Posts: 15816 Location: Birmingham, AL
|
Post subject: Re: An experimental draw recognizer function Posted: Thu Mar 15, 2012 2:10 pm |
|
|
| ethanara wrote: |
Hi
When I was walking around, i got this idea for engines to better recognise whether or not a position is draw due to the 50 move rule. The idea is based on the fact that if you cant get a better position/win material et cetera within 50 moves, the game is a draw. Here it is in pseudo-code (in the search function):
| Code: |
if position_is_endgame && saved_before_flag == false then
first_eval_in_endgame = score
saved_before_flag = true
first_eval_in_endgame_depth = depth
|
and later in search, in a further depth
| Code: |
score = evaluate()
eval_difference = first_eval_in_endgame - score
if saved_before_flag == true && eval_difference > Table[depth_difference] then
return draw
|
So, it is basically saying that if you or your opponent don't improve your position with x centipawns in y depth, then it is quite surely a draw.
Table should be something like this:
| Code: |
Table[64] = "5, 7, 10, 13, 15, 17, 20" // and so on....
|
Of course, if you're over a special margin (1½ pawn or so), it will be completely dumb to do this.
The only problems remaining is having good values in table and a good endgame knowledge.
I will test this with doublecheck
Regards
Ethan |
There are other approaches as well. In Crafty, once we start to approach the 50 move rule, I start to pull the score back toward zero. This makes any sort of move that produces progress to look better if it resets the 50 move counter.
There is a danger, of course. You can try so hard to avoid a draw, that you lose, if your eval is not really accurate. |
|