Перебирают ли движки все возможные позиции на заданную глубину?

Тема в разделе "Машинное отделение", создана пользователем Edwards, 23 янв 2010.

  1. дуп
    Оффлайн

    дуп Учаcтник

    Репутация:
    0
    Интересно. :)
     
  2. Edwards
    Оффлайн

    Edwards Старожил

    Репутация:
    21
    Да, и такой вариант вполне допустим.

    Да, это интересно.
    Но ещё интересней для меня - понять почему, на каком основании программы позволяют себе так рисковать, не доводить до конца расчёт в теоретически небезнадёжных (небезнадёжных с точки зрения возможного всплытия оценки на первую строчку) ветках. Интересно, как в целом устроен алгоритм такого отсечения.
    Я пока это не вполне ясно понимаю :(
    Тут WinPooh о Null-move упоминал. Возможно, именно этот Null-move - важнейший инструмент подобных ранних, вероятностных (т.е., строго говоря, "на удачу") отсечений, нет?

    Какой-то человечинкой попахивает от таких отсечений.
    Мне казалось, машины работают иначе, не позволяют себе подобного риска. Вероятно, я ошибался.
     
  3. bankuss
    Оффлайн

    bankuss Александр баннер

    Репутация:
    6
    если не отсекать, то даже на современных квадах такой движок в миттельшпильных позициях уже на глубине 12-14 уходил бы в полный ступор )))
     
  4. Mustitz
    Оффлайн

    Mustitz баннер

    Репутация:
    36
    Это так называемые эвристики. Т. е. нечто такое, что нельзя обосновать строго теоретически, но что дает хорошие практические результаты.

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

    Яркий пример большого количества отсечений представляет собой человеческое мышление. Но это не мешает людям пристойно играть :) почему же человук так рискует?

    В целом на любое отсечение, наверное, можно придумать контрпример, когда оно дает сбой. но если эти такие позиции крайне редко встречаются на практике (например в 1% всех партий), то сила увеличение силы игры в 99% других партий сильнее.

    Например, эвристика нелувого хода. Конечно, существуют позиции, где она дает сбой. Например, позиции со связкой после жертвы материала, где до цугцванга надо сделать много "тихих" ходов. Но такой цугцванг возникает достаточно редко, поэтому тот факт, что программа его не найдет, мало повлияет на силу игры программы. А вот скорость счета очень даже.
     
  5. Edwards
    Оффлайн

    Edwards Старожил

    Репутация:
    21
    Да, Mustitz, понятно.
    Но я, видимо, не слишком ясно выражаюсь :(
    Дело в том, что некое, так сказать, философское, общее обоснование полезности ранних отсечений для меня, конечно, абсолютно прозрачно.
    Понятно, что лучше считать мало, чем много. Понятно, что люди так и делают.

    Меня скорей интересует, как технически, программно это реализовано. Как это формализовано - вот что меня интересует.

    Null move - это главный способ избавиться от предположительно ненужных веток?
     
  6. ProstoTak
    Оффлайн

    ProstoTak Старожил

    Репутация:
    1
    Чувствую кое кто на шару очень много хочет :d
     
  7. Alexander
    Оффлайн

    Alexander баннер

    Репутация:
    43
    Интересно еще на какую глубину считает движок без отчесений
     
  8. Кузьмич
    Оффлайн

    Кузьмич Никита

    Репутация:
    0
    Альфа-Бета отсечения работают на любой глубине, как я их понимаю.
     
  9. Edwards
    Оффлайн

    Edwards Старожил

    Репутация:
    21
    На всякий случай.
    Меня, конечно же, интересует только принципиальная, самая общая схема реализации отсечения "на удачу".
    Конечно же, сверхстрогие, полные, специфически программистские описания мне не желательны - хотя б потому, что я их просто не пойму скорей всего :)
     
  10. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Расскажу идею отсечений с помощью пропускания хода в общих чертах. Если текущая позиция для нас достаточно хороша (т.е. соперник имеет где-то вариант получше), то можем попробовать пропустить ход (подпрыгнуть на месте). После этого для проверки проводим перебор на уменьшенную глубину, если соперник не успевает поставить каких-то проблем имея два хода подряд, то высока вероятность того, что позиция излишне хороша и не имеет смысла считать ее на полную глубину, т.к. скорее всего соперник уклониться от этого варианта. Конечно, в позициях с высокой вероятностью цугцванга такую технику лучше не использовать.

    ЗЫ. Переименовал ветку, теперь любые чайники могут задавать любые вопросы.
    ЗЫ2. Сегодня постараюсь сделать статистику по глубине отсечений.
     
  11. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Статистика обрывов эвристики "пустой ход" при номинальной глубине 15.

    Начальная позиция.
    глубина - количество обрывов:
    Код:
     1 - 3
     2 - 5
     3 - 905
     4 - 1407
     5 - 19025
     6 - 32500
     7 - 154333
     8 - 128107
     9 - 232445
    10 - 216340
    11 - 260393
    12 - 111465
    13 - 91436
    14 - 35037
    15 - 19363
    16 - 5667
    17 - 3057
    18 - 867
    19 - 625
    20 - 86
    21 - 58
    22 - 6
    23 - 2
    
    Позиция после 1.e4 e5 2.Nf3 Nc6 3. Bb5 a6 4.Ba4 Nf6
    Код:
     1 - 19
     2 - 12
     3 - 807
     4 - 888
     5 - 16245
     6 - 14295
     7 - 76029
     8 - 57163
     9 - 112032
    10 - 100463
    11 - 106369
    12 - 77671
    13 - 65700
    14 - 21288
    15 - 27808
    16 - 4319
    17 - 8652
    18 - 869
    19 - 2017
    20 - 136
    21 - 399
    22 - 22
    23 - 170
    24 - 0
    25 - 21
    
     
  12. дуп
    Оффлайн

    дуп Учаcтник

    Репутация:
    0
    Спасибо. Я лично думал, что пустой ход срабатывает чаще. А у вас он на какой глубине начинает работать?
    Код:
    if(depth >= ? ...)
     
  13. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Как можно судить о частоте, если я утаил общее число рассмотренных позиций?

    2.
     
  14. Edwards
    Оффлайн

    Edwards Старожил

    Репутация:
    21
    Я решил снова переименовать тему :) Надеюсь, никто не против.
    Переименовал в соответствии с первым предложением WildCat'a по этому поводу: "Перебирают ли движки все возможные позиции на заданную глубину?"

    Дело в том, что тема оказалась более содержательной, чем мне поначалу представлялось.
    В частности, я готовлю новые уточняющие вопросы, перевариваю пока информацию от WildCat'a...
     
  15. 17
    Оффлайн

    17 Учаcтник

    Репутация:
    0
    Хотя это серезный офф-тор (все же пообещал не писать в теме о 7ЭБ) - почему этот чертовский 0-move (пустой ход), которые все авторы используют, не срабатывает в ЭБ (или каким другим способом передават ход соперника, дожидаясь свой ход в конкретной позиции) :/
     
  16. дуп
    Оффлайн

    дуп Учаcтник

    Репутация:
    0
    А никак нельзя. Не подумал я.
    Вот тут еще немного непонятно: "номинальная глубина 15" - это максимальная глубина, которую в корне задают как параметр альфв-беты? Откуда там тогда глубины больше 15, из-за продлений или у вас нулевой ход и в ФВ работает?
    Может опять глупость спрашиваю, заранее извиняюсь, узнать-то надо. Спасибо.
     
  17. vasa
    Оффлайн

    vasa Опытный перворазрядник Команда форума Команда форума

    Репутация:
    585
    Олег!!!!!!!!!!!!!!!!! Ну как ты мог!!!!!!!!!!!!!!!!!!!! Переименовать!!!!!!!!!!!!!!!!!!!!!

    Это же... Как его... Пользовательский волюнтаризм!!!! Нет, произвол!!!! :)
     
  18. Crest
    Оффлайн

    Crest Админ, МГ Команда форума Команда форума

    Репутация:
    628
    Само собой. Понял, что второй вариант - как раз тот, что предлагал я. А признавать, что в вопросе с русским языком был неправ - невозможно.
    И решил, мол, ни нашим, ни вашим...
     
  19. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Не срабатывает он в позициях, где высока вероятность цугцванга.

    Конечно.
     
  20. Edwards
    Оффлайн

    Edwards Старожил

    Репутация:
    21
    Слушайте, WildCat, Вы пишете, что при анализе начальной позиции на глубине "1" у Вас уже отсечены три варианта.
    Как такое может быть? :|

    Единицей глубины мы ведь считаем полуход, правильно?
    В начальной позиции имеем 20 возможных ходов белых.
    И, что, три из них вообще не рассматриваются, что ли?
    Если да, то почему, на каком основании?
     
  21. Edwards
    Оффлайн

    Edwards Старожил

    Репутация:
    21
    Мы - люди с ИШФ-закалкой :) Что с нас взять?.. дети свободы... :)

    Ой, да ладно :)
     
  22. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Три из них отсекли, т.к. даже после пропуска соперником хода не смогли поставить ему каких-то проблем за 11 полуходов. Значит рассматривать реальные ответы на номинальную глубину (14, т.к. один ход уже сделан) нет большого смысла.
     
  23. Edwards
    Оффлайн

    Edwards Старожил

    Репутация:
    21
    Это очень интересно, спасибо.
    Попробую всё это понять. Извините за тугость мысли - материал новый для меня.
    В частности, я только сейчас понял, что отсечение трёх ходов белых произошло, видимо, лишь на глубине 15... а не на глубине 1...

    Дальше. Откуда взялось у Вас число 11?
    Имеем два подряд (по null move) хода белых из начальной позиции. 2+11=13.
    13 не равно 15. Ещё раз простите, если туплю.

    Дальше.
    Каким образом формализовано "не смогли поставить ему каких-то проблем"?
    Я правильно понимаю, что это значит, что оценка наших трёх ходов-парий оказалась просто меньше, чем оценка некоего эталонного варианта, первой линии?

    Кстати, а что такое ПВ? Эту аббреавитуру тут часто поминают. Первый вариант, что ли?

    И ещё - если возможно, а какие именно три хода белых из начальной позиции оказались в столь унизительном положении? Просто интересно.

    Боюсь, вопросы моим примитивны, не обессудьте.
     
  24. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Отсечение первого хода может произойти лишь на глубине один. Но для того, чтобы сделать такое отсечение приходится запускать вспомогательный перебор.

    14 - 3 = 11.
    14 - это оставшаяся глубина после совершенного первого хода (15 - 1 = 14).
    3 - это на сколько вспомогательный перебор короче главного.

    Да оценка этих ходов оказалась меньше оценки первой линии.

    Principal Variation.

    Сие есть тайна. Раскрыть могу, только если очень интересно.
     
  25. Edwards
    Оффлайн

    Edwards Старожил

    Репутация:
    21
    Похоже, такие обяснения моему уровню понимания предмета - не соответствуют :(
     
  26. Skipper_NORTON
    Оффлайн

    Skipper_NORTON Старожил

    Репутация:
    0
    т.к. НИ ОДИН движок не перебирает из-за альфа-бета отсечений ВСЕ позиции — я бы переименовал тему так... вместо "Перебирают ли движки все возможные позиции на заданную глубину?" —
    "Перебирают ли движки все возможные позиции на заданную глубину из множества с учетом альфа-бета отсечений" (т.к. перебор с альфа-бета отсечениями - аналогичен перебору всех позиций)

    Насколько я понимаю, запускать вспомогательный перебор с нулевым ходом который имеет такую же глубину после нулевого хода, как и имел бы глубину после сделанного хода - смысла не имеет. (так????) За то же время можно было бы перебрать — сделав первый попавшийся ход вместо нулевого - и получить альфа-бета отсечение с большей вероятностью, чем после нулевого. Какой тогда смысл терять время на расчет нулевого хода? Смысл имеется если мы уменьшаем глубину после нулевого хода черных и видим, что хотя у белых было 2 подряд хода и у них все равно осталось хуже, т.е. альфа-бета отсечение, БЕЛЫЕ не выберут этот вариант находясь ВЫШЕ. Тогда другие ходы черных из этого узла вместо нулевого только еще сильнее ухудшат положение белых и тоже будет альфа-бета отсечение.

    Мы выиграли ИМЕННО потому что из данного узла перебирали на меньшую глубину после нулевого хода, а если бы после нулевого хода мы глубину не уменьшили бы, то ничего по времени мы не выиграли бы?
     
  27. Skipper_NORTON
    Оффлайн

    Skipper_NORTON Старожил

    Репутация:
    0
    Нет, в полный ступор мы без нулевых ходов и отсечений в дереве впадаем уже на глубине 10 !

    Предположим что у нас средняя позиция миттельшпиля в которой в среднем 35 ходов в позиции. При ОПТИМАЛЬНЕЙШЕЙ сортировке ходов, от которой наиболее эффективны альфа-бета отсечения, мы получим в каждом узле в среднем сколько ходов? корень квадратный из 35-ти, равно 6, но т.к. оптимальнейшая сортировка недостижима - получим где-то аналог дерева С ПОЛНЫМ ПЕРЕБОРОМ без альфа-бета отсечений и 7 ходами в среднем в каждом узле.

    Я экспериментировал со своим движком а сортировка ходов у меня хорошая - (это я хорошо протестировал) и у меня дерево перебора разрастается так что оно аналогично 8 ходам в каждой позиции-узле!
    Но пусть в нашем расчете будет 7 ходов в среднем.

    Дерево до глубины 10 даст примерно 7 в степени 10 нижних узлов дерева на самом нижнем этаже.

    Это около 300 миллионов позиций!!!! (Заметьте что я сюда не добавил еще количество позиций которое будет из-за дополнительного форсированного поиска в максимальной глубине и выборочных углублений! Просто посчитал полный широтный поиск на глубину 10 ! и получил ну самый что ни на есть МИНИМУМ и он оказался 300 миллионов позиций.

    Скорость обработки у фритца 8 какая? Я смотрел - в миттельшпиле - 2 миллиона позиций в секунду на моем крутом процессоре-кваде. 300 миллионов разделим на 2 миллиона и получим 150 секунд — т.е. фритц должен думать по 2,5 минуты на глубину 10 ! А дальше умножаем в 7 раз при каждом следующем увеличении глубины.

    Итак, если фритц перебирает на какую-то глубину полностью, не основываясь на всяких человеческих факторах отсечения веток дерева из-за нулевого хода и прочей причины - а действительно дает полный перебор на заданную глубину, с отсечениями только стандартными - альфа-бета, то ———

    На глубину 11 фритц должен думать 17,5 минут и уже впасть в полный ступор! Продолжаем умножать на 7...
    На глубину 12 фритц должен думать 122 минуты, т.е. 2 часа над одним ходом.
    На глубину 13 — должен думать 14 часов,
    На глубину 14 — должен думать 4 суток,
    На глубину 15 — должен думать 1 месяц,
    На глубину 16 — должен думать ПОЛГОДА.

    А сколько он реально думает на глубину 16 ? Я не поленился, посмотрел. Он думает 2 минуты. Вот и сравните полгода и 2 минуты. Получается - в 125000 раз меньше, он перебирает позиций чем должен перебрать, на заданную глубину если бы была цель - полный перебор с отсечениями только альфа-бета и без всяких других человеческих отсечений типа нулевых ходов.

    Так что то что он там пишет что перебирает на глубину 16 - чистой воды ФИКЦИЯ.
     
  28. Skipper_NORTON
    Оффлайн

    Skipper_NORTON Старожил

    Репутация:
    0
    Если перебор все равно не-полный то смысл писать что он перебирает на глубину 16 ? Можно было бы вообще достигнутый максимум после форсированного поиска в самой глубине записать и отобразить что он якобы перебрал на глубину 30 ! :D

    У меня нет нулевого хода в движке, перебираю по честному на полный только с альфа-бета отсечениями и не достигаю глубины 10... Я бы достигал, но меня сильно тормозят еще форсированные выборочные углубления, а без них нельзя... Иначе программа не сможет находить даже неглубокие форсированные маты.

    Надо бы пустой ход заюзать, только вот не знаю насколько он реально мне поможет... Еще раз... Кто опытный писатель движков? Правильно ли полагать, что при использовании нулевого хода мы ДОЛЖНЫ ВСЕГДА сокращать оставшуюся глубину?
     
  29. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
    Это не фикция, если понимать, что число 16 имеет смысл сравнивать только с глубиной того же самого Фрица в других условиях. То есть это некий интегральный показатель того, насколько глубоко Фриц продвинулся в обдумывании позиции.

    Лучше даже рассматривать это "16" не как какую-то фиктивную глубину, а как номер итерации поиска из корня - подразумевая, что каждая последующая итерация, вообще говоря, делается чуть глубже, чем предыдущая.

    В некоторых программах глубина весьма своеобразная. К рыбкиной надо прибавлять 2 (или 3, не помню), джуниоровскую делить на два - тогда получатся хоть в чём-то сравнимые цифры.
     
  30. Skipper_NORTON
    Оффлайн

    Skipper_NORTON Старожил

    Репутация:
    0
    Вообще то да, но вот некоторые сильно заблуждаются, полагая что в 21 веке программа реально способна жахнуть полный перебор только с отсечениями альфа-бета на глубину 16... за пару минут. :D
     
  31. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Нет, надеемся, что найдется хотя бы один ход не хуже нулевого. И не всегда такой находится.

    Конечно.
     
  32. Skipper_NORTON
    Оффлайн

    Skipper_NORTON Старожил

    Репутация:
    0
    значит наверное нулевой ход - хорошо усиливает игру программы? Но в эндшпилях его по любому использовать нельзя.
     
  33. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
  34. Edwards
    Оффлайн

    Edwards Старожил

    Репутация:
    21
    Хотел переименовать :)
    Да форумный движок не дал. Там ограничение на число символов в названии.
     
  35. dan77790
    Оффлайн

    dan77790 Учаcтник

    Репутация:
    0
    Skipper_NORTON

    А как будет выглядить время полного перебора до глубины 10 для IBM Roadrunner?

    http://ru.wikipedia.org/wiki/IBM_Roadrunner - тут его тех. характеристики