параметры NULL MOVE

Discussion in 'Машинное отделение' started by Binary, 19 Oct 2006.

  1. TopicStarter Overlay

    Binary Учаcтник

    • Участник
    Member Since:
    27.08.2006
    Message Count:
    135
    Likes Received:
    0
    Репутация:
    0
    Location:
    Мытищи
    Оффлайн
    вот как я делаю
    Code:
    value = -quiesce(-beta, -alpha);    // value = -search(-beta, -alpha , depth/3); - первичный вариант
            takeback();    
            if (value > alpha) 
            {                     
                if (_value >= beta)
                    break;    
                {ход такой-то}[i].score += (value<<20); // near *=1000 000
    и все это в цикле от первого до посл. хода в позиции
  2. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    А причем Тут IID?
  3. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    IID - это не метод получения оценки для каждого хода, а метод относительно быстрого получения лучшего хода в позиции (без получения оценки, обычно ОДНОГО лучшего хода)
  4. TopicStarter Overlay

    Binary Учаcтник

    • Участник
    Member Since:
    27.08.2006
    Message Count:
    135
    Likes Received:
    0
    Репутация:
    0
    Location:
    Мытищи
    Оффлайн
    так IID - это перебор на меньшую глубину с целью выявить возможно более хороший ход ,чтобы рассмотреть его первым?
    просто я далее сортирую ходы по score и рассматриваю , начиная с наилучшего
  5. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    только IID тут не при чем, и такой метод будет работать хуже, чем IID.
    Метод IID, в случае если в Хеше нет лучшего хода - находит этот лучший ход, и он (один лучший ход) просто вытягивается на самый верх списка ходов (всегда рассматривается первым)

    А ты используешь совсем непонятный метод, и непонятно зачем Ты к оценке полученной при помощи ФВ вообще что-то прибавляешь...
  6. TopicStarter Overlay

    Binary Учаcтник

    • Участник
    Member Since:
    27.08.2006
    Message Count:
    135
    Likes Received:
    0
    Репутация:
    0
    Location:
    Мытищи
    Оффлайн
    тогда я сделаю так
    Code:
    besvalue = -100000 ;
    if(depth > N)
        for( ... /*ходы от m до n*/)
        {
             makemove(...)
             value = -search(-beta, -alpha , depth/ R);     
             takeback();            
             if (value > bestvalue) 
                  bestvalue = value;
        }
    //return bestvalue;
    какие должны быть N и R
  7. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    Бред какой-то...
    Это не IID :)
    IID в общем случае, в текущей позиции вообще не все ходы рассматривает...
    Откуда у тебя в IID появился R?
    R это параметр метода пустого хода :)
  8. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    вообще - так как ты пишешь - N=2,
    а value = -search(-beta, -alpha , (depth/ 2)-1);

    И если Достиг значения >=beta, то опровергающий ход найден, дальше продолжать перебирать ходы нет смысла.
    Потом лучший ход вытягиваешь в начало, и запускаешь нормальный перебор.
  9. TopicStarter Overlay

    Binary Учаcтник

    • Участник
    Member Since:
    27.08.2006
    Message Count:
    135
    Likes Received:
    0
    Репутация:
    0
    Location:
    Мытищи
    Оффлайн
    какие именно он не рассматривает ходы?
  10. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    В предыдущем посте ведь написано.
    IID находит опровергающий ход, и на этом перебор заканчивается.
    Перебор всех ходов - только если не найден опровергающий ход.
  11. WildCat Коршунов Игорь

    • Команда форума
    Member Since:
    04.05.2006
    Message Count:
    3.599
    Likes Received:
    4
    Репутация:
    0
    Location:
    Гомель
    Оффлайн
    самый наипростейший IID
    Code:
        if (depth >= IID_DEPTH && !hash_move) {
            Search(ply, depth - IID_REDUCTION, alpha, beta);
            hash_move = PV[ply + 1][ply + 1]; // берем лучший ход со следующего уровня
        }
    Binary!
    Тебе вообще нет смысла заморачиваться такими вещами как IID, т.к. они добавляют очень мало пунктов.
  12. WildCat Коршунов Игорь

    • Команда форума
    Member Since:
    04.05.2006
    Message Count:
    3.599
    Likes Received:
    4
    Репутация:
    0
    Location:
    Гомель
    Оффлайн
    Блин, трохи не так:
    Code:
    if (depth >= IID_DEPTH && !hash_move)
    {
        Search(ply, depth - IID_REDUCTION, alpha, beta);
        hash_move = PV[ply][ply]; // берем лучший ход с текущего уровня
    }
    У меня в проге этот глюк :( Может поэтому никакой пользы от IID не было :)
  13. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    У Меня IID прибавляет прилично, но у меня более гибкая схема.
    Если Брать ход с другого уровня - то наверно толку быть и не может :)
  14. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    Насчет того, что IID прибавляет мало - это устаревшая информация (это действительно так, но при низком быстродействии, и низкой глубине перебора)
    Схема с newDepth=depth-IIDRed - тоже устарела, и тоже нормально работает только при небольшой глубине перебора.

    Я тестирую IID при отключенном LMR - на тестовых наборах позиций время обдумывания уменьшается в 2-3-4 раза, в зависимости от типа позиций (может упасть с 2 минут до 30 секунд, и даже сильнее) Кроме выиграша на быстродействии, IID прибавляет за счет получения доп. информации о опровергающих ходах - мы не сокращаем на них в cхеме LMR, и можно давать на них небольшую прибавку к глубине (так-же как и на ходах из Хеша) - но это уже после настройки.
    С помощью тестовых матчей настраивать IID очень тяжело - так как сказывается эффект от метода на длинных контролях, и у него слишком много параметров. (у меня - четыре функции пересчета глубины, и Четыре значения IID_Depth)

    Так что проще взять несколько тестовых позиций, и посмотреть время обдумывания и количество просмотренных позиций при заданной глубине.
  15. варяг Учаcтник

    • Участник
    Member Since:
    23.10.2006
    Message Count:
    98
    Likes Received:
    0
    Репутация:
    0
    Location:
    Гонду-Раша
    Оффлайн
    Как лучше организовать дебютную библиотеку (формат файла, метод хранения позиций и ходов, как задавать приоритет ходов и т.д.)? Все, наверное, делают по-своему. Интересно было бы узнать различные подходы
  16. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    А зачем она нужна? Оболочки поддерживают дебютные библиотеки, и они-же занимаются самообучением (Дебютным)
    Обсуждение формата ДБ было на этом форуме, но особой надобности в ней нет.
  17. WinPooh В.М.

    • Команда форума
    Member Since:
    13.02.2006
    Message Count:
    9.491
    Likes Received:
    3.118
    Репутация:
    95
    Location:
    Москва
    Оффлайн
    http://kasparovchess.crestbook.com/viewtopic.php?id=593
  18. WinPooh В.М.

    • Команда форума
    Member Since:
    13.02.2006
    Message Count:
    9.491
    Likes Received:
    3.118
    Репутация:
    95
    Location:
    Москва
    Оффлайн
    Роберт Хьятт как-то предложил ещё сделать общий для всех поиск и общую для всех оценку.
    И вообще движков писать не нужно будет.
  19. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    Это уже слишком :)
  20. варяг Учаcтник

    • Участник
    Member Since:
    23.10.2006
    Message Count:
    98
    Likes Received:
    0
    Репутация:
    0
    Location:
    Гонду-Раша
    Оффлайн
    Решил прикрутить к своему движку Null Move. Есть мнение, что это дает прибавку в силе пунктов 200 и прибавку примерно плюс 2...3 полухода за 10...15 секунд
    У меня результаты пока такие (перебор на глубину 8 из начальной позиции)
    - с Null Move 6,53 сек
    - без Null Move 5,65 сек

    По результатам тестирования (около 100 партий) Null Move силы не прибавляет

    Вот псевдокод моей реализации
    do
    {
    //если глубина не достаточная, чтобы не вылететь в форсированный вариант - не делать пустой ход
    if (depth<4*DEPTH_INC)
    {
    break;
    }

    //если мы внутри пустого хода - не делать пустой ход
    if (null_search)
    {
    break;
    }

    //если бета бесконечность - не делать пустой ход
    if (beta>100*PAWN_VALUE)
    {
    break;
    }

    //если на доске нет фигуры - не делать пустой ход
    if (!IsFigure())
    {
    break;
    }

    //если одна из сторон под шахом - не делать пустой ход
    if (in_check(wtm) || in_check(!wtm))
    {
    break;
    }

    //вычислить сокращение глубины
    int R_NM = (depth > 5*DEPTH_INC) ? DEPTH_INC*3 : DEPTH_INC*2;

    DoNullMove();

    int null_eval = -Search(-beta, -beta+1, depth-DEPTH_INC-R_NM, ply+1, !wtm, 1);

    UnDoNullMove();

    if (null_eval >= beta)
    {
    return beta;
    }
    }
    while (0);

    Различий между PV и не-PV узлами не делаю
    Отсечку (null_eval >= beta) в среднем дает один раз из трех попыток

    Что я делаю неправильно?
  21. Counter Учаcтник

    • Участник
    Member Since:
    21.01.2007
    Message Count:
    23
    Likes Received:
    0
    Репутация:
    0
    Оффлайн
    Пробуй так:

    do
    {
    if (depth<2*DEPTH_INC)
    {
    break;
    }

    //если на доске нет фигуры - не делать пустой ход
    if (!IsFigure())
    {
    break;
    }

    //если одна из сторон под шахом - не делать пустой ход
    if (in_check(wtm) || in_check(!wtm))
    {
    break;
    }

    //вычислить сокращение глубины
    int R_NM = DEPTH_INC*2;

    DoNullMove();

    int null_eval = -Search(-beta, -beta+1, depth-DEPTH_INC-R_NM, ply+1, !wtm, 1);

    UnDoNullMove();

    if (null_eval >= beta)
    {
    return beta;
    }
    }
    while (0);
  22. bankuss Александр

    • Заслуженный
    • Участник
    • Старожил
    Member Since:
    24.05.2006
    Message Count:
    1.084
    Likes Received:
    38
    Репутация:
    6
    Оффлайн
    самое простое, без верификации:
    if (!check && do_null && depth >= null_depth && num_pieces > 5)
    {
    donull;
    score = -search (-beta, -beta + 1, depth - null_red - 1, false);
    undonull;
    if (score >= beta) return beta;
    }
  23. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    Кто-нибудь в шахматах испльзует MultiCut в позициях с малым материалом? (там где не используется Null-Move)
  24. ChessTerminator75 Андрей

    • Участник
    Member Since:
    22.05.2007
    Message Count:
    121
    Likes Received:
    0
    Репутация:
    0
    Location:
    Челябинск
    Оффлайн
    NS я понял вашу мысль.
    Очевидно что эвристика нулевого хода не завязана на альфу-бету и нулевой ход не волнует упорядоченность ходов.

    Но меня смущает один момент из за чего я и написал:
    "Другой вопрос – даст ли нулевой ход прирост при идеальной альфа бете."

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

    Хотелось бы это обсудить.

    P.S. Я буду только рад если окажется что даже при идеальной а-б нулевой ход столь же эффективен как и при полном переборе :)
  25. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    "Поясню свою мысль допустим при полном переборе нулевой ход режет ветку но ведь дело в том что при а-б мы до нее просто не дойдем так как она где то в конце."

    При идеальной Альфа-бете не осталось ни одного узла???

    Нарисуйте дерево идеальной альфа-беты, и посмотрите режет ли Null-Move. Нарисуйте максимальные отсечения по Null-Move, посмотрите каким стал размер дерева.

    Отлично работает Null-Move при идеальной Альфа-бете.
  26. ChessTerminator75 Андрей

    • Участник
    Member Since:
    22.05.2007
    Message Count:
    121
    Likes Received:
    0
    Репутация:
    0
    Location:
    Челябинск
    Оффлайн
    Я обдумаю это.

    NS а вы в своей программе не сравнивали эффективность нулевого хода совместно с нормальной а-б и допустим с а-б без сортировки.
    Для меня это бы стало решающим аргументом.
  27. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Member Since:
    02.05.2006
    Message Count:
    6.811
    Likes Received:
    96
    Репутация:
    3
    Location:
    Санкт-Петербург
    Оффлайн
    1. Бренчинг фактор только с одним методом отсечений - Null-Move - меньше трех... Какой он при идеальной Альфа-бете? :) Корень из 40-ка? больше шести?
    2. Рассмотри перебор на глубину 5. На каждый не первый ход из корня будет рассмотрено n^2 позиций при идеальной альфа-бете. (при 40-ка возможных ходах - 1600 позиций)
    3. Если-же этот ход опровергается Null-Move с R=3, то будет рассмотрена ровно одна позиция.

    Прибавки силы от Null-Move порядка 200-300 пунктов Эло с короткими контролями. Более точно тестировать нет смысла, так как и так понятно что прибавка очень большая.

    Альфа-бету без сортировок мне тестировать не приходило в голову - зачем????

Share This Page