Главная › Форумы › Шашечные программы › Шашечные программы › Стандартная проверка корректности генератора ходов
- В этой теме 126 ответов, 8 участников, последнее обновление 17 лет, 1 месяц назад сделано Kallisto.
-
АвторСообщения
-
24.08.2006 в 11:01 #364635KallistoУчастник
Добавлено — виноват, это обнуляется поле с которого ход…
А зачем его обнулять? Для генерации взятий шашки достаточно один раз его обнулить, а потом просто не ставить её на доску. (п после завершения генераций обратно поставить) Тоже быстрее будет.Так ведь это обнуление именно это и делает (только один раз).
24.08.2006 в 11:03 #364636NSУчастникДа это я торможу по-полной. Это же не рекурсивная процедура — получается так же как у меня — шашка один раз снимается с доски, потом ставится…
Работать надо на работе, а не в чужие исходники пялитьсяТолько со списком конечно глупость — я так и не нашел старых исходников, поэтому не помню как делал тогда, но сейчас сразу как сел — сразу мысль пришла что нужно просто перевернуть шашку.
24.08.2006 в 11:39 #364637KallistoУчастникПо скорости будет то же самое, т.к. ходов сбивающих более 2 шашек очень мало и несколько лишних проверок для них практически никак не скажутся.
24.08.2006 в 12:00 #364638NSУчастникСверим быстродействие… Хотя я особо сильно «вылизывать» генератор не собираюсь.
Насчет Эндшпильных библиотек — я посчитал, пятифигурки вполне влезают в память… Даже без особых ухищрений. Так что с эндшпильной библиотекой проблем скорей всего не будет, постараюсь сформировать сам. (или 5-ти фигурной мало?)
Вопрос только в дебютной.24.08.2006 в 12:59 #364639KallistoУчастникВ тех таблицах, что я приводил Каллисто при подсчете количества позиций не выполнял ходов (make/unmake) на посленем уровне, т.к. это не нужно для подсчета.
Но для проверки скорости ядра все же лучше вместе с ними:Каллисто:
1 - 7 time: 0 speed: Infinity
2 - 49 time: 0 speed: Infinity
3 - 302 time: 0 speed: Infinity
4 - 1469 time: 0 speed: Infinity
5 - 7482 time: 0 speed: Infinity
6 - 37986 time: 0 speed: Infinity
7 - 190146 time: 15 speed: 12676 Kn / sec
8 - 929905 time: 110 speed: 8454 Kn / sec
9 - 4570667 time: 484 speed: 9444 Kn / sec
10 - 22450628 time: 2438 speed: 9209 Kn / sec
11 - 110961169 time: 12062 speed: 9199 Kn / sec
12 - 545059387 time: 59047 speed: 9231 Kn / sec
СиДра:
1 - 7 - time: 0 speed: Infinity
2 - 49 - time: 0 speed: Infinity
3 - 302 - time: 0 speed: Infinity
4 - 1469 - time: 0 speed: Infinity
5 - 7482 - time: 0 speed: Infinity
6 - 37986 - time: 0 speed: Infinity
7 - 190146 - time: 32 speed: 5942 Kn / sec
8 - 929905 - time: 187 speed: 4973 Kn / sec
9 - 4570667 - time: 875 speed: 5224 Kn / sec
10 - 22450628 - time: 4391 speed: 5113 Kn / sec
11 - 110961169 - time: 21468 speed: 5169 Kn / sec
12 - 545059387 - time: 105219 speed: 5180 Kn / sec
24.08.2006 в 13:02 #364640NSУчастникОК. Вечером запущу тест с make/unmake на последнем ходе.
Либо просто вышлю exe-шник. Надеюсь что генератор будет не особо медленней24.08.2006 в 13:02 #364641KallistoУчастникЧтобы прога нормально играла достаточно 4-х фигурной ЭБ.
Дебютную библиотеку обсуждали на гостевой Креста.25.08.2006 в 07:01 #364642NSУчастникНе получилось плотно посидеть.
Но мой 0x88 из-за большого количества условий (плюс из за этого что вместо одного массива структур сделал структуру массивов)
в начальной позиции делает 1000000 генераций (7000000) Ходов, Без Make/Unmake за 1980 мс. меньше 3500000 позиций в секунду.
Однозначно нужно переписывать. Perft запускать не стал (Генератор за одну сторону, только за белых)Маленький Тест показал, что 16×16 будет быстрее (чем 0х88).
Плюс — вызов рекурсивной процедуры лучше делать когда уже взятие точно есть — (то есть саму возможность взятия определять в нерекурсивной (основной) процедуре, а продолжать взятие — в рекурсивной) И нужно поменять структуру хранениия списка ходов.25.08.2006 в 08:31 #364643KallistoУчастникКогда сделаешь?
25.08.2006 в 08:46 #364644NSУчастникСейчас начинаю делать. То есть — где-то через два часа будет готов.
(пока неоптимизированный)25.08.2006 в 11:10 #364645NSУчастникprocedure perft(depth:byte);
var i:byte;mov:moves;
Begin
for i:=1 to genmove(mov) do
Begin
MakeMove(mov,i);
if depth=1 then kol:=kol+1 else perft(depth-1);
UnMakeMove(Mov,i);
end;
end;8 929905 489 1901
Надо переписывать.
25.08.2006 в 11:57 #364646KallistoУчастникЗачем сразу переписывать? Делай лучше прогу. Там есть вещи поважнее, чем генератор. Ты же шахматный генератор не переписывал по несколько раз. Какой у тебя там результат?
25.08.2006 в 11:58 #364647KallistoУчастникМожет тебе битборды попробовать? Говорят в шашках они рулят. Ведь на шашечной доске только 32 поля.
25.08.2006 в 12:17 #364648NSУчастникВ шахматах — один раз написал и больше не трогал. Только сортировки добавлял. Perft не пробовал (в шахматах)
Насчет БитБоардов в шашках думал — Надо 64-мя битами представлять, иначе очень неудобно.25.08.2006 в 12:44 #364649NSУчастникОК. Попробую сделать 32-битный бибоард.
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.