Новости GreKo

Discussion in 'Машинное отделение' started by WinPooh, 2 May 2006.

  1. KEV81
    Оффлайн

    KEV81 Учаcтник

    Репутация:
    6
    какие конкретно ошибки?
     
  2. WinPooh
    Оффлайн

    WinPooh В.М. Staff Member

    Репутация:
    95
    Например, в хэш попадала оценка узла, для которого мы не успели завершить поиск из-за прерывания по времени. То есть не все ходы были рассмотрены.
     
  3. KEV81
    Оффлайн

    KEV81 Учаcтник

    Репутация:
    6
    Хм... действительно. Спасибо!
     
  4. sovaz1997
    Оффлайн

    sovaz1997 Учаcтник

    Репутация:
    3
    УКК-тест tc=5+0.05, Hash=8mb:
    Code:
    Score of GreKo 2018.08 vs GreKo 2018.07: 433 - 258 - 309  [0.588] 1000
    Elo difference: 61.43 +/- 18.04
    PGN
     
    WinPooh likes this.
  5. WinPooh
    Оффлайн

    WinPooh В.М. Staff Member

    Репутация:
    95

     
    MS and sovaz1997 like this.
  6. Stargazer
    Оффлайн

    Stargazer Учаcтник

    Репутация:
    6
    Попробовал GreKo 2018.08. Использую оболочку собственной разработки. Запустил игру с Stockfish 7 64, контроль 2 0. Неожиданно выяснилось что с первого хода GreKo ходит так как будто у него нет времени совсем и он проиграл потратив примерно 4...5 секунд своего времени.
    Предыдущая версия GreKo 2015 ML, которую я пробовал давненько, насколько я помню так не торопилась.
    Для чистоты эксперимента создал новую папку, кинул туда файл оболочки и движки. При подключении движков никаких настроек для этих движков не менял (оставил то что они выдали по умолчанию).
    Результат получился такой-же:
    Как видно по тексту партий приведённому выше, первую партию белыми Грека проиграл когда на часах у него было 02:53 против 01:23 у Стока (контороль 3 0), а вторую чёрными 2:56 против 02:00
    Приходится сделать вывод что Грека тратить время не хочет.
    Предположение что это баг моей оболочки мне представляется очень сомнительным поскольку за отправку данных движку во время игры и для белых и для чёрных отвечает один и тот-же программный код, и для программы все движки одинаковы.
    Для сравнения запустил игру с GreKo 2015 ML. Получилось так:
    Code:
    [Event "Local match"]
    [Site "Local computer"]
    [Date "2018.11.30"]
    [White "GreKo 2015 ML"]
    [Black "Stockfish 7 64"]
    [Result "0-1"]
    [ECO "A00"]
    [TimeControl "180"]
    
    1. Nc3 {[%clk 0:03:00]} d5 {[%clk 0:02:56]} 2. d4 {[%clk 0:02:51]} Nf6 {[%clk 0:02:54]} 3. Bf4 {[%clk 0:02:44]} e6 {[%clk 0:02:50]} 4. e3 {[%clk 0:02:38]} Bb4 {[%clk 0:02:47]} 5. Bd3 {[%clk 0:02:35]} c5 {[%clk 0:02:42]} 6. dxc5 {[%clk 0:02:30]} Nbd7 {[%clk 0:02:41]} 7. Nge2 {[%clk 0:02:26]} a6 {[%clk 0:02:37]} 8. a3 {[%clk 0:02:23]} Bxc5 {[%clk 0:02:34]} 9. Bg3 {[%clk 0:02:18]} O-O {[%clk 0:02:31]} 10. b4 {[%clk 0:02:14]} Be7 {[%clk 0:02:26]} 11. Nd4 {[%clk 0:02:10]} Nb6 {[%clk 0:02:18]} 12. O-O {[%clk 0:02:04]} Bd6 {[%clk 0:02:18]} 13. Rb1 {[%clk 0:02:00]} Bxg3 {[%clk 0:02:13]} 14. hxg3 {[%clk 0:01:56]} Qc7 {[%clk 0:02:11]} 15. Qe1 {[%clk 0:01:53]} e5 {[%clk 0:02:11]} 16. Nb3 {[%clk 0:01:50]} Be6 {[%clk 0:02:05]} 17. Nc5 {[%clk 0:01:48]} Rac8 {[%clk 0:02:00]} 18. e4 {[%clk 0:01:45]} d4 {[%clk 0:01:57]} 19. Ne2 {[%clk 0:01:43]} Ba2 {[%clk 0:01:52]} 20. Rb2 {[%clk 0:01:40]} Bc4 {[%clk 0:01:49]} 21. Qd2 {[%clk 0:01:39]} Nfd7 {[%clk 0:01:42]} 22. Rfb1 {[%clk 0:01:36]} Bb5 {[%clk 0:01:39]} 23. Bxb5 {[%clk 0:01:32]} axb5 {[%clk 0:01:37]} 24. Rb3 {[%clk 0:01:29]} Nc4 {[%clk 0:01:31]} 25. Qd3 {[%clk 0:01:24]} Nf6 {[%clk 0:01:29]} 26. a4 {[%clk 0:01:21]} bxa4 {[%clk 0:01:28]} 27. Nxa4 {[%clk 0:01:20]} Nxe4 {[%clk 0:01:23]} 28. Qxe4 {[%clk 0:01:17]} Nd2 {[%clk 0:01:22]} 29. Qd3 {[%clk 0:01:16]} Nxb1 {[%clk 0:01:20]} 30. Rxb1 {[%clk 0:01:14]} Qxc2 {[%clk 0:01:19]} 31. Nb2 {[%clk 0:01:10]} Rfd8 {[%clk 0:01:09]} 32. Kf1 {[%clk 0:01:06]} f5 {[%clk 0:01:07]} 33. b5 {[%clk 0:01:03]} Qxd3 {[%clk 0:01:03]} 34. Nxd3 {[%clk 0:01:02]} e4 {[%clk 0:01:03]} 35. Nb4 {[%clk 0:01:01]} d3 {[%clk 0:01:00]} 36. Nf4 {[%clk 0:00:59]} Kf7 {[%clk 0:01:00]} 37. Ke1 {[%clk 0:00:58]} Rc5 {[%clk 0:00:58]} 38. Na2 {[%clk 0:00:56]} g5 {[%clk 0:00:55]} 39. Nh3 {[%clk 0:00:54]} h6 {[%clk 0:00:55]} 40. Kd1 {[%clk 0:00:53]} Rc2 {[%clk 0:00:52]} 41. Nb4 {[%clk 0:00:52]} Re2 {[%clk 0:00:50]} 42. b6 {[%clk 0:00:50]} Rd6 {[%clk 0:00:47]} 43. Rb3 {[%clk 0:00:49]} Rxb6 {[%clk 0:00:47]} 44. Nxd3 {[%clk 0:00:47]} Rxb3 {[%clk 0:00:45]} 45. Nc1 {[%clk 0:00:46]} Reb2 {[%clk 0:00:43]} 46. Nxb3 {[%clk 0:00:45]} Rxb3 {[%clk 0:00:43]} 47. Kd2 {[%clk 0:00:43]} Rd3+ {[%clk 0:00:41]} 48. Ke2 {[%clk 0:00:41]} Ra3 {[%clk 0:00:38]} 49. Ke1 {[%clk 0:00:38]} b5 {[%clk 0:00:36]} 50. Kd1 {[%clk 0:00:36]} Ra2 {[%clk 0:00:34]} 51. Kc1 {[%clk 0:00:35]} b4 {[%clk 0:00:34]} 52. Kb1 {[%clk 0:00:34]} b3 {[%clk 0:00:33]} 53. Kc1 {[%clk 0:00:33]} g4 {[%clk 0:00:32]} 54. Nf4 {[%clk 0:00:32]} Rxf2 {[%clk 0:00:31]} 55. Nd5 {[%clk 0:00:32]} Ke6 {[%clk 0:00:27]} 56. Nb4 {[%clk 0:00:30]} Rxg2 {[%clk 0:00:27]} 57. Na6 {[%clk 0:00:30]} Rc2+ {[%clk 0:00:26]} 58. Kb1 {[%clk 0:00:29]} e3 {[%clk 0:00:25]} 59. Nb4 {[%clk 0:00:28]} Rd2 {[%clk 0:00:25]} 60. Kc1 {[%clk 0:00:27]} Kd6 {[%clk 0:00:25]} 61. Kb1 {[%clk 0:00:26]} e2 {[%clk 0:00:24]} 62. Nd3 {[%clk 0:00:25]} Rxd3 {[%clk 0:00:24]} 63. Kb2 {[%clk 0:00:22]} Rxg3 {[%clk 0:00:24]} 64. Ka3 {[%clk 0:00:20]} e1=Q {[%clk 0:00:24]} 65. Ka4 {[%clk 0:00:20]} Kc5 {[%clk 0:00:24]} 66. Ka3 {[%clk 0:00:19]} Qa1# {[%clk 0:03:00]} {White checkmated} 0-1
    
    Разница как я и предполагал проявилась. Здесь Грека проиграл с уже меньшим временем на часах чем
    у Стока (00:19 против 00:24).

    Есть у вас какие нибудь мысли по этому поводу?
     
    Last edited: 30 Nov 2018
  7. WinPooh
    Оффлайн

    WinPooh В.М. Staff Member

    Репутация:
    95
    Попробуйте запустить программу с параметром -log.
    Будет создан файл GreKo.log, где в строчках со словом TIME будет указано распределение времени движка.
    Например:

    16:55:02 > time 6000
    16:55:04 > go
    16:55:04 TIME: rest = 60000, moves = 0, inc = 0 ==> stHard = 1500, stSoft = 1500
    16:55:04 SEARCH: rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1
    16:55:04 < 1 37 0 20 1. d4
    16:55:04 < 2 24 0 96 1. d4 d5
    16:55:04 < 3 16 0 600 1. d4 d5 2. Nc3
    16:55:04 < 4 24 0 1732 1. d4 d5 2. Nc3 Nc6
    16:55:04 < 5 14 1 5043 1. d4 d5 2. Bf4 Nc6 3. e3
    16:55:04 < 6 24 3 12443 1. d4 d5 2. Nc3 Nf6 3. Nf3 Nc6
    16:55:04 < 7 20 4 33852 1. d4 d5 2. Bf4 Nc6 3. e3 Nf6 4. Nc3
    16:55:04 < 8 18 7 76444 1. d4 d5 2. Bf4 Nc6 3. e3 e5 4. Bxe5 Nxe5 5. dxe5 Bf5 6. Nc3
    16:55:04 < 9 19 12 154565 1. d4 d5 2. Bf4 Bf5 3. Nc3 e6 4. e3 Nf6 5. Nf3
    16:55:04 < 10 24 23 305546 1. d4 d5 2. Bf4 Bf5 3. Nc3 e6 4. e3 Nf6 5. Nf3 Nc6
    16:55:04 < 11 19 46 658389 1. d4 d5 2. Bf4 Bf5 3. Nc3 e6 4. e3 Nf6 5. Bd3 Bxd3 6. Qxd3 Nc6 7. Nf3
    16:55:05 Search stopped by stHard, dt = 1513
    16:55:05 < move d2d4
    16:55:07 > quit

    В любом случае, для дальнейшего анализа хотелось бы видеть абсолютно все команды, приходящие к движку от оболочки. По простому PGN-файлу с хронометражом сказать что-то затруднительно.
     
  8. Stargazer
    Оффлайн

    Stargazer Учаcтник

    Репутация:
    6
    Да, получилось!
    Я постараюсь в ближайшее время добавить отладочный код чтобы то что отправляется движку можно было увидеть в логе. Было бы интересно выяснить где же собака баг. По логике вещей он либо в движке либо в оболочке. Третьего вроде не дано.
     
  9. WinPooh
    Оффлайн

    WinPooh В.М. Staff Member

    Репутация:
    95
    Алгоритм распределения времени у GreKo очень простой. Весь он находится в функции ComputeTimeLimits(), файл main.cpp.

    Code:
      if (g_inc > 0)
       {
         // time control with increment
         g_stHard = g_restTime / 2;
         g_stSoft = g_restTime / 40;
       }
       else if (g_restMoves == 0 && g_movesPerSession == 0)
       {
         // absolute time control
         g_stHard = g_restTime / 40;
         g_stSoft = g_restTime / 40;
       }
       else
       {
         // N moves in M minutes
         if (g_movesPerSession > 0)
         {
           int curr = g_pos.Ply() / 2 + 1;
           g_restMoves = g_movesPerSession - ((curr - 1) % g_movesPerSession);
         }
         int divisor = (g_restMoves > 1)? g_restMoves : 2;
         g_stHard = g_restTime / divisor;
         g_stSoft = g_stHard / 2;
       }
    Если после очередной итерации время превышает stSoft, делаем ход. Если итерация ещё не закончена, а время превысило stHard - останавливаем итерацию и тоже делаем ход.
     
  10. KEV81
    Оффлайн

    KEV81 Учаcтник

    Репутация:
    6
    я в WB не очень разбираюсь, но точно так должно быть?
     
  11. WinPooh
    Оффлайн

    WinPooh В.М. Staff Member

    Репутация:
    95
    Именно так. В протоколе Winboard время в команде time приходит в сотых долях секунды, в команде st - в целых секундах. Внутри GreKo всё переводится в миллисекунды.
    В протоколе UCI - везде миллисекунды.
     
  12. Stargazer
    Оффлайн

    Stargazer Учаcтник

    Репутация:
    6
    У меня в оболочке всё сделано по UCI - поэтому миллисекунды.
    Сейчас посмотрел по коду. Завел игру с контролем 2 0 (2 минуты без добавления), белые - я, чёрные - движок.
    Когда оболочке нужен ход от движка, она посылает ему две строки. Так для указанного случая после моего хода 1. е4
    первая строка - такая:
    "position fen rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - 0 1"
    вторая строка - такая:
    "go wtime 120000 btime 120000 movestogo 999"

    Здесь 120000 - это 2 минуты на часах в миллисекундах. Для последующих ходов это число разумеется будет меньше поскольку нет добавления на ход и время уменьшается.
    Движок по идее должен исходя из данных фена в строке 1 определить за белых или за черных ему надо думать, потом взять из 2-й строки значение wtime (если за белых) или btime и рационально в пределах этого количества миллисекунд обдумывать своё решение. И выдать свой ход.

    Полностью на всю игру данные (лог) ещё не успел - не было времени. Завтра. Но так уже на первых ходах в игре разница между GreKo 2018.08 и стокфишем к примеру заметна сразу на глаз: сток думает 1...2 секунды а потом даёт ход, а GreKo 2018.08 выстреливает сразу.
    Ну а в других оболочках где вы проверяли всё гуд?
     
  13. WinPooh
    Оффлайн

    WinPooh В.М. Staff Member

    Репутация:
    95
    Ну так вы же сами посылаете движку movestogo 999. То есть что за оставшиеся 2 минуты ему надо успеть сделать 999 ходов. Вот он и торопится.
    Если контроль абсолютный, а не X ходов за Y минут, то movestogo просто не надо присылать. Так делают все оболочки, в которых я тестировал, и везде всё нормально.
    Впрочем, я вообще предпочитаю не тестировать с абсолютным контролем. Чаще всего использую 1 мин. + 1 сек. добавления.
     
    Last edited: 1 Dec 2018
  14. Stargazer
    Оффлайн

    Stargazer Учаcтник

    Репутация:
    6
    Убрал movestogo и время пошло у GreKo 2018. Вставил я эту команду потому-что делал по описанию протокола UCI, где было написано что она нужна. А поставил 999 потому-что заранее неизвестно сколько ходов будет в игре. Ну и движки что использовались при отладке с этим работали вполне адекватно и сомнений в правильности не возникало.

    Да, и при отладке оболочки часто возникает необходимость завершения работы программы в любой момент (работа под дебагером). Также неплохо рассмотреть случай когда произошло зависание оболочки. При этом если оболочка запустила ранее какой-нибудь движок, то она его сама не выгрузит.
    Лучшие движки при таком развитии событий выгружают себя сами (например Стокфиш, Комодо). Другие (например Гудини 1.5а и ваш Греко) остаются висеть и начинают сильно напрягать процессор. Приходится их снимать вручную через диспетчер задач.
    В качестве доработки движка могу посоветовать сделать такую автовыгрузку.
     
  15. WinPooh
    Оффлайн

    WinPooh В.М. Staff Member

    Репутация:
    95
    Возможно, у них просто другой алгоритм распределения времени. А мой движок не умеет понимать, действительно ли вы хотите контроль 2 минуты на 999 ходов, или просто пошутили.
     
  16. sovaz1997
    Оффлайн

    sovaz1997 Учаcтник

    Репутация:
    3
    movestogo #x
    До следующего контроля времени осталось #x ходов.
    Эту команду следует посылать только в случае x > 0. Если эта команда отсутствует, но присутствуют "wtime" и "btime", то время которое есть сейчас у игрока, дано ему до конца игры, и никаких добавлений (каждый ход или по контролю) не будет (sudden death).

    http://kvetka.org/UCI_format.shtml


    Вам в оболочке надо добавить доп. условие. Это очень важная штука - дается время либо на партию и здесь достаточно сложно рассчитывать время, либо время дается на определенное число ходов, здесь уже все намного проще. У меня в движке вообще время равномерно распределяется в таком режиме. Мой движок в вашей оболочке будет также делать слишком быстрые ходы.
     
  17. KEV81
    Оффлайн

    KEV81 Учаcтник

    Репутация:
    6
    это количество ходов до контроля, а не общее количество))
     
  18. WinPooh
    Оффлайн

    WinPooh В.М. Staff Member

    Репутация:
    95
    Играет тестовая версия GreKo, у которой в оценке только материал, таблицы полей и мобильность фигур. Безопасности короля в оценке нет вообще, поэтому партия получилась весёлая :)

     
  19. SDChess
    Оффлайн

    SDChess Учаcтник

    Репутация:
    6
    Новая версия GreKo 2021.05, от Владимира Медведева! Не буду подробно расписывать достоинства новой версии, скажу лишь, что она является в определенной мере продолжением экспериментальной ветки GreKo.
    Владимир подготовил версии как для Windows так и Linux! По авторской оценке настоящая версия несколько превосходит сильнейшую версию GreKo 2020.03.
    http://greko.su/index.html
     
  20. WinPooh
    Оффлайн

    WinPooh В.М. Staff Member

    Репутация:
    95
    Экспериментальная версия с оценкой NNUE из Стокфиша.
    Сила игры в однопоточном режиме где-то в районе 3170, в многопоточном около 3220.
    http://greko.su/greko-2021.08-nnue.zip
    Code:
      Engine             Score          Gr
    1: GreKo 2021.08 NNUE 40.0/60 ··········
    2: Gull 3             6.5/10  ==0=1==111
    3: Strelka 5.5        6.0/10  =10=====11
    4: SmarThink 1.98     2.5/10  ==0=0=0=00
    4: Senpai 2.0         2.5/10  010001=000
    6: Rybka 2.3.2a       1.5/10  0==0000=00
    7: Counter 3.8        1.0/10  000=00000=
    
      Engine             Score          Gr
    1: GreKo 2021.08 NNUE 4-CPU 44.0/60 ··········
    2: Gull 3             5.5/10  =00111=10=
    3: Strelka 5.5        3.5/10  000=====01
    4: Senpai 2.0         2.5/10  0=10=00=00
    4: Rybka 2.3.2a       2.5/10  =001000100
    6: SmarThink 1.98     1.5/10  00=0000=0=
    7: Counter 3.8        0.5/10  000=000000
     
    Last edited: 17 Aug 2021
    sovaz1997 and SDChess like this.