Генератор шахов для ФВ. (не битбоард)

Тема в разделе "Машинное отделение", создана пользователем NS, 20 июл 2006.

  1. TopicStarter Overlay

    NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Какие есть варианты генератора шахов?
    Используются ли в ФВ генераторы всех шахов (включая вскрытые)
    Для шахов пешками и конями всё понятно - в основном интересуют шахи дальнобойных фигур.
    Я пробовал два варианта -
    1. Генерация всех ходов и проверка на шах. (Любой фигур, только ходившей фигурой и т.д.)
    2. Составление списка битых полей по типам (ладейные, слоновые) - Генерацией ходов ферзя от короля.
    И при генерации взятий, при проходе через такие поля - добавление ходов на них в список.

    Если более быстрые варианты?
    Используется ли вариант, где из предопределенного массива с списком[координатаКороля,КоординатаФигуры] по типам фигур - выцепляются поля с которых можно дать шах? (Для Ладьи, Слона, Коня получается максимум по два поля)
    Используется ли вариант аналогичный определению связанных фигур, но не связанная фигура соперника, а своя Фигура/пешка - ходом которой можно дать шах. (Для пешек в случая взятия на проходе возможен горизонтальный шах через две пешки - свою и соперника)
    Используется ли в ФВ генерация шаха Рокировкой? (То есть рокировались, и при этом ладьей дали шах сопернику)
  2. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Советую посмотреть исходники Phalanx. Мне понравилось :)

    Перед генерацией ходов ФВ для всех полей устанавливается тип фигур, которые могут атаковать короля с этого поля.
    Далее при генерации хода просто проверяем, что тип текущей фигуры совпадает с предустановленным, значит это шах.

    Вскрытые шахи немного иначе. Нужно продолжить луч (если он есть и если фигура уходит с него) от короля до ходящей фигуры, пока не найдем фигуру. Если она может атаковать вдоль луча, то значит и будет шах.

    Я даже не помню приделал ли я к Кошке вскрытые шахи :)

    >Используется ли в ФВ генерация шаха Рокировкой? (То есть рокировались, и при этом ладьей дали шах сопернику)
    Не надо лишнего фанатизма!!!
  3. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Посмотрел в код. Кошка смотрит в ФВ вскрытые шахи.
    В начале создается список как бы связанных фигур (т.е. собственных фигур закрывающих атаку на короля какой-либо другой фигуры). Затем генерим ходы этими фигурами, но не вдоль луча атаки.
  4. TopicStarter Overlay

    NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Перед генерацией ходов ФВ для всех полей устанавливается тип фигур, которые могут атаковать короля с этого поля.
    Далее при генерации хода просто проверяем, что тип текущей фигуры совпадает с предустановленным, значит это шах.


    У меня такой генератор и был в шахматах на 1С (Пометка полей (Процедурой генерации ходов дальнобойных фигур от короля соперника) + генерировал шах рокировкой - это не так долго, расценивается как ход ладьей на помеченное поле, только как обычно нужно проверить на легальность (проверка трех полей на бой)), и такой я планировал и тут, но решил сделать вместе с вскрытыми.

    Спасибо, попробую сделать с списком связанных, и с пометкой полей на доске (признак связанности)... Как быстрее получится...
    При проверке на связанность - сначала по предопределенному массиву смотрим находится ли король и дальнобойная фигура на одной линии? Хотя наверно сейчас это уже стало стандартом даже в проверке на шах...
  5. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    >При проверке на связанность - сначала по предопределенному массиву смотрим находится ли король и дальнобойная фигура на одной линии?

    Это довольно просто.
  6. TopicStarter Overlay

    NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Да я знаю, что просто. Вычли одну координату из другой и прибавили дельту, потом по полученному числу смотрим в массиве.
    Но не факт что это быстрее. В проверке на связанность - может быть, а в проверке на шах - король обычно закрыт, и строя лучи от короля очень быстро натыкаемся на препядствия.
    И чтоб проверить находятся ли фигуры на одной линии - нужно хранить координаты всех фигур. А у меня хранится только координата короля, а остальных фигур только общее количество (по видам)
  7. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.492
    Симпатии:
    3.122
    Репутация:
    95
    Адрес:
    Москва
    Онлайн
    А в эндшпиле - ровно наоборот. Король открыт, сканировать по лучам надо много. Может быть, стоит динамически выбирать алгоритм проверки на шах, в зависимости от кол-ва фигур на доске.
  8. TopicStarter Overlay

    NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Я же не могу динамически строить исполнитель хода и структуру хранения позиции?
    У меня сейчас не хранятся координаты фигур, а перед проверкой на шах каждый раз сканировать всю доску - очень долго.
    проверка на шах замедлится в разы.
    И если хранить - то как хранить список пешек? Каждый раз в исполнителе пробегать список пешек и смотреть какую из них съели?
    Или координаты именно пешек не хранить, а хранить только координаты фигур? Или только дальнобойных фигур?

    В эндшпиле да, но ведь хранится Количество фигур, и если у "шахующей" стороны на доске нет ладей и ферзей, то лучи ладьи не строим, и тоже самое со слонами/ферзями....
  9. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Я шах определяю когда делаю ход. Т.е. нужно не искать всё по всей доске, а достаточно проверить шаховала ли последняя ходившая фигура или может быть открыла шахующую фигуру.

    Так заметно быстрее. Но не критично.
  10. TopicStarter Overlay

    NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    То есть убирается проверка на шах... Проверки на легальность хода тоже нет?
    Хотя тогда она не нужна, съедим короля... А в ответ на шах генерируются только легальные ходы?
    И сортировки... Включение в сортировку признака шаха нужно? Чтоб все несокращаемые ходы по LMR были в начале?
    И в стандартной схеме LMR не делается сокращение по LMR на всех взятиях... А на плохих по SEE? Раз они по сортировке рассматриваются после тихих ходов, значит считается что они реже бывают опровергающими, значит на них ведь нужно сокращать!
  11. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.492
    Симпатии:
    3.122
    Репутация:
    95
    Адрес:
    Москва
    Онлайн
    Нелегальным ходом может быть и рокировка через битое поле. Или рокировка из-под шаха. После неё короля съесть не удастся. Так что функцию определения шаха так или иначе иметь придётся. Но если использовать её только для проверки рокировок, это наверное экономия.
  12. TopicStarter Overlay

    NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Да конечно оставлю.... Легальность рокировки у меня проверяется в генераторе ходов.
    А вот ответ на шах... Если проверять боем будет замедление.... То есть нужно проверять легальность ответа на шах (а если делать продление на единственном ответе - то нужно проверять все ходы до первого исполнения) Продление на единственном ответе на шах я хочу оставить.

    Кстати - продление на разменах, с включенным LMR в моей схеме всё-таки немного понижает силу....
    Попробую его включить только в PV ветвях.
    И продление на угрозе мата - силу не повышает, хотя определенную тактику видет лучше.
    Можно покрутить немного - например оставить LMR при защите от угрозы, и возвращать сокращение по LMR, (если оно было) на самой угрозе. То есть если сократили, а ход оказался угрозой, то Depth увеличиваем на единицу, и cоответственно верификацию LMR не делаем.
    Так же не работает продление на ходе пешки на шестую. (но несокращение по LMR на нем оставлю)
    Остаются только три работающие - Шах, Единственный ответ на шах, Ход пешки на седьмую.
  13. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    У меня такие продления:
    -шах
    -ход пешкой на седьмую
    -размен фигур(пешки не считаются)
    -угорза мата

    У меня легальность ходов не проверяется (в генераторе ходов), так что не могу придумать как сделать продление при единственном ответе на шах.
    Я проверяю легальность сразу после исполнения хода.

    Делать спец. генератор для ходов под шахом просто лень.

    >Включение в сортировку признака шаха нужно? Чтоб все несокращаемые ходы по LMR были в начале?
    Так ли нужно, чтобы шахи были в начале?

    >А на плохих по SEE?
    Вроде все сокращают. Какие сомнения?
  14. TopicStarter Overlay

    NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Я уже не помню где читал - но написано было - "не сокращаем на взятиях" Вроде это написал Tord (Glauring)
    Но с моим абсолютным незнанием Английского я мог неправильно понять. :)
  15. TopicStarter Overlay

    NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    if (UseHistory && depth >= HistoryDepth && node_type != NodePV) {
    if (!in_check && played_nb >= HistoryMoveNb && new_depth < depth) {
    ASSERT(best_value!=ValueNone);
    ASSERT(played_nb>0);
    ASSERT(sort->pos>0&&move==LIST_MOVE(sort->list,sort->pos-1));
    value = sort->value; // history score
    if (value < HistoryValue) {
    ASSERT(value>=0&&value<16384);
    ASSERT(move!=trans_move);
    ASSERT(!move_is_tactical(move,board));
  16. TopicStarter Overlay

    NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Это кусок из Тоги последней был. Не сокращает на взятиях...

    Плюс в Тоге продление на разменах в PV ветвях, причем разменом считается ЛЮБОЕ ответное взятие независимо от взятой Фигуры и т.д.!?

    if ((single_reply && ExtendSingleReply)
    || (in_pv && MOVE_TO(move) == board->cap_sq // recapture
    /* && (see_move(move,board) > 0 || ABS(VALUE_PIECE(board->square[MOVE_TO(move)])-VALUE_PIECE(board->square[MOVE_FROM(move)])) <= 250 ) */)

    Проверка на хорошее взятие по SEE, на взятие пешки, и на разницу в весе фигур закомментирована.
    У меня намного более жесткое определение размена.
  17. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Вспомнил еще про продление Ботвинника-Маркова (при чем здесь Ботвинник?). Знает кто-нибудь точно что это такое?

    Основная идея: если наш пустой ход опровергается ходом последней ходившей фигуры, то по видимому этот ход содержит какую-то тактическую угрозу и лучше посмотреть этот вариант подальше.


    Есть еще одна идея продления - переход в пешечное окончание, но я ее не пробовал.
  18. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Да, вспомнил у меня тоже плохие взятия не сокращаются. Хотя может быть стоит попробовать.
  19. TopicStarter Overlay

    NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Мне наверно такие продления рано еще добавлять, а единственное прибавляющее серьезно к силе - это на шахах... (100 Elo)

    Основная идея: если наш пустой ход опровергается ходом последней ходившей фигуры, то по видимому этот ход содержит какую-то тактическую угрозу и лучше посмотреть этот вариант подальше.

    Мне казалось. что я его придумал, и писал об этом на форумах :)))
    Но возможно я его где-то просто видел. :)
    Есть другая идея - Продление на повторном ходе той-же фигуры (опять-таки через пустой ход) - но в том случае если фигура сразу на это поле пойти не могла (и есно ход не является возвратом фигуры назад). Позволяет видеть "длинные" манёвры и переводы фигур. (то есть убирает Эффект горизонта вызванный пустым ходом)
  20. Сергей Марков Учаcтник

    • Участник
    Рег.:
    13.05.2006
    Сообщения:
    136
    Симпатии:
    6
    Репутация:
    0
    Оффлайн
    > Основная идея: если наш пустой ход опровергается ходом последней ходившей фигуры, то по видимому этот
    > ход содержит какую-то тактическую угрозу и лучше посмотреть этот вариант подальше.

    Не-не, идея совсем в другом :)
    Смотрите в соответствующей теме.

    Ботвинника равно как и меня сюда приписал Ромстад, а потом все подхватили. У меня в оригинале это называлось "same threat extension", т.е. расширение про той-же угрозе.
  21. TopicStarter Overlay

    NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Я же не о продлении "Маркова", а о своем продлении :)

Поделиться этой страницей