Автор |
Сообщение |
Kvadrat64 |
|
Тема сообщения:
Отправлено: Июль 09, 2011 - 04:09 PM
|
|
Зарегистрирован: Янв 11, 2006
Сообщений: 590
Откуда : Russia
|
|
Если не забуду, в понедельник напишу. Вероятно интересует скорость в самом начале партии, т.к. ближе в концу партии скорость возрастает.
На текущем домашнем, под Windows XP SP3, двухядерный P4 3GHz, 4 Gb оперативки, 2Tb hdd скорость чуть более 1000 (1074-1083) с использованием ЭБ6. |
|
|
|
|
|
AndBabushkin |
|
Тема сообщения:
Отправлено: Июль 09, 2011 - 11:11 AM
|
|
Зарегистрирован: Окт 15, 2010
Сообщений: 32
|
|
Kvadrat64, vicnaum можете привести примеры какая скорость перебора движка Kallisto 4 на различных процессорах? |
|
|
|
|
|
vicnaum |
|
Тема сообщения:
Отправлено: Июнь 10, 2011 - 05:35 AM
|
|
Зарегистрирован: Июнь 17, 2005
Сообщений: 675
|
|
kvadrat писал "Я выставляю по 10 мин на партию и 5 сек Фишер."
Правильно.Это оптимально. Я тоже так выставляю время.
Послал Вам письмо недавно насчет обмена партий и помощи в Ваших проектах.
С уважением, мс Василий Наумик, программа Эдэон-профи |
|
|
|
|
|
Kvadrat64 |
|
Тема сообщения:
Отправлено: Июнь 09, 2011 - 12:53 PM
|
|
Зарегистрирован: Янв 11, 2006
Сообщений: 590
Откуда : Russia
|
|
Добавлю, что если все-таки мне надо свернуть GUI под XP или 2000 я пользуюсь кнопкой "Свернуть все окна" на панели задач. Эта кнопка не убивает память. |
|
|
|
|
|
AlexanderS |
|
Тема сообщения:
Отправлено: Июнь 09, 2011 - 02:58 AM
|
|
Зарегистрирован: Авг 29, 2002
Сообщений: 845
Откуда : Якутск
|
|
Kvadrat64 писал(а):
Самый странный глюк это освобождение памяти при сворачивании/разворачивании GUI во время счета. Причем памяти навалом, ограничений нет. Дома, например, двухядерный компьютер с 4 Gb оперативки, XP SP3.
Это не глюк это операционная система выгружает приложение которое не нужно (а по ее мнению, если приложение сворачивается то оно не нужно Такое поведение было в 2000 и ХР, в семерке вроде нет, во всяком случае, по умолчанию |
|
|
|
|
|
AndBabushkin |
|
Тема сообщения:
Отправлено: Июнь 08, 2011 - 07:42 PM
|
|
Зарегистрирован: Окт 15, 2010
Сообщений: 32
|
|
Kvadrat64 писал(а): Самый странный глюк это освобождение памяти при сворачивании/разворачивании GUI во время счета. Причем памяти навалом, ограничений нет. Дома, например, двухядерный компьютер с 4 Gb оперативки, XP SP3. Проверил сейчас на Windows 7 32-bit, такого глюка не обнаружил. Смотрел по диспетчеру задач. |
|
|
|
|
|
Kvadrat64 |
|
Тема сообщения:
Отправлено: Июнь 08, 2011 - 07:29 PM
|
|
Зарегистрирован: Янв 11, 2006
Сообщений: 590
Откуда : Russia
|
|
Это было в ранних версиях GUI. Сейчас вроде все нормально, но я по инерции в случае досрочного прекращения или аварийного останова всегда убираю нечетную партию в "прочие".
Самый странный глюк это освобождение памяти при сворачивании/разворачивании GUI во время счета. Причем памяти навалом, ограничений нет. Дома, например, двухядерный компьютер с 4 Gb оперативки, XP SP3.
А вот на 8-ми ядерном сервере с процессором с 64 разрядной архитектурой 6 гигабайтами памяти и ОС Windows 2008 данный эффект не наблюдается. Там запущено одновременно из разных мест 6 копий GUI и все тип-топ. |
|
|
|
|
|
AndBabushkin |
|
Тема сообщения:
Отправлено: Июнь 08, 2011 - 07:18 PM
|
|
Зарегистрирован: Окт 15, 2010
Сообщений: 32
|
|
Kvadrat64, а что за глюк в KallistoGUI, из-за которого нельзя прерывать матч, когда сыграно нечетное кол-во партий? |
|
|
|
|
|
Kvadrat64 |
|
Тема сообщения:
Отправлено: Июнь 07, 2011 - 08:30 PM
|
|
Зарегистрирован: Янв 11, 2006
Сообщений: 590
Откуда : Russia
|
|
Сильнее, но не намного. Увеличится % ничейных партий. |
|
|
|
|
|
AndBabushkin |
|
Тема сообщения:
Отправлено: Июнь 07, 2011 - 08:08 PM
|
|
Зарегистрирован: Окт 15, 2010
Сообщений: 32
|
|
Kvadrat64 писал(а): Я выставляю по 10 мин на партию и 5 сек Фишер.
А если программам дать по часу времени, намного сильней они будут играть, чем при контроле 10+5? |
|
|
|
|
|
Kvadrat64 |
|
Тема сообщения:
Отправлено: Июнь 07, 2011 - 06:53 PM
|
|
Зарегистрирован: Янв 11, 2006
Сообщений: 590
Откуда : Russia
|
|
Я выставляю по 10 мин на партию и 5 сек Фишер. |
|
|
|
|
|
AndBabushkin |
|
Тема сообщения:
Отправлено: Июнь 07, 2011 - 04:34 PM
|
|
Зарегистрирован: Окт 15, 2010
Сообщений: 32
|
|
Да, кстати, типы срубленных шашек (cap_type[12] в struct Move) возможно в программировании русских шашек и не понадобятся, но очень будут нужны при выборе взятия в итальянском чекерсе.
cap_type[12] нужен для отката ходов. В процессе перебора вариантов надо уметь возвращать ходы назад.
Хотя, может быть эффективнее просто запоминать старую позицию, а потом ее восстанавливать простым копированием. Особенно это выгодно, если позиция занимает всего 3 целых числа, как у booot.
Пример: чтоб найти все ходы шашки b2 я использую: WhiteSimpleMoves[b2] and (not (whitepieses or blackpieses)). В результате получаю битборд, содержащий ходы белой шашки b2 на свободные поля.
Тут не используется иделогия параллельной обработки. Лучше найти сразу все возможные конечные поля для ходов влево, а потом их генерить, доставая по одному биту из битборда. Затем то же для всех ходов вправо.
Первые поля для взятий тоже можно получить сразу все (для одного направления) за несколько логических операций. Потом, каждое взятие придется генерить рекурсивно.
Для этого удобнее использовать битборд из 64 бит.
Если использовать 32 бита, то приходится сначала генерить:
- все ходы влево с четных горизонталей
- все ходы влево с нечетных горизонталей
- все ходы вправо с четных горизонталей
- все ходы вправо с нечетных горизонталей
Это из-за ассиметрии шашечной доски.
А если брать шашки одну за другой и просто генерить ходы, то непонятно зачем вообще тогда использовать битборды.
Правда, выигрыш в скорости, я думаю, здесь все равно будет незначительным. Т.к. он достигается только когда на доске есть заблокированные шашки. Массивы вынуждены все-равно такие шашки просматривать, а битборды их просто не замечают (значит экономится время).
Основной выигрыш битбордов при генерации это возможность быстро проверить есть ли взятия в данной позиции при помощи нескольких логических операций.
Если использовать массивы, то для этого нужно просматреть все шашки и проверить все 4 диагонали на возможность взятия.
Т.к. проверка возможности взятия достаточно критичное место для шашечного алгоритма, то здесь можно получить достаточно неплохой выигрыш в скорости.
Я даже может как-нибудь попробую реализовать это и сравнит с тем что у меня есть.
реализовать правило "дамка должна рубить все стоящие на пути шашки" самая сложная задача в генераторе ходов
Приведу просто код (но с комментариями), т.к. booot все более менее объяснил.
Код:
inline void TryKingCapture(int sq, int dir)
{
int m = sq + dir;
while (!Board[m]) m += dir; // ищем первое препятствие на этом направлении
if (!OP_CHECKER(m)) return; // если это не шашка противника, то нет взятий
int to = m + dir; // перепрыгиваем ее
if (Board[to]) return; // если следующее поле не пусто, то бить нельзя
Move t; // сюда будем записывать текущее взятие
t.from = sq; // откуда бьем
t.promotion = false; // дамка не превращается
AddCaptured(m, &t, 0); // добавляем к списку сбитых шашку, которую только что перепрыгнули
AddKingCaptures(to, &t, 1, dir); // ищем возможные продолжения взятия
}
// поиск возможных продолжений взятия
void AddKingCaptures(int sq, Move *t, int caps, int dir)
{
int found = 0; // пока никаких новых взятий не нашли
int m = sq;
while (!Board[m]) { // просматриваем всю диагональ пока не наткнемся на препятствие
// и пытаемся найти взятия вбок
KingCapture(m, t, caps, -4, dir, found);
KingCapture(m, t, caps, -5, dir, found);
KingCapture(m, t, caps, 4, dir, found);
KingCapture(m, t, caps, 5, dir, found);
m += dir;
}
int to = m + dir;
if (OP_CHECKER(m) && !Board[to] && AddCaptured(m, t, caps)) {
// если препятствие окозалось вражеской шашкой, а за ней пустое поле и эту шашку мы еще не сбивали, значит нашли новое взятие
AddKingCaptures(to, t, caps + 1, dir); // опять ищем возможные продолжения взятия
return;
}
if (!found) { // не нашли продолжение взятие, значит можно генерить очередной ход
do {
CopyMoveFromTemplate(t, caps); // берем ход из шаблона
MP->to = sq; // остается обновить только конечное поле
++MP;
sq += dir;
} while (!Board[sq]);
}
}
// поиск возможных продолжений взятия вбок
inline void KingCapture(int sq, Move *t, int caps, int dir, int bad_dir, int &found)
{
if (dir == bad_dir || dir == -bad_dir) return; // здесь рассматриваются только продолжения взятия вбок
int m = sq + dir;
while (!Board[m]) m += dir;
if (!OP_CHECKER(m)) return;
int to = m + dir;
if (Board[to]) return;
if (!AddCaptured(m, t, caps)) return; // если мы эту шашку уже сбивали
found = 1; // нашли новое взятие
AddKingCaptures(to, t, caps + 1, dir); // ищем продолжения взятия
}
// добавить сбитую шашку к списку
inline bool AddCaptured(int sq, Move *m, int caps)
{
// проверяем не сбивали ли мы эту шашку раньше
for (int i = 0; i < caps - 3; ++i) {
if (sq == m->cap_sq[i]) return false;
}
// еще не сбивали, значит можно сбивать
m->cap_sq[caps] = sq;
m->cap_type[caps] = Board[sq];
return true;
}
Названия функций несколько неудачные. Надо будет переделать.
Когда это все писал в голове еще не было ясной и полной картины того, что должно получиться в итоге. |
|
|
|
|
|
Jury |
|
Тема сообщения:
Отправлено: Июль 30, 2009 - 03:39 AM
|
|
Зарегистрирован: Сен 27, 2002
Сообщений: 288
Откуда : Омск
|
|
Извиняюсь, что возможно малость не в тему. Игорь, проверьте сайт, у вас там вирус. В Гугле предупреждение выводится. При открытии сайта вручную заодно открывается еще один вредоносный сайтик. |
|
|
|
|
|
Kvadrat |
|
Тема сообщения:
Отправлено: Июль 21, 2009 - 05:14 PM
|
|
Зарегистрирован: Дек 16, 2006
Сообщений: 405
|
|
EB6-Fly48 (54.1), 21.2.2007
b2>a5 a7>f4 1.g3:e5 d6:f4 2.e3:g5 f6:h4 3.d2-e3 h6-g5 4.h2-g3 e7-d6 5.g3-f4 g7-h6 6.c3-d4 d6-e5 7.d4:f6 g5:e7 8.e3-d4 b6-c5 9.d4:b6 b8-a7 10.a1-b2 a7:c5 11.b2-c3 e7-f6 12.f2-e3 h8-g7 13.c3-d4 c7-b6 14.a5:c7 d8:b6 15.c1-d2 f8-e7 16.d2-c3 b6-a5 17.d4:b6 a5:c7 18.g1-f2 f6-g5 19.c3-d4 e7-d6 20.d4-c5 d6:b4 21.a3:c5 g7-f6 22.e1-d2 c7-d6 23.c5:e7 f6:d8 24.f4-e5 d8-e7 25.e3-d4 e7-f6 26.e5:g7 h6:f8 27.d4-e5 f8-g7 28.e5-d6 g5-f4 29.d6-c7 f4-g3 30.f2-e3 g3-h2 31.c7-b8 g7-h6 32.d2-c3 h2-g1 33.c3-d4 h6-g5 34.b8-h2 h4-g3 35.h2:h6 g1-h2 36.h6-g7 h2-d6 37.g7-h8 d6-b4 38.e3-f4 b4-d2 39.f4-e5 d2-b4 40.e5-f6 b4-f8 41.d4-e5 f8-b4 42.h8-g7 b4-a5 43.f6-e7 a5-c7 44.e5-f6 c7-d8 45.g7-h8 d8-a5 46.e7-d8 a5-b4 47.d8-c7 b4-f8 48.c7-f4 f8-c5 49.f6-g7 c5-f8 50.f4-h6 f8-d6 51.g7-f8 d6-g3 52.h6-e3 g3-h2 53.f8-b4 h2-c7 54.h8-c3 c7-b8 55.c3-d4 b8-c7 56.e3-g1 c7-f4 57.b4-e7 f4-c1 58.g1-h2 c1-h6 59.h2-c7 h6-c1 60.e7-h4 c1-d2 61.c7-d6 d2-h6 62.h4-f6 h6-c1 63.f6-d8 c1-h6 64.d4-f6 h6-f8 65.d8-e7 f8-h6 66.f6-g7 1/2-1/2
Полагаю, что таких партий достаточно много. Видимо, какая-то ошибка в алгоритме реализации выигрыша. |
_________________ Пользуюсь всеми доступными программами
|
|
|
|
|
Kvadrat |
|
Тема сообщения:
Отправлено: Июль 11, 2009 - 12:33 PM
|
|
Зарегистрирован: Дек 16, 2006
Сообщений: 405
|
|
[White "Kallisto 3"]
[Black "Kallisto 3"]
[Event "6302-asce-cb4"]
[Site "EB5600+3"]
[Round "153.2"]
[Date "2007.5.16"]
[Result "1/2-1/2"]
[GameType "25"]
[Setup "1"]
[FEN "W:W29,30,31,32,25,27,28,21,22,24,17,18:B20,16,9,10,5,6,7,8,1,2,3,4."]
1. b4-a5 g7-h6 2. c3-b4 d6-c5 3. b4xd6 e7xe3 4. f2xd4 h4xf2 5. e1xg3 b6-c5
6. d4xb6 a7xc5 7. b2-c3 h8-g7 8. g3-h4 g5-f4 9. h4-g5 f4-e3 10. c3-d4 h6xf4
11. d4xf2 g7-h6 12. a1-b2 f8-e7 13. c1-d2 c7-d6 14. b2-c3 d6-e5 15. c3-b4
e7-d6 16. d2-c3 d8-e7 17. c3-d4 e5xc3 18. b4xd2 h6-g5 19. f2-e3 b8-c7 20.
g1-f2 d6-e5 21. d2-c3 f4xb4 22. a5xc3 c5-d4 23. c3-b4 g5-h4 24. h2-g3 e7-d6
25. f2-e3 h4xf2 26. e3xg1 d4-e3 27. g1-h2 e3-d2 28. h2-g3 e5-f4 29. g3xe5
d6xf4 30. b4-c5 f4-g3 31. c5-d6 c7xe5 32. a3-b4 e5-d4 33. b4-a5 d2-e1 34.
a5-b6 d4-e3 35. b6-c7 g3-h2 36. c7-d8 e1-c3 37. d8-g5 e3-f2 38. g5-h4 f2-e1
39. h4-d8 h2-g1 40. d8-g5 g1-h2 41. g5-e3 h2-d6 42. e3-b6 e1-d2 43. b6-g1
d6-e5 44. g1-a7 c3-a5 45. a7-g1 d2-f4 46. g1-c5 a5-c3 47. c5-b6 c3-a5 48.
b6-c5 a5-e1 49. c5-a3 e5-a1 50. a3-c5 a1-g7 51. c5-f8 g7-e5 52. f8-a3 e5-h8
53. a3-f8 e1-f2 54. f8-b4 f2-e3 1/2-1/2 ????
По правилам, конечно, ничья, но ...
Нужен какой-либо механизм, для выявления таких партий. |
_________________ Пользуюсь всеми доступными программами
|
|
|
|
|
|
|