Sorting captures

на главную страницу


Конечно же, здесь мы будем говорить о mvv/lva. Эта аббревиатура расшифровывается как «most valuable victim / least valuable aggressor». Если перевести на русский, то это звучит как наиболее ценная жертва/наименее ценный агрессор. Суть данной сортировки отраженна очень точно.
Несмотря на ее простоту, она принципиально важна, когда мы в быстром поиске считаем только взятия. Именно эта сортировка позволяет просчитывать взятия до конца, не зарываясь при этом.

Оцениваем взятия следующим образом:
взятая фигура – берущая фигура

Потом сортируем по величине оценки, начиная с максимальной и дальше по убыванию.

Оценка для сортировки у меня следующая:
1 - пешка 2 - конь 3 - слон 4 - ладья 5 - ферзь 6 – король

Например, мы пешкой съели ферзя, тогда оценка будет
5 – 1 = 4

или мы ладьей съели ферзя, тогда оценка будет
5 – 4 = 1

или конем съели ладью
4 – 2 = 2

Ясно, что после сортировки на первом месте будет 4, на втором 2 на третьем 1.


В Ифрите (Ifrit_b2_6) реализация следующая:

оценку даем в генераторе ходов
// записываем оценку взятия(mvv/lva в моем понимании) для последующей сортировки
list_surplus_moves->sorting_score[p] = capture - name;

а сортируем в отдельной функции после генерации всех ходов.
for (n = 0 ; n < captures ; n++){
  for (int i = n + 1 ; i < captures ; i++){

  if(list_surplus_moves->sorting_score[n] < list_surplus_moves->sorting_score[i]){
     // сохраняем данные из n
     move_s = list_surplus_moves->move[n];
     score_s = list_surplus_moves->sorting_score[n];

     // копируем из i в n
     list_surplus_moves->move[n] = list_surplus_moves->move[i];
     list_surplus_moves->sorting_score[n] = list_surplus_moves->sorting_score[i];

    // восстанавливаем запись
    list_surplus_moves->move[i] = move_s;
    list_surplus_moves->sorting_score[i] = score_s;

   }// if(list_surplus_moves->sorting_score[n] < list_surplus_moves->sorting_score[i]){
  }//for (int i=0;i<m;i++){
}//for (int n=0;n<m;n++){


Пробовал также схему
100 * взятая фигура – берущая фигура

В результате получилось:

взятая фигура – берущая фигура
9/9       00:45    25.499.252    780.290    +0,29   e2e4 e7e5 Ng1f3 Bf8d6 d2d4 e5xd4 Qd1xd4 Ng8f6 Bf1c4
10/10   04:41   102.801.673   559.898    +0,09   e2e4 e7e5 Ng1f3 Ng8f6 d2d4 e5xd4 e4e5 Qd8e7 Qd1xd4 Nb8c6

100 * взятая фигура – берущая фигура
9/9      00:43    25.307.131    795.960    +0,29   e2e4 e7e5 Ng1f3 Bf8d6 Bf1c4 Ng8f6 d2d4 e5xd4 Qd1xd4
10/10  04:57   123.698.495   603.137    +0,09   e2e4 e7e5 Ng1f3 Ng8f6 d2d4 e5xd4 e4e5 Qd8e7 Qd1xd4 Nb8c6