Author: Robert Hyatt
Date: 08:26:18 02/20/03
Go up one level in this thread
On February 20, 2003 at 03:16:58, Ed Schröder wrote: One point. After you try a few such moves, you can become pretty well convinced that this is an ALL node where move ordering is irrelevant. You ought to turn it off after N moves have not produced a cutoff. N is something you have to come up with of course. I do this with the History heuristic and I use N=4 myself, as I have already tried the hash move, good captures (SEE says gain >= 0) and killer moves. >Taken from my web-page: > >Contrary to most chess programs, when going one ply deeper in the chess tree >REBEL generates all moves for the given (and new) ply. During move generation >REBEL quickly evaluates each move generated by using the piece-square technique, >this evaluation is only used for move ordering later, it is certainly not for >evaluating the position. > >The advantage of this time consuming process is that it pays off later when move >ordering becomes an issue, this provided you have created 12 reasonable >organized piece-square tables for the move generator. REBEL's data structure for >move generation looks as follows: > >static char move_from [5000]; >static char move_to [5000]; >static char move_value [5000]; > >So when adding a new generated move to "move_from" and "move_to" REBEL also will >fill "move_value" via the corresponding piece-square table using the formula: > >move_value = table[move_to] - table[move_from]; > > >http://members.home.nl/matador/chess840.htm > >============== > >Data structure of "move_value" : > >255 : end of move list. >1-254 : move_value = table[move_to] - table[move_from]; >0 : move already searched. > >Now whenever the Search needs a (new) move a routine is called that gets the >(next) highest move from the move list and then this move is marked (zeroed) as >being searched. > >This is a costly operation, during the years this is the best (fastest) code I >was able to produce. The question is if there are better (faster) methods to get >the highest value from an unsorted table. > >The main loop: > > value=1; // work variable > x=.... // pointer to move list table > y=-1; // pointer to highest value > >loop: x++; if (move_value[x] <= value) goto loop; > if (move_value[x] == 255) return y; > value=move_value[x]; > y=x; > goto loop; > >-> "y" is the highest move from the table. > >=================== > >in ASM I have this: > > mov BL,1 // work variable > mov EDX,... // pointer to move list table > mov ESI,-1 // pointer to highest value > >loop: mov CL,move_value[EDX] // CL = move_value[x] > inc EDX // x++ > > cmp CL,BL // if (move_value[x] <= value) > jbe loop > > cmp CL,0FFh // if (move_value[x]==255) > je done > > mov BL,CL // value=move_value[x] > mov ESI,EDX // y=x > > jmp loop > > >============== > >Any faster methods? > >Ed
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.