Don wrote:jwes wrote:Don wrote:jwes wrote:bob wrote:
There are only two types of pruning in the alpha/beta framework. The first is called "backward pruning" and is the basic alpha/beta pruning mechanism. The second is forward pruning, where you generate a set of moves, and then say "these will be searched and these are going to be tossed out." IE the shannon type-B strategy.
What would you call pruning where you search some move sufficiently to decide it is a stupid move rather than a sacrifice and then mark it so that on future iterations you do not search it again?
That's the kind of pruning I am talking about, a move that is permanently marked as "never play". But it's STILL called forward pruning.
I would also call it a bad idea. Do any programs do this?
You can never be sure that a move that looks really bad actually is a very good move and a scalable program should never say never, although it's correct to give them much less consideration. But on a future iteration it should be possible to discover anything.
If the score is perfect, of course this does not apply because we need not search perfect moves, such as moves that reference an endgame database or simple ending that can be marked as a draw.
I think that sometimes you can be sure a move is bad, particularly in endgames.
Consider this position. How many ply do you need to analyze before you are sure a6 is a bad move? A human would never even consider this move.
I'm not sure we are talking about the same thing.
What I'm talking about is hard core pruning without any additional consideration ever - in a practical chess playing program.
Yes, you can construct positions like this where it's obvious that a6 is wrong, but I don't believe you can actually put this into a heuristic that can be applied to a chess program with 100 percent accuracy. If you can, then please tell me what it is?
What rule that is 100% correct will also tell you not to play a6 in this position?
I think if you try to produce such a rule, you will understand what I am saying.
[d]6k1/p4ppp/1p6/1P6/P7/8/6PP/6K1 b - - 0 1
It is possible to do this if you have a precalculation engine that computes based upon board configurations and bitmaps.
For instance, in this configuration, it will know (having precalculated) that the pawn race is lost. Therefore, the move is known a-priori as lost.
This is done by a program generator that performs incremental evaluations as a function of chessmen remaining on the board and has precomputed pawn race distances etc. already calculated.
For every combination of chessmen, there is a different move generator. Of course, this is impossibly tedious. That is why a function generator program is needed.
So, for instance, if the generated program list consumes 10 GB of source code it matters little because you did not have to write it -- you only had to write the function that writes the functions. (Of course, you are thinking about spilling the instruction cache by switching all these functions. But the functions change somewhat slowly over time because a program will not instantly go from 32 chessmen down to 4).