Форум » » Что нельзя объяснить шахматной программе? » Ответить

Что нельзя объяснить шахматной программе?

PozitiFF_Chess: Остались ли еще какие-то чисто человеческие привилегии, которые нельзя было бы объяснить программе с помощью алгоритмов? И если да - то почему этого сделать нельзя? Или можно поставить вопрос по-другому: какими чисто шахматными законами обычно пренебрегают разработчики с целью оптимизации своего кода и усиления игры шахматной программы?

Ответов - 94, стр: 1 2 3 4 5 All

WildCat: У меня нет 6-фигурных баз.

WildCat: И тем не менее вот пример: [chess]2r5/2P4R/3k3P/3p3r/8/8/1KR5/8 w[/chess] Рыбка выдает чуть больше +2. Роба Робка еще чуть больше.

WildCat: Вот еще одна позиция, где 6-фигурные базы не должны помогать: [chess]1nk5/Q7/4r2p/PK6/8/8/8/8 w[/chess]


Кевин: А можно ли объяснить шахматной программе, что когда ход единственный, то нужно его сразу делать? Сколько наблюдаю партий на плече, в своих матчах, турнирах - поголовно движки, особенно без пондера, долго раздумывают над единственными (в смысле, хорошими) ходами, например: противник взял моего ферзя своим и если мой движок не заберёт его ферзя, то, конечно, проиграет. Смысл раздумывать, когда ферзя-то надо брать Или же шах королю, три возможных поля: пойдёт на первое - мат получит, на второе - фигуру отдаст, на третье - нормальная позиция будет. Зачем думать? Или же даже когда королю шах и единственное поле отступления, так движок думает да думает, давая противнику больше время для просчитывания вариантов и теряя своё драгоценное время, особенно при игре блиц и буллет.

unknow: Кевин пишет: А можно ли объяснить шахматной программе На самом деле объяснить можно все. Вопрос только во времени на построение логической модели, кодирование и отладку. когда королю шах и единственное поле отступления Это делается еще при старте поиска, типа: [pre2] move_gen_legal(&rtable); if (rtable.count == 1) bestline.pv[0][0] = rtable.moves[0].move; if (rtable.count <= 1) goto finality; [/pre2] шах королю, три возможных поля: пойдёт на первое - мат получит, на второе - фигуру отдаст, на третье - нормальная позиция будет А тут движку уже считать нужно - где самая дальняя жопа :) противник взял моего ферзя своим и если мой движок не заберёт его ферзя, то, конечно, проиграет Не знаю у кого как, сегодня как раз закончил отлаживать свою фишку: [pre2] // exchange booster if (!board.props.in_check) if (cur_depth > 3 && cur_depth < 10 && cur_score + 250 < beta) picker.in_exchange = true; [/pre2] Это кусок для cut-node, picker после этого должет выдавать только взятия и шахи - типа сужение выхода из текущей позиции по аналогии с поиском за горизонтом - в quies. Этот прунинг делает бесполезным futility pruning - сейчас раздумываю что из двух оставлять :)

Osipov: На самом деле, в этом вопросе о "единственных" ходах не всё так просто. Лишнего времени на раздумья не бывает. Даже в случае единственного хода бывает полезно подумать. Дело в том, что программа хэширует свои мысли, и этот хэш помогает сократить перебор после следующего хода. Если мы сделаем ход мгновенно, то информация в хэше станет совсем неактуальной, и на следующих ходах придется думать дольше. З.Ы. Наверно, опять неясно высказался.

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

PozitiFF_Chess: Кузьмич пишет: но ведь в таком случае возникнет и абсолютно лишний, заведомо ненужный хэш Предположим создалась такая позиция, что мы вынуждены брать королем черного ферзя на d1 (единственный ход). Если мы сделаем его мгновенно, то хэш будет заполнен устаревшей информацией, в которой помимо размена на d1 будет и всякая левая инфа. "Задумавшись" над единственным ходом, мы заполняем хэш уже актуальной инфой. И уже следующий ход после размена нам будет делать легче... Но тут возникает вопрос - где мы выигрываем, если все равно хэш будет заполняться актуальной информацией на следующем ходу? А единственный ход можно сделать и моментально... (то есть - я тоже вероятно не понял :) )

дуп: // exchange booster if (!board.props.in_check) if (cur_depth > 3 && cur_depth < 10 && cur_score + 250 < beta) picker.in_exchange = true; Это из поиска. Все равно непонятно, как в корне не нарваться на тактику. Если есть всего три легальных хода, один из них уже N-итераций принес оценку, намного лучшую остальных двух ходов. Если отослать этот ход, всегда есть шанс, что здесь была крутейшая комбинация и мы поторопились

Кузьмич: Но тут возникает вопрос - где мы выигрываем, если все равно хэш будет заполняться актуальной информацией на следующем ходу? во, я именно это и имел в виду, только не совсем точно сформулировал

unknow: дуп пишет: Если есть всего три легальных хода, один из них уже N-итераций принес оценку, намного лучшую остальных двух ходов. Если отослать этот ход, всегда есть шанс, что здесь была крутейшая комбинация и мы поторопились Тут можно использовать exclude probe как в ипполите для увеличения глубины этого хода, по сравнению с остальными. И получить на чуть-чуть более точную оценку, если порция времени еще не израсходована.

Кевин: [chess]6rk/4q2n/p1p1p1pP/PpPpPpP1/1P1P1P2/3N2K1/3Q4/7R b - - 0 60[/chess] 6rk/4q2n/p1p1p1pP/PpPpPpP1/1P1P1P2/3N2K1/3Q4/7R b - - 0 60 Ну вот как заставить движок не мучать мозг в такой позиции? Она получилась в партии Игоррит - Рыбка. Может, можно как-нибудь запрограммировать в движок ничейно оценивать позиции с заблокированными пешками?

immortal223: Ну если б вместо коней были б у белых чернопольный слон, а у чёрных - белопольный, то было б ещё веселее и вообще 100% ничья. А тут - играть и играть

unknow: Кевин пишет: Ну вот как заставить движок не мучать мозг в такой позиции? Написать пробник с двумя нулевыми: - слабейшая сторона - на дельту от текущей позиции до beta, например -125 сантипешек запускает типа dbl_null_probe - признак чего передается например рекурсивно через стек - через полуход противника делается второй нулевой - далее при наличии признака что уже было два своих нулевых, закрытых полуходами противника, берем оценку - если оценка не ухудшилась, с мелкими дельтами можно поэкспериментировать, возвращаем -125 / 2 = -62 без дальнейшего углубления - эти -62 возвращаются наверх туда где было -125 и здесь свои ходы можно не смотреть вернуться еще раз наверх дав противнику его +62 понизив тем самым оценку его хода в который он уже не полезет. На стеке в переменной типа int поместится и признак и оценка short при старте пробника Второй нулевой делается если предыдущий ход противника не взятие, на взятие надо наверное сделать прерывание пробы. Вот такая типа идея. Параметры прунинга подобрать методом тыка, соль-перец по вкусу :)

PozitiFF_Chess: unknow пишет: - слабейшая сторона - на дельту от текущей позиции до beta, например -125 сантипешек запускает типа dbl_null_probe - признак чего передается например рекурсивно через стек - через полуход противника делается второй нулевой - далее при наличии признака что уже было два своих нулевых, закрытых полуходами противника, берем оценку - если оценка не ухудшилась, с мелкими дельтами можно поэкспериментировать, возвращаем -125 / 2 = -62 без дальнейшего углубления - эти -62 возвращаются наверх туда где было -125 и здесь свои ходы можно не смотреть вернуться еще раз наверх дав противнику его +62 понизив тем самым оценку его хода в который он уже не полезет. Ну играют черные Кж5 и Ке4+ своими двумя нулевыми ходами... Какую дельту ставить? ) unknow пишет: а взятие надо наверное сделать прерывание пробы Можно тогда и без взятия: Кф6 и Ке4...

Кевин: [chess]8/3bB3/p2Pk1p1/P1K2p2/1P6/4P1P1/8/8 w - - 0 72[/chess] 8/3bB3/p2Pk1p1/P1K2p2/1P6/4P1P1/8/8 w - - 0 72 Вот ещё один пример мозгомучительной позиции: у белых две лишних пешки, однако слоны на доске разнопольные и чёрный король подобрался близко к проходной белых. Очевидно, что тут ничья, однако двиги продолжают одинаково оценивать позицию и затем, избегая правила 50 ходов, ьелые отдают пешку и оценка снижается у обоих движков. Не люблю, когда на том же плече возникают подобные позиции, а движок соперника на моё предложение ничьи не откликается, видя оценку далёкой от нуля. Вот вся партия: [Event "Capitalists vs Rajlich 3, Блиц:1'+1""] [Site "USER-GZ7TNXNACM"] [Date "2010.01.10"] [Round "2"] [White "Igorrit MP verzione 0.086v6 x"] [Black "Rybka 3"] [Result "1/2-1/2"] [ECO "D38"] [Annotator "0.21;-0.14"] [PlyCount "285"] [TimeControl "60+1"] {} 1. d4 {B 0} Nf6 {B 0} 2. c4 {B 0} e6 {B 0} 3. Nc3 {B 0} d5 {B 0} 4. Nf3 {B 0} Bb4 {B 0} 5. cxd5 {B 0} exd5 {B 0} 6. Bg5 {B 0} Nbd7 {B 0} 7. e3 {B 0} c5 {B 0} 8. Bd3 {B 0} Qa5 {B 0} 9. Qc2 {B 0} c4 {B 0} 10. Bf5 {B 0} O-O {B 0} 11. O-O { B 0} Re8 {B 0} 12. Nd2 {B 0} g6 {B 0 Оба Последний ход в книге} 13. Bxd7 {0.21/ 16 4} Nxd7 {-0.14/11 1} 14. e4 {0.27/17 4 (Rac1)} dxe4 {0.08/12 3} 15. h4 {0. 25/17 1} Bxc3 {0.06/13 2} 16. Nxc4 {0.21/18 3} Qa6 {0.15/14 14} 17. Qxc3 {0.21/ 16 0} Nf6 {0.14/15 5} 18. Ne3 {0.39/18 8} Ng4 {0.15/15 5} 19. Qc7 {0.39/18 4 (Rfc1)} Nxe3 {0.08/11 2 (Bf5)} 20. fxe3 {0.40/19 3} Be6 {0.16/14 2} 21. Bh6 { 0.45/19 2} Bd5 {0.24/14 3} 22. Rac1 {0.36/19 2} Qe6 {0.24/14 2} 23. b3 {0.43/ 18 1} Rac8 {0.24/15 3} 24. Qf4 {0.43/18 2} a6 {0.23/15 4 (Rc6)} 25. Bg5 {0.49/ 17 1 (Rc7)} f5 {0.31/12 2} 26. h5 {0.53/17 2} Qf7 {0.49/13 5} 27. hxg6 {0.74/ 18 4} hxg6 {0.74/14 4} 28. Kf2 {0.81/18 4} Be6 {0.74/13 2 (Qe6)} 29. Rh1 {1.06/ 19 2} Rxc1 {0.73/15 3} 30. Rxc1 {1.06/17 0} Rc8 {0.75/15 3} 31. Rxc8+ {1.02/21 2} Bxc8 {0.75/14 0} 32. Qb8 {1.02/22 5 (Qe5)} Qd7 {0.74/15 2} 33. Qe5 {1.02/22 3} b5 {0.80/14 2} 34. Qf6 {1.02/21 1} Qf7 {0.75/16 2} 35. Qb6 {1.02/21 1 (Qd8+) } Kg7 {0.80/15 2} 36. Qc6 {1.02/20 1 (Qc5)} Bb7 {0.80/14 2 (Qe6)} 37. Qd6 {1. 02/21 2} Bc8 {0.80/16 3} 38. d5 {1.02/20 1 (Qc5)} Bb7 {0.79/15 1} 39. Qe5+ {1. 02/18 0} Kg8 {0.79/15 1} 40. Qb8+ {1.02/19 2} Kg7 {0.79/15 1} 41. d6 {1.02/17 0 } Qd7 {0.80/15 1} 42. Qa7 {1.02/19 1} Bc6 {0.82/15 3 (Kg8)} 43. Qd4+ {1.01/21 3 } Kh7 {0.82/14 1 (Kg8)} 44. Qf6 {1.02/19 2} Qg7 {0.80/16 1} 45. Qd8 {1.03/20 1} Qd7 {0.80/16 1} 46. Qb8 {1.01/19 1} Qg7 {0.81/15 5 (Kg7)} 47. Qb6 {1.01/19 2} Qb2+ {0.81/15 1 (Bd7)} 48. Kg3 {1.01/21 2} Bd7 {0.81/16 1} 49. Qc7 {0.96/21 9} Qe5+ {0.79/15 1} 50. Bf4 {0.86/22 8} Qe6 {0.80/14 1} 51. Kf2 {0.90/21 9 (Qb6)} Kg8 {0.65/12 2} 52. Qb6 {0.90/20 1 (Kf1)} Qf6 {0.62/13 2 (Kf7)} 53. Qb7 {0.75/ 17 1} Qh4+ {0.60/13 1} 54. Bg3 {0.75/19 2} Qd8 {0.59/14 1} 55. Be5 {0.70/19 2 (Kf1)} Qh4+ {0.44/12 2} 56. Ke2 {0.64/20 1} Qg4+ {0.43/14 1} 57. Ke1 {0.64/20 1 } Qh4+ {0.43/13 3 (Qg5)} 58. g3 {0.64/18 1} Qh1+ {0.43/13 3} 59. Kd2 {0.64/16 0 } b4 {0.43/13 2} 60. Qxb4 {1.13/16 2} Qf1 {0.99/12 1} 61. Qd4 {1.03/17 1} Qd3+ {0.94/14 1} 62. Qxd3 {1.03/18 0} exd3 {0.94/13 0} 63. Bf6 {1.10/19 4 (K:d3)} Kf7 {0.89/17 1} 64. Be7 {1.07/19 0} Bb5 {0.89/17 1} 65. a4 {1.12/19 0} Bc6 {0. 90/17 2} 66. Kxd3 {1.12/19 1} Bf3 {1.21/17 1} 67. Kd4 {1.13/18 0 (b4)} Bd1 {1. 04/18 1} 68. Kc4 {1.13/19 1} Ke6 {1.21/18 2} 69. a5 {1.20/19 1} Bc2 {1.21/20 1 (Be2+)} 70. b4 {1.20/19 1} Ba4 {1.21/21 1} 71. Kc5 {1.20/19 1} Bd7 {1.21/21 1 (Kd7)} 72. Kb6 {1.52/21 2} Bb5 {1.21/19 0} 73. Kc7 {1.52/21 1} Bd7 {1.21/21 1 (Be8)} 74. Bf6 {1.52/20 1 (Bg5)} Bb5 {1.21/19 1} 75. Bd4 {1.52/19 0 (Ba1)} Bd7 {1.21/20 1} 76. Ba1 {1.52/19 1} Bb5 {1.21/21 1} 77. Bc3 {1.52/19 0} Bd7 {1.21/ 21 1} 78. Bd4 {1.52/19 0 (Be5)} Bb5 {1.21/22 1} 79. Ba1 {1.52/19 1 (Bb2)} Bd7 { 1.21/22 1} 80. Bc3 {1.51/18 0 (Be5)} Be8 {1.21/22 1 (Bb5)} 81. Bg7 {1.51/19 2 (Bb2)} Bb5 {1.21/23 2 (Bd7)} 82. Bh6 {1.51/20 2 (Bb2)} Bd7 {1.21/19 1} 83. Bg5 {1.51/19 0 (Kb6)} Be8 {1.21/21 1 (Bb5)} 84. Bf4 {1.51/19 2} Bd7 {1.21/21 1} 85. Be5 {1.51/19 1 (Bh6)} Bb5 {1.21/21 2} 86. Bf6 {1.51/19 1 (Bg7)} Bd7 {1.21/18 1} 87. Bb2 {1.16/19 5 (Kb6)} Be8 {1.21/18 1} 88. Ba3 {1.16/19 2 (Kd8)} Bd7 {1.21/ 21 1 (Bb5)} 89. Bc1 {1.16/19 1} Bb5 {1.21/22 0 (Ba4)} 90. Bd2 {1.16/20 2 (Bb2)} Be8 {1.02/20 1} 91. Kb6 {1.16/19 1} Bb5 {1.02/18 0} 92. Kc5 {1.16/18 0} Kd7 { 1.12/21 1} 93. Bc3 {1.16/19 0} Ke6 {1.21/21 2 (Bc6)} 94. Bh8 {1.16/20 1 (Bd4)} g5 {1.21/18 2 (Kd7)} 95. Bb2 {1.24/20 1 (Bc3)} Ba4 {1.21/19 1 (g4)} 96. Bg7 { 1.24/19 1} Bb5 {1.30/18 1} 97. Bh6 {1.37/21 2 (Bf8)} g4 {1.30/19 1} 98. Bf4 { 1.31/21 2} Be8 {1.30/21 1 (Kd7)} 99. Kb6 {1.59/19 1} Bb5 {1.30/19 0} 100. Kc7 { 1.59/21 1} Bd7 {1.30/21 1 (Be8)} 101. Be5 {1.59/21 1 (Bg5)} Be8 {1.30/17 1} 102. Bd4 {1.59/20 0 (Ba1)} Bb5 {1.30/20 1} 103. Bb2 {1.59/20 1 (Bc3)} Be8 {1. 30/20 1 (Bd7)} 104. Ba1 {1.59/20 1 (Bg7)} Bd7 {1.30/20 1 (Bb5)} 105. Bg7 {1.59/ 21 1 (Bc3)} Bb5 {1.30/21 1} 106. Bc3 {1.59/21 1 (Bd4)} Bd7 {1.30/21 1} 107. Bf6 {1.59/21 1 (Ba1)} Bb5 {1.30/20 1} 108. Bd4 {1.59/21 1 (Bd8)} Be8 {1.30/20 1 (Bd7)} 109. Kd8 {1.59/21 3 (Bh8)} Bb5 {1.00/17 3 (Bd7)} 110. Bc5 {1.59/21 0 (Be5)} Bd7 {0.97/20 1 (Bc4)} 111. Kc7 {1.59/21 0} Bb5 {1.07/20 2} 112. Kc8 {1. 59/21 1 (Ba7)} Bc6 {0.76/20 1 (Be8)} 113. b5 {0.79/19 1} Bxb5 {0.76/21 1} 114. Kc7 {0.79/20 0} Bd7 {0.76/22 1} 115. Bd4 {0.79/20 0} Bb5 {0.76/23 1} 116. Bc3 { 0.79/21 1 (Bg7)} Bd7 {0.76/22 1} 117. Ba1 {0.79/21 1 (Bg7)} Ba4 {0.76/23 1 (Bb5)} 118. Bb2 {0.79/21 0} Bb5 {0.76/23 1} 119. Bh8 {0.79/21 0 (Bd4)} Bd7 {0. 76/23 1} 120. Bf6 {0.79/22 1 (Bc3)} Bb5 {0.76/22 1} 121. Bb2 {0.79/22 1 (Bd4)} Bd7 {0.76/22 1} 122. Bh8 {0.79/22 0 (Bc3)} Ba4 {0.76/22 1 (Bb5)} 123. Ba1 {0. 79/22 1} Bd7 {0.76/24 2 (Bb5)} 124. Be5 {0.79/22 1 (Bc3)} Ba4 {0.76/22 1 (Bb5)} 125. Bg7 {0.79/22 1} Bd7 {0.76/23 1 (Be8)} 126. Bc3 {0.79/23 3} Bb5 {0.76/23 1} 127. Be1 {0.79/22 1 (Bb4)} Bd7 {0.76/24 1} 128. Bb4 {0.79/22 0 (Bd2)} Bb5 {0. 76/22 1} 129. Kc8 {0.79/22 1} Bd7+ {0.76/22 1 (Bc6)} 130. Kd8 {0.79/23 1 (Kb7)} Bb5 {0.76/23 1 (Ba4)} 131. Kc7 {0.79/23 1 (Ba3)} Bd7 {0.76/23 1} 132. Bc5 {0. 79/23 1 (Be1)} Bb5 {0.76/24 2} 133. Ba3 {0.79/22 1} Bd7 {0.76/23 2 (Ba4)} 134. Kd8 {0.79/22 0 (Bc1)} Bb5 {0.48/21 1} 135. Bb4 {0.79/23 2 (Kc8)} Bd7 {0.09/20 1 } 136. Bc5 {0.79/21 0} Ba4 {0.09/18 0 (Bc6)} 137. e4 {0.10/22 1} fxe4 {0.09/17 0} 138. Kc7 {0.10/22 0} Bb5 {0.06/22 1} 139. Be3 {0.10/22 1 (Bd4)} Be8 {0.06/ 23 1 (Bd7)} 140. Bf4 {0.10/23 1 (Ba7)} Bd7 {0.06/22 1 (Bb5)} 141. Bc1 {0.10/23 1 (Kb6)} Be8 {0.06/22 1 (Bb5)} 142. Bd2 {0.10/23 1} Bd7 {0.06/24 1} 143. Bf4 { 0.10/23 1 Согласился на ни~~ьo^} 1/2-1/2 В общем, с оценкой движками ничейных позиций далеко не идеально. Примеров позиций, где оценка неправильна, уйма.

immortal223: Кевин Юзай тэг [ chess] - третья кнопочка справа в нижнем ряду - устал уже за тобой исправлять, так визуально приятно и сразу видна позиция

Кевин: immortal223 , Обычно просто для экономии трафика отключаю картинки и, конечно, не вижу доску с фигурами.

immortal223: Кевин пишет: Вот ещё один пример мозгомучительной позиции: [chess]8/2b3k1/6r1/5K2/2B5/2p5/2N5/8 w - - 0[/chess] 8/2b3k1/6r1/5K2/2B5/2p5/2N5/8 w - - 0 159 7-фигурка тоже бы не помешала. В этой позиции у меня жевали сопли оба движка пока я не плюнул и не присудил им ничью. А оценки были у Рыбы -3 у Игоря вообще -4

PozitiFF_Chess: Кевин пишет: Обычно просто для экономии трафика отключаю картинки И почем нынче траффик в 5 килобайт в США? )))



полная версия страницы