Google
 

Сайт Андрея Иванова

Андрей Иванов - все секреты шашек и шашистов

Login





 


 Забыли пароль?
 или новый пользователь? Зарегистрируйся!

Кто с нами

Пользователей:  На сайте
Пользователей:  Пользователей: 0
Гостей:  Гостей: 3
Всего:  Всего: 3
Пользователей:  Зарегистрированные
No members connected


Новая тема   Ответить
Предыдущая тема Версия для печати Войти и проверить личные сообщения Следующая тема
Автор Сообщение
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.

Это не глюк это операционная система выгружает приложение которое не нужно (а по ее мнению, если приложение сворачивается то оно не нужно Smile Такое поведение было в 2000 и ХР, в семерке вроде нет, во всяком случае, по умолчанию
 
 Профиль пользователя отправить личное сообщение WWW ICQ 
Ответить с цитатой Наверх
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 и все тип-топ. Laughing
 
 Профиль пользователя отправить личное сообщение  
Ответить с цитатой Наверх
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
Откуда : Омск
Извиняюсь, что возможно малость не в тему. Игорь, проверьте сайт, у вас там вирус. В Гугле предупреждение выводится. При открытии сайта вручную заодно открывается еще один вредоносный сайтик.
 
 Профиль пользователя отправить личное сообщение WWW  
Ответить с цитатой Наверх
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 ????
По правилам, конечно, ничья, но ...
Нужен какой-либо механизм, для выявления таких партий.

_________________
Пользуюсь всеми доступными программами
 
 Профиль пользователя отправить личное сообщение  
Ответить с цитатой Наверх
Показать:     
Перейти к:  
Время в формате GMT + 3
Новая тема   Ответить
Предыдущая тема Версия для печати Войти и проверить личные сообщения Следующая тема
PNphpBB2 © 2003-2007 
 
Page created in 0.87550020217896 seconds.