параметры NULL MOVE

Тема в разделе "Машинное отделение", создана пользователем Binary, 19 окт 2006.

  1. TopicStarter Overlay

    Binary Учаcтник

    • Участник
    Рег.:
    27.08.2006
    Сообщения:
    135
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Мытищи
    Оффлайн
    скажите , какие параметры чаще всего используются при вызове пустого хода ?
    например , я сделал 3 варианта :
    1. if( depth > 2 && !follow_pv && !IS_IN_CHECK) {
    ...
    if( -search(-beta, -alpha, depth/2 ) >= beta )
    return beta;
    }

    2. if( depth > 2 && !follow_pv && !IS_IN_CHECK) {
    ...
    if( -search(-beta, -alpha, depth/3 ) >= beta )
    return beta;
    }

    3. if( depth > 2 && !follow_pv && !IS_IN_CHECK) {
    ...
    if( -search(-beta, -alpha, depth - 2 ) >= beta )
    return beta;
    }
    самый быстрый - (2), но частенько зевает комбинации
    (3) - практически не меняет силу игры (может быть даже замедляет)
  2. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Последний (2) Это R=1.
    Обычно делают либо Depth-4 (R=3) либо Depth-3 (R=2)
    То что ты делишь - такая схема обычно используется в IID, но не в Null Move.

    Для средней программы обычно оптимально R=2.

    Кроме проблемы горизонта (зевает комбинации) у Null Move есть еще пара побочных эффектов.
    Цуцванг - программа не видит цуцванга.
    Нестабильность перебора.
  3. TopicStarter Overlay

    Binary Учаcтник

    • Участник
    Рег.:
    27.08.2006
    Сообщения:
    135
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Мытищи
    Оффлайн
    NS - спасибо
  4. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Если при Depth=0 начинается ФВ, тогда обычно
    if( depth >= 2 && !follow_pv && !IS_IN_CHECK) {
    // не забываешь передать очередь хода?
    if( -search(-beta, -beta+1, max(depth - 2 - 1, 0)) >= beta )
    return beta;
    // нужно вернуть очередь хода, и
    // наверно не просто возврат, а что-то еще в хеш нужно записать :)
  5. TopicStarter Overlay

    Binary Учаcтник

    • Участник
    Рег.:
    27.08.2006
    Сообщения:
    135
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Мытищи
    Оффлайн
    очередь хода передать не забываю :)

    эту процедуру я так понял надо впихнуть прямо перед вызовом quiesce (ну или ФВ другими словами)?
  6. NS Нефёдов Сергей

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

    Binary Учаcтник

    • Участник
    Рег.:
    27.08.2006
    Сообщения:
    135
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Мытищи
    Оффлайн
    :)
    вот как у меня сделано :
    сначала search(...) -> затем на 0-ой глубине работает quiesce(...) , которая рассматривает только взятия до
    max_ply (у меня 31)
    null_move я вызываю перед рекурсивным вызовом search(...) , почему тоже самое нельзя проделать с Quiesce ?
  8. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    У тебя может быть вызван null move при Depth=0? Нет? Значит проверка, и вызов ФВ с возвратом сразу оценки - должен быть ПЕРЕД null move...
    Кстати - в пустом ходе (вызове Search) - окно ВСЕГДА нулевое!!!
    А возвращаться может как Бета, так и сам результат перебора
  9. TopicStarter Overlay

    Binary Учаcтник

    • Участник
    Рег.:
    27.08.2006
    Сообщения:
    135
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Мытищи
    Оффлайн
    если null move вызывать на глубине 0 после ФВ , то не теряется ли сам смысл Null move как средства отсечения
    плохих ходов?!
    ведь точнее чем ФВ NULL MOVE все равно не вернет оценку , а время потратит
  10. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Я не понимаю тебя...
    1. яТебе написал что Null Move запускается ТОЛЬКО ПРИ DEPTH>=2
    Есно NULL MOVE не может запускаться при Depth=0,

    Я тебя спрашиваю - если при Depth=0 НЕ МОЖЕТ ЗАПУСКАТЬСЯ Null Move -
    то почему проверка на depth=0 должна выполнятся ПОСЛЕ Null Move, а не перед????
  11. TopicStarter Overlay

    Binary Учаcтник

    • Участник
    Рег.:
    27.08.2006
    Сообщения:
    135
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Мытищи
    Оффлайн
    проверка на depth = 0 у меня в самом начале search() если true , то я вызываю Quiesce ;

    я просто криво прочитал твой пост :)
    все догнал (sorry)
    так у меня все и сделано
  12. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    У меня проверка на Depth=0 не в самом начале, так как перед этим делаются несколько проверок, проверяется на повторение позиции, ищется оценка в Хеше, и вызов ФВ при depth<=0 идет только в случае, если король не под шахом (в схеме ФВ без шахов - это несколько поднимает силу программы)
  13. TopicStarter Overlay

    Binary Учаcтник

    • Участник
    Рег.:
    27.08.2006
    Сообщения:
    135
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Мытищи
    Оффлайн
    Мне только предстоит добавлять все это дело :) (и бессонные ночи перед отладчиком)
  14. gudvinn Учаcтник

    • Новичок
    • Участник
    Рег.:
    04.08.2006
    Сообщения:
    28
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    Объясните пожалуста , что такое follow_pv?
  15. bankuss Александр

    • Заслуженный
    • Участник
    • Старожил
    Рег.:
    24.05.2006
    Сообщения:
    1.084
    Симпатии:
    38
    Репутация:
    6
    Оффлайн
    gudvinn находимся в PV ветви
  16. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    В алгоритме PVS поиск основного варианта, несколько отличается от обычного.
    follow_pv означает, что мы ищем основной вариант.

    В простой алфа-бете это может значить, что мы выполняем ходы из ранее найденного (при предыдущей итерации) основного варианта.
  17. gudvinn Учаcтник

    • Новичок
    • Участник
    Рег.:
    04.08.2006
    Сообщения:
    28
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    У меня простая альфа-бета. Из предыдущего варианта таких ходов будет 2-3?
    Я пробовал делать negascout скорость возросла чуть-чуть ( например, если поставить фиксированную глубину , то разница для позиции а-б 8.5 сек , а negascout 8.4 sec).

    А где можно почитать про PVS метод?
    И про negascout — я так и не понял в чем суть этого алгоритма.
  18. NS Нефёдов Сергей

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

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Линки можно найти здесь http://wbforum.volker-pittlik.name/
    Насколько я помню, NegaScout - это то же, что и альфа-бета (минимакс), только вместо двух функций одна.
  20. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Нет. NegaMax - Вместо двух функций одна, а NegaScout - Это и есть метод дерева нулевой ширины.
    Так как для извелечения PV при NegaScout используется PVS, то стали отожествлять PVS и NegaScout.
  21. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Ты попутал с MTD(f).
  22. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Нет, MTD(f) - это развитие идеи NegaScout, метод при котором нулевая ширина дерева всегда.
  23. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    MTD(f) is a new minimax search algorithm, simpler and more efficient than previous algorithms. In tests with a number of tournament game playing programs for chess, checkers and Othello it performed better, on average, than NegaScout/PVS (the AlphaBeta variant used in practically all good chess, checkers, and Othello programs). One of the strongest chess programs of the moment, MIT's parallel chess program Cilkchess uses MTD(f) as its search algorithm, replacing NegaScout, which was used in StarSocrates, the previous version of the program.



    http://www.cs.vu.nl/~aske/mtdf.html
  24. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    PVS - Principal Variation Search. Первые ходы перебираются с нулевым окном, все остальные с обычным.
  25. NS Нефёдов Сергей

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

    Оригинал взят с http://www.zib.de/reinefeld/nsc.html

    Нега-скаут (NegaScout)

    Подобно AlphaBeta, NegaScout - направленный алгоритм поиска для вычисления минимаксного значения узла.

    NegaScout эффективнее AlphaBeta: он никогда не исследует узла, который может быть отсечен AlphaBeta.

    Ни NegaScout не превосходит SSS*, ни наоборот: Существуют деревья, в которых NegaScout ищет строго меньшее количество узлов чем SSS* и наоборот. На среднестатистических деревьях, однако, SSS* обычно просматривает меньшее количество узлов чем NegaScout.
    Тот же самое относится к DUAL*.
    Формальные доказательства могут быть найдены в: A. Reinefeld. Spielbaum-Suchverfahren. Informatik-Fachbericht 200, Springer-Verlag, Берлин (1989), ISBN 3-540-50742-6

    C-подобный код:

    int NegaScout ( position p; int alpha, beta );
    { /* вычислить минимаксное значение позиции p */
    int a, b, t, i;

    determine successors p_1,...,p_w of p;
    if ( w == 0 )
    return ( Evaluate(p) ); /* лист дерева */
    a = alpha;
    b = beta;
    for ( i = 1; i <= w; i++ ) {
    t = -NegaScout ( p_i, -b, -a );
    if (t > a) && (t < beta) && (i > 1) && (d < maxdepth-1)
    a = -NegaScout ( p_i, -beta, -t ); /* повторный перебор */
    a = max( a, t );
    if ( a == beta )
    return ( a ); /* отсечение */
    b = a + 1; /* установить новое нулевое окно */
    }
    return ( a );
    }

    © 1999 Konrad-Zuse-Zentrum fur Informationstechnik Berlin (ZIB)
    © Перевод с английского - С. Марков, 2000

    http://www.aigroup.narod.ru/search2r.htm
    http://www.aigroup.narod.ru/indexr.htm
  26. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Посмотрел в инете. Оказывается PVS и NegaScout это одно и то же. Мне приятнее называть PVS.
  27. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    PVS is also often called NegaScout. It gets its name from the scout search which a minimal window, which sort of probes the territory to see whether a real search is necessary.
  28. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Недавно только стали отожествлять, изначально PVS метод извлечения PV и разделения ветвей.
    В изначальной формулировке - PVS может использоваться и при чистой Альфа-Бете, без нулевого окна - только для извлечения PV, и например для принятия решения о применения методов отсечения (LMR, Null Move, Футилити - для примера только не в PV ветвях)
  29. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Все наоборот. Первый ход в полном окне, все остальные с нулевым.
    PVS == NegaScout
  30. NS Нефёдов Сергей

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

    • Участник
    Рег.:
    23.10.2006
    Сообщения:
    98
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Гонду-Раша
    Оффлайн
    А как правильно считать размер хэш таблицы? Пусть утверждается, что, например, размер хэш-таблицы равен (допустим) 64 МБ? Пусть одна запись в хэше занимает 16 байт: 8 байт для хранения ключа и 8 байт для хранения сопутствующей информации. Означает ли это, что количество записей в хэш таблице равно 64х1024х1024=67108864 записей. Или это означает, что кол-во равно 67108864/16=4194304 записей?
  32. TopicStarter Overlay

    Binary Учаcтник

    • Участник
    Рег.:
    27.08.2006
    Сообщения:
    135
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Мытищи
    Оффлайн
    приспособил этот код в свою прогу и он несет пургу ...
    это правильный код?!
    это сообщение 4000 - ное :D
  33. NS Нефёдов Сергей

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

    Binary Учаcтник

    • Участник
    Рег.:
    27.08.2006
    Сообщения:
    135
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Мытищи
    Оффлайн
    скажите , каковы параметры в IID - a то я ,как всегда, сразу не мог спросить :)
    сейчас в моих экспериментах лучшим оказывается просто quiesce(-beta , -alpha ) , т.е. поиск на глубину 0
    ... но NS говорил , что надо делить depth
  35. NS Нефёдов Сергей

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

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