Author: Robert Hyatt
Date: 10:51:38 11/22/00
Go up one level in this thread
On November 22, 2000 at 11:25:19, Severi Salminen wrote:
>Hi!
>
>There is something wrong in my chess program. I'm trying to search the PV moves
>first, then the captures and then non_captures. A question:
>
>Does a move belong to PV _allways_ when its score is >alpha and <beta? And can I
>use this assumption to find all PV moves by backing up from PV leaf to root?
>
By definition, yes. But remember that there is an order dependency in this.
IE the most recent moves >alpha and < beta are the real PV moves, and could
replace PV moves found earlier in this iteration or search.
>My program has a separate root_search() and search(). In search I first check
>wheteher the last move was a PV move and then if we still have moves left in PV
>it swaps the first generated move and the PV move for that ply. Then we make
>moves (so the first is the PV move). And allways when I have alpha<score<beta I
>make the move we tried a PV move for that ply. For some unknown reason a certain
>position results a situation where my program tries to make a PV move which is
>not possible. The PV points to a move that is not in the move list of current
>ply.
Be careful. It is possible to back up a value of "alpha" after searching every
move and finding that the successive ply fails high each time. You now have
a score you are backing up, but you have _no_ PV to go along with it. If your
test is wrong, you can break. Same thing happens on a fail high. You can back
up the current move as a best move for the 'fail-high PV', but you will have
_no_ moves below that node in the PV array. It will probably contain old
moves that were not overwritten. This will wreck you.
>
>// Here I test whether the last move was PV move and we have still PV moves
>// left
>
>if((Follow_PV[Ply-1]==1)&&(PV_lenght>Ply))
> swap_moves(&Moves[Firstmove[Ply]],&Moves[PV[Ply]]);
>
>// Here I test if the move we made was a PV move
>makemove(Moves, k, ptr);
>if((k==Firstmove[Ply])&&(Follow_PV[Ply-1]==1)&&(PV_lenght>Ply))
> Follow_PV[Ply]=1;
>else Follow_PV[Ply]=0;
>
>
>// This is done if beta>score>alpha
>// This basically avoids any problems because of the swapping we made
>if((Follow_PV[Ply-1]==1)&&(PV_lenght>Ply))
> {
> if(k==PV[Ply])
> PV[Ply]=Firstmove[Ply];
> else if(k!=Firstmove[Ply])
> PV[Ply]=k;
> }
>else
> PV[Ply]=k;
>
>
>Any suggestions? (It was a bit unclear explanation, but...)
>
>Severi
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.