Internal Iterative Deepening

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

  1. WildCat
    Оффлайн

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

    Репутация:
    0
    Подфиксил все свои баги с IID, но даже если иногда теперь и быстрее считает, то не намного.

    NS!
    Поделись с народом самыми современными идеями IID (пециально для этого сделал ветку).
     
  2. WildCat
    Оффлайн

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

    Репутация:
    0
    Админы!
    Название темы должно быть IID. Ваш злостный софт половину букв попортил :(
     
  3. Binary
    Оффлайн

    Binary Учаcтник

    Репутация:
    0
    в моем оригинальном способе :D я вытаскивал на вершину не 1 ход ,а все до достижения value >= beta
    с присваиванием им приоритета , согласно полученным оценкам - глядишь что-то изобрел :lol:
    может действительно вытаскивание неск. ходов будет лучше вытаск. одного , как с киллерами?!
     
  4. NS
    Оффлайн

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

    Репутация:
    3
    Сейчас, мысли в порядок приведу :)
     
  5. WinPooh
    Оффлайн

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

    Репутация:
    95
    Название темы должно быть расшифровкой этой аббревиатуры :)
     
  6. NS
    Оффлайн

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

    Репутация:
    3
    if (bestM=0) then // Если нет хода в хеше
    Begin
    if PV Then // PV ветвь
    Begin
    if (depth>2) then
    Begin
    // Вычислим новую глубину
    // if depth<4 then newdepth:=depth-2 else
    newdepth:=(depth div 2);
    oc1:=perebor(a,b,true,false,newdepth);
    // Третий параметр признак PV ветви, четвертый - запрет NullMove на входе
    if (oc1<=a) Then oc1:=perebor(-inf,b,true,false,newdepth);
    end;
    end
    Else // Не PV ветвь
    Begin
    if (depth>3) then
    Begin
    // Вычислим новую глубину
    //if depth<4 then newdepth:=depth-3 else
    newdepth:=(depth div 3);
    oc1:=perebor(a,b,false,false,newdepth);
    // Третий параметр признак НЕ PV ветви, четвертый - запрет NullMove на входе
    // Запуск происходит с нулевым окном (в случае NegaScout)
    if (oc1<=a)and(Depth>5) Then oc1:=perebor(-inf,b,true,false,newdepth);
    // Третий параметр признак PV ветви, четвертый - запрет NullMove на входе
    // возможно что в этом случае newDepth нужно посчитать по-другому
    end;
    end;
    end;
     
  7. NS
    Оффлайн

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

    Репутация:
    3
    Понятно, что генерация Ходов в рекурсивном вызове IID должна производится ТОЛЬКО один раз.
    (например в стеке хранится признак того, что ходы сгенерированы, а если уже сгенерированы - то и отсортированный список ходов - соответственно генерация производится только при последнем рекурсивном вызове IID (с минимальным depth), а вышестоящие уровни рекурсии уже используют отсортированный список ходов, с возможно вытянутыми наверх опровергающими и лучшими ходами)
    При этом ходы должны быть отсортированы (тоже один раз), и каждый раз когда оценка>Альфа ( и Оценка>BestValue)
    Ход вытягивается наверх, а каждый раз когда оценка хода >=Бета (Таких ходов может быть несколько!!! На каждом рекурсивном вызове это могут быть разные ходы) Ходу дополнительно еще присваивается признак Опровергающего (например для LMR)
     
  8. WildCat
    Оффлайн

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

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

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

    Репутация:
    0
    Совершенно не имеет никакого значения. Проигрыш в скорости будет измряться сотыми долями процента, если не меньше.
    Идея с делением depth мне кажется не очень удачной. Получаем ход не очень хорошего качества и при этом никакой экономии. На вспомогательный перебор depth - 3 * ONE_PLY практически никаких ресурсов не затрачивается (относительно размера основного дерева перебора). Экономить на этом не имеет никакого смысла.
     
  10. NS
    Оффлайн

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

    Репутация:
    3
    Как это экономить не имеет смысла, если при такой схеме (Вычитание вместо деления) НА ВСЕХ тестовых позициях получается больше узлов (при расчете на ту-же глубину)
    При вычитании Только в PV ветвях - разница не очень велика, а в НЕ PV ветвях - уже достаточно серьезна.

    Генерация ходов производится один раз - не для экономии времени на генерации, а для использования информации о сортировке ходов (в IID из-за рекурсивности метода, и возможного ненулевого окна - мы имеем более одного хорошего хода, подлежащего вытаскиванию наверх), и для сбора информации об опровергающих ходах (Для того чтоб в схеме LMR не делать на них сокращение)
     
  11. NS
    Оффлайн

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

    Репутация:
    3
    Для вытаскивания хода наверх - в Search, в основном теле - вот такой код
    if oc>a then
    begin
    a:=oc;
    u:=r.hhod;
    for k:=i downto 2 do
    r.hhod[k]:=r.hhod[k-1];
    r.hhod[1]:=u;
    if oc>=b then // завершаем перебор, и производим манипуляции с хешем
    end;
     
  12. WinPooh
    Оффлайн

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

    Репутация:
    95
    Это вопрос не ко мне. Я к форумному софту доступа не имею :)
     
  13. WildCat
    Оффлайн

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

    Репутация:
    0
    У меня с включенным перебором IID с вычитанием, но не никак использующим результаты этого IID, размер дерева почти всегда тот же. Так что не вижу причин, по каким нужно делить. Сокращая глубину IID ничего не получим, т.к. этот метод достается практически бесплатно.
     
  14. WildCat
    Оффлайн

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

    Репутация:
    0
    Не знаю насколько такой подход помогает сортировать. Если хочется посортировать ходы, то мне больше нравится вариант Binary. Например так: ищем первый ход по IID, перебираем его на полную глубину, если он оказался неопровергающим, то остальные ходы оцениваем по ФВ.
     
  15. NS
    Оффлайн

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

    Репутация:
    3
    Дело в том, что сортировка по ФВ занимает время. И ход, лучший при сортировке по ФВ - не настолько хорош чем ход лучший при Depth=2 и лучший ход по ФВ - не тоже самое для LMR, что и опровергающий при depth=5,10,15...
    И у меня - вообще нет трат времени по сравнению с обычной схемой IID
    То есть абсолютно стандартный IID, только лучше усваиваем полученную информацию.

    И используем IID не только в PV ветвях, а во всех - только не в PV ветвях используем более гибко - по другом считаем NewDepth, и первый проход при Depth>3, а второй с расширенным окном (в случае если первый проход не дал опровергающего хода) - только при Depth>5.

    Я говорю же не о том, занимает ли сам IID время, а о размере полного дерева. Если мы выигрываем в размере - то причем тут траты времени от вызова IID?

    Если IID совсем не увеличивает дерево (при холостом запуске) - то не значит ли это что IID нужно использовать еще более Агрессивно?
     
  16. NS
    Оффлайн

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

    Репутация:
    3
    Тем более сравнить вычитание с делением занимает всего пять минут.
    Поставили начальную позицию, очистили хеш, и запустили на 2 минуты расчет.
     
  17. WildCat
    Оффлайн

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

    Репутация:
    0
    Сортировка по ФВ при depth >= 4 вообще не может занять времени.
    Дело в том, что мы говорим не о лучшем ходе, а о сортировке всех последующих. Как их отсортирует твой IID это дело случая. Сортировка по ФВ всегда стабильна и достаточно качественна (мне даже не очевидно, что IID сможет отсортировать лучше ходы начиная с 2-ого и дальше).
     
  18. WildCat
    Оффлайн

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

    Репутация:
    0
    Вычитание более агрессивно и при этом дерево не увеличивается. Зачем проверять деление?
    Кроме того, у меня из-за такого подхода уже были проблемы. Сортировал ходы так, чтобы лучше было на 1-3 тестовых позициях. Это приводило к худшим результатам, чем если проверять на реальных партиях.
     
  19. NS
    Оффлайн

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

    Репутация:
    3
    Я не знаю методики определения разницы в силе двух версий программы при контроле 2 минуты на ход...
    1000 партий? Определяем разницу в 20 пунктов? Всего лишь 320 000 минут времени...
    Но я знаю методику определения разницы количества узлов в дереве на 100-1000 тестовых позиций (при заданной глубине, и среднем времени обдумывания 2 минуты на ход) :)

    А насчет разницы эффективности алгоритмов получения оценки для всех узлов, и последующей сортировки, и IID - получение одного лучшего/опровергающего хода, а если повезет, то и нескольких, отсортированных...
    Всего лишь глубина Depth-3 Для одного хода... Либо равносильная трата времени при Depth-8 Для всех ходов... Я считаю что один лучший ход с глубиной depth-3 намного важнее, чем сортировка всех, но точность сортировки определяется глубиной depth-8///
     
  20. NS
    Оффлайн

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

    Репутация:
    3
    Суть сортировки при альфаБетте не в том чтоб улучшить упорядоченность ходов (в узлах с окном нулевой ширины и отсутсвии опровергающего хода по Бетте - сортировка не дает ничего - всё равно все ходы будут рассмотренны), а именно в том, чтоб опровергающие ходы если они есть - были рассмотренны в первую очередь... Именно это уменьшает дерево перебора.
    IID избирательно ищет именно такие ходы... А один ход будет вытянут. или повезет и два три - неважно.
    Если 2-3 то будем считать что нам просто повезло, и используем полученную информацию (в отличии от стандартной схемы, которая эти два-три хода получает, но никак не использует, и оставляет их в конце списка, либо в том месте, где они и находились)
     
  21. NS
    Оффлайн

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

    Репутация:
    3
    Кстати, насчет того что холостой, рекурсивный запуск в любой ветви (есно при остутствии отсечения пустым ходом и хода в Хеше) IID с Depth-3 При времени на ход 2 минуты практически не увеличивает количества узлов в дереве...
    Я таких тестов не проводил, НО
    Запуск Верификации пустого хода с Depth-5, по сравнению с Depth-7 (при этом есно ВСЕГДА НУЛЕВОЕ ОКНО на верификации) - уже Кардинально увеличивает размер дерева.
    При этом такие Тесты проводил не только я!
    Весьма странно :)
     
  22. NS
    Оффлайн

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

    Репутация:
    3
    Всё, понял!!!
    Игорь, у тебя ошибка в рассуждениях!!!!

    Твой "холостой" запуск IID - на самом деле никакой не холостой!!!

    Опровергающие ходы, полученные при помощи IID - используются!!!
    Влияние холостого запуска на историю минимально, но этот "холостой" запуск явно влияет на киллеры.
    Поэтому вполне возможно, что при более гибком подходе к вычислению newdepth - у тебя при холостом запуске IID будет уменьшение количества узлов в дереве!
     
  23. NS
    Оффлайн

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

    Репутация:
    3
    Все современные методы сортировки ходов не связаны с оценками...
    Например
    Киллеры - опровергающие ходы (а не ходы с хорошими оценками)
    Сортировка по истории (сортировка по истории опровергающих ходов)
    SEE - вытягивание вверх перспективных взятий (с большой вероятностью опровергающих)
    Ходы из Хеша (опровергающие ходы)
    IID (c нулевым окном) чистый поиск одного опровергающего хода - если не нашли, то и не надо, по оценке не сортируем.

    Сортируя ходы по оценке ты подменяешь цель. Если нет других методов сортировки, то сортировка всех ходов по оценке, по ФВ, по сокращенной глубине конечно будет работать. а иначе - нет.

    Ежели у тебя вытаскивание ходов наверх абсолютно бесплатное (например у меня так сделано в IID - абсолютно не замедляет стандартную схему, и ходы по-максимуму вытягиваются наверх (причем опровергающие при большем depth - будут выше в списке, чем опровергающие при меньшем depth), или в Хеше - у меня хранятся два опровергающих хода отсортированных по глубине на которой они являются опровергающими) - то конечно от такой схемы могут быть только плюсы (по собранной мной статистике, если первый ход из хеша не был опровергающим, в хеше два хода, и в позиции есть хоть один опровергающий ход - он практически в 100% случаев будет именно этим вторым ходом из хеша),
    а если у тебя сделана сортировка всех ходов по оценке, либо по оценке полученной запуском ФВ (что по сути одно и тоже, просто получаем более точную оценку) - то такой метод будет конфликтовать с остальными, и только ухудшать эффективность отсечений при Альфа-бете.
     
  24. WildCat
    Оффлайн

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

    Репутация:
    0
    IID ищет лишь один опровергающий ход. Остальные ходы всего лишь попадают в альфу.
    А если ты используешь PVS, то ненулевых окон в переборе практически нет. И любой ход больше альфы сразу же завершит твой IID. Так что я все равно не вижу особых преимуществ у твоего метода.
    А идея оценки по ФВ не в том, чтобы сортировать ходы по ОФ. А в том, чтобы сначала рассматривать тактически выгодные ходы. А проигрывающие ходы потом.
     
  25. NS
    Оффлайн

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

    Репутация:
    3
    Опровергающий ход завершает только один из нескольких селективных вызовов IID в цепочке...


    допустим хода в хеше нет...
    Абсолютно стандартная схема IID newdepth=depth-3
    Глубина 20 - в рамках IID - Вызов Search с глубиной 17, затем в любом случае перебор с глубиной 20, найденный (один) ход всего-лишь вытягивается наверх в списке...
    17 - Вызов Search с глубиной 14, затем в любом случае перебор с глубиной 17, найденный (один) ход всего-лишь вытягивается наверх в списке...
    14 - Вызов Search с глубиной 11, затем в любом случае перебор с глубиной 14, найденный ход всего-лишь вытягивается наверх в списке...

    ...
    В рамках одного вызова IID - рекурсивно запускается 6 вызовов IID с разным Depth
    С глубиной 2,5,8,11,14,17... И каждый вернет одинаковый опровергающий ход?
    То есть первый-же опровергающий ход, найденный с глубиной 2 - всегда Будет опровергающим (при данном окне)? Независимо от Depth?
    ...

    Второй вызов IID - с окном (-inf,beta) - каждый раз лучший ход будет рассмотрен именно первым, и именно он и будет опровергающим?
    ....
    В том то и дело, что IID Селективный метод, и поэтому он находит даже с нулевым окном - абсолютно не обязательно только один опровергающий ход.
     
  26. NS
    Оффлайн

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

    Репутация:
    3
    Вообще странный спор - я сейчас не могу запустить тесты (снес Делфи), но раннее результаты Тестов приводил.
    Второй ход из Хеша (первый так-ой же как и во стальных схемах, второй - это тот ход, который в стандартных схемах стирается первым) - вероятность того что второй ход из хеша опровергающий, если первый ход из Хеша не опровергающий, но в позиции был опровергающий ход - близка к 100% (значительно больше чем вероятность того что поровергающим является лучший ход по SEE, и намного больше чем вероятность того что опровергающим является киллер)
    Второй ход по силе (опровергающий с меньшим depth) полученный при помощи IID в таком же случае имеет такую-же вероятность быть опровергающим.

    Оба хода (второй по IID,и второй ход в хеше) - мы получаем абсолютно бесплатно по времени...
     
  27. WildCat
    Оффлайн

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

    Репутация:
    0
    Почему ни у кого нет второго хода из хеша, если он такой хороший?
    Ладно, попробую в хеш сохранять два хода. У меня в самой первой реализации хеша было два оправергающих хода :) Но использовались они не очень адекватно.
     
  28. WildCat
    Оффлайн

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

    Репутация:
    0
    Если есть опровергающий, то обычно более 90%, что им окажется первый рассматриваемый ход. Т.о. остальные ходы не могут дать особо большого эффекта.
     
  29. NS
    Оффлайн

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

    Репутация:
    3
    Игорь, а кто тебе сказал что ни у кого нет второго хода в хеше? :)
    Может его нет только в открытых исходниках?
    Несколько лет назад я читал, уже не вспомню где - о двухуровневом Хеше (Это в хеш таблице про одному адресу две позиции - и вытесняемая, при записи нового хода выбирается исходя из формальных признаков - например с меньшим depth) Почему такого нет в открытых исходниках?
    Даже на простейших, нешахматных тестах - такой Хеш получает намного лучшее заполнение.
    Я читал о хранении ВСЕХ опровергающих ходов в хеше - если это позволяет быстродействие, и объемы оперативной памяти.
    В шахматах на 1С - как раз ситуация с малым быстродействием и большим объемом памяти. И несмотря на небольшую глубину перебора (ввиду низкого быстродействия) - второй ход в хеше дает уменьшение размеров дерева.

    И выгода от второго хода в хеше есть и в немного другом случае...
    Когда мы используем значения в хеше, оставшиеся от обдумывания предыдущего хода. Новые опровергающие ходы (с меньшей глубиной) - либо вытеснят хороший опровергающий ход (в схеме "вытеснять всегда"), либо будут утеряны (в схеме сохранения в хеше опровергающего хода с большим depth)

    И кстати - в открытых исходниках не было хранения больше чем одной оценки в хеше...
    Но ведь появилась!!! И никто теперь не отрицает эффективность этого метода.
     
  30. NS
    Оффлайн

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

    Репутация:
    3
    Да, больше...
    А метод пустого хода сокращает вообще только 5% ветвей :)
    Но при этом улучшает Бренчинг Фактор с семи до трех :)

    И так-же можно сказать о ненужности сортировки ходов в случае наличия хода в хеше - ведь он и так дает вероятность опровержения больше 90% :)
     
  31. WildCat
    Оффлайн

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

    Репутация:
    0
    Как я уже говорил, я никогда не повторяюсь! :D

    Хватит меня уговаривать, сказал же, что попробую :)
     
  32. WildCat
    Оффлайн

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

    Репутация:
    0
    Потому что эффект каля наля.
     
  33. WildCat
    Оффлайн

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

    Репутация:
    0
    Я слышал, что все кто пытался перейти на такую схему (как в Фрукте) никакого результата не получили.
     
  34. NS
    Оффлайн

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

    Репутация:
    3
    Угу, а Фрукт/Тога получают Результат :)
    Насчет двухуровнего Хеша - 99.9% что о нем писал Хьят, и применялся он не только в Крейблиц, но и в других программах. И я доверяю словам Хьтта о том что этот метод дает прибавку.
    ЗЫ. Я дошел до этого метода сам, когда переходил с бинарных деревьев на страничный механизм, потом прочитал мнение Хьятта об этом методе.
     
  35. NS
    Оффлайн

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

    Репутация:
    3
    В открытых исходниках и нет смысла бороться за 5-15 пунктов Эло, даже если методы дающую такую прибавку пишутся за пол-часа и занимают десять строк кода.
    А в сильнейших - даже мучаются с продлением на движении проходной пешки, с откатом продления назад в некоторых случаях - это намного более трудоемко, дает всего 10 пунктов, и этого тоже нет в открытых исходниках.

    А если взять пять методов по 10 пунктов, написать их и отладить за сутки - то получим прибавку уже 50 пунктов. Например для WildCat-а это очень существенно. И такие рюшечки могут позволить догнать по силе Смартсинк.