# Computer Chess Club Archives

## Messages

### Subject: Re: Static Exchange Eval (SEE)

Author: Steve Maughan

Date: 04:16:43 07/12/01

Go up one level in this thread

```Leen,

Do you sort the tables att[] amd def[]?  I ask since I cannot see a loop in the
SEE routine.  If there is no ordering it is possible that the scores returned
are incorrect e.g. it may be profitable to take with a Bishop but not a Queen
since the piece is defended by a Rook.

Am I missing something?

Regards,

Steve Maughan

>On July 11, 2001 at 09:20:15, JW de Kort wrote:
>
>>On July 10, 2001 at 07:44:50, Leen Ammeraal wrote:
>>
>>>There was a question about Static Exchange Evaluation
>>>in CCC a short while ago, with reactions from
>>>Bob Hyatt and Bruce Moreland. Strangely enough,
>>>these postings, along with one from myself, seem
>>>to have disappeared, so I send my contribution
>>>once again below.
>>>
>>>
>>>Here is my function for Static Exchange Evaluation.
>>>==================================================
>>>It is based on the value cur of the current piece
>>>on the board that is first to be captured, and
>>>two tables:
>>>
>>>att[nAtt-1], ..., att[0]  values of attackers
>>>def[nDef-1], ..., def[0]  values of defenders
>>>
>>>Note the order: att[nAtt-1] is the first attack, etc.
>>>Let's rewrite Hyatt's example RxR RxR QxR BxQ
>>>as follows, to distinguish between the three rooks
>>>involved:
>>>
>>>R1xR0 R2xR1 QxR2 BxQ
>>>
>>>Then we have:
>>>cur = R0, nAtt = nDef = 2,
>>>att[1] = R1, att[0] = Q
>>>def[1] = R2, def[0] = B
>>>This function returns the value 0 in this case:
>>>
>>>// Static Exchange Evaluation:
>>>int gain(int cur, int *att, int nAtt, int *def, int nDef)
>>>{  int retval = 0;
>>>   if (nAtt)
>>>   {  int profit = cur - gain(att[nAtt-1], def, nDef, att, nAtt-1);
>>>      if (profit > 0)
>>>         retval = profit;
>>>   }
>>>   return retval; // Always >= 0
>>>}
>>>
>>>Explanation: the profit of capturing a piece is equal
>>>to the value of that piece minus the profit of the
>>>opponent after this capture, except that a profit is
>>>set to zero when this computation gave a negative result.
>>>So far, I did not succeed in replacing this function
>>>with a faster, nonrecursive one. It would be nice if
>>>anyone of this forum did and showed an equivalent
>>>but faster version.
>>>
>>>Leen Ammeraal
>>>http://home.wxs.nl/~ammeraal/
>>
>>Dear mr Ammeraal,
>>
>>Could you plese give some explaination regarding this sources. e.g how do you
>>fill the att[] en def[] arrays?
>>
>>Bedankt!
>>
>>Jan Willem de Kort
>
>In the case of RxR RxR QxR BxQ
>with piece values R = 500, Q = 900, B = 300,
>you use
>
>cur = 500, nAtt = nDef = 2,
>att[1] = 500, att[0] = 900
>def[1] = 500, def[0] = 300
>
>and you call the function 'gain' as follows:
>
>  value = gain(cur, att, nAtt, def, nDef);
>
>This sets values = 0, as it should, since this
>swapoff is not profitable. But it also works
>in all other cases, as far as I am aware.
>
>Veel succes,
>Leen

```