Чему научился:
Реализовал вспомогательную функцию Program().NextMoves() - далее немного ее изменил под распараллеливание (выполнялось в 4-6 раз быстрее).
Результаты супер тестирования: (зря, что файлик нельзя приложить).
Position 1: rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 Depth 1 : 20 - 3 ms Depth 2 : 400 - 55 ms Depth 3 : 8902 - 322 ms Depth 4 : 197281 - 6616 ms Depth 5 : 4865609 - 176349 ms Depth 6 : 119060324 - 3910432 ms All time : 4093777 ms
Position 2: r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1 Depth 1 : 48 - 5 ms Depth 2 : 2039 - 205 ms Depth 3 : 97862 - 3024 ms Depth 4 : 4085603 - 104263 ms Depth 5 : 193690690 - 6729385 ms All time : 6836882 ms
Position 3: 8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 1 8 Depth 1 : 14 - 1 ms Depth 2 : 191 - 20 ms Depth 3 : 2812 - 93 ms Depth 4 : 43238 - 1180 ms Depth 5 : 674624 - 20335 ms Depth 6 : 11030083 - 281078 ms Depth 7 : 178633661 - 4819924 ms All time : 5122631 ms
Position 4: r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq - 0 1 Depth 1 : 6 - 1 ms Depth 2 : 264 - 32 ms Depth 3 : 8049 - 271 ms Depth 4 : 422333 - 12594 ms Depth 5 : 15833292 - 609828 ms All time : 622726 ms
Position 5: rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8 Depth 1 : 44 - 4 ms Depth 2 : 1486 - 187 ms Depth 3 : 62379 - 1749 ms Depth 4 : 2103487 - 67150 ms Depth 5 : 89941194 - 3080864 ms All time : 3149954 ms
Position 6: r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10 Depth 1 : 46 - 5 ms Depth 2 : 2079 - 204 ms Depth 3 : 89890 - 2851 ms Depth 4 : 3894594 - 103707 ms Depth 5 : 164075551 - 6938644 ms All time : 7045411 ms
Немного данных: 1) На все ушло около 8 часов. 2) Всего сгенерировано ~788,83 миллионов ходов. (2 раза была попытка посчитать на 703 млн, но через часов 5-6 потоки отваливались и нагрузка CPU падала с 90-100 % до 20%, потоки отваливались...) 3) Средняя схорость нахождения ~29.356 (комбинаций / сек) 4) Максимальное ~ 39.242 (комбинаций / сек) на позиции 3 5) На скрине: работа программы после распараллеливания и подсчет первым вариантом.
Что было сложным:
Полдня просидел с попытками придумать подсчет по остальным параметрам (шах, взятия и т.д.) - не сходились. По ходам, например "Qe2e3" сложно понять, что это - съели фигуру, шах или обычный ход. Вопросы генерировались быстрее, чем успевал их реализовывать сам :)
По подсчетам других данных (предположения): Нужно знать чуть ли не весь измененный FEN до хода фигуры, который потом парсится и узнается. Хотя это может и не самый идеальный вариант... Как его достать, пока тоже не придумал... Если есть какие-то идеи, можно вместе подумать и реализовать :)
Научился: Проходить супер тест. Трудности: Найти места в коде откуда можно считать правильные параметры шага, взятия, рокировки. Мы вызываем методы много раз за ход при различных проверках, поэтому значения считанные из метода где происходит проверка например на шаг не верны.