Ключевое слово
19 | 07 | 2024
Новости Библиотеки
Шахматы Онлайн
Welcome, Guest
Username: Password: Remember me

TOPIC: Bitboard в программировании шахмат №2

Bitboard в программировании шахмат №2 11 Июнь 2023 06:15 #211

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 195
  • Thank you received: 10
  • Karma: 1
alexlaw wrote:
код (C) 2007 Pradyumna Kannan
У меня в переносе этого метода где-то вкралась трудноуловимая ошибка, поэтому вернусь к стандартной магии.

1106.jpg


Для такой позиции теряется связка при использовании - (C) 2007 Pradyumna Kannan

В общем то это не суть.
Возник интересный вопрос :? , кто может предложить математический алгоритм для решения композиции, только мат в n ходов?

Bitboard в программировании шахмат №2 11 Июнь 2023 06:23 #212

  • Vladimirovich
  • Vladimirovich's Avatar
  • OFFLINE
  • Инквизитор
  • Posts: 107787
  • Thank you received: 2128
  • Karma: 106
alexlaw wrote:
кто может предложить математический алгоритм для решения композиции, только мат в n ходов?
Не очень понятен вопрос.
Конкретной позиции?
Каждому - своё.

Bitboard в программировании шахмат №2 11 Июнь 2023 06:34 #213

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 195
  • Thank you received: 10
  • Karma: 1
Vladimirovich wrote:
Не очень понятен вопрос.
Конкретной позиции?
Нет.
Любой двухходовки, трехходовки и т.д.
Кроме этюдов

Bitboard в программировании шахмат №2 11 Июнь 2023 06:37 #214

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 195
  • Thank you received: 10
  • Karma: 1
У меня есть немного таких задач в fen формате
Warning: Spoiler! [ Click to expand ]

Bitboard в программировании шахмат №2 11 Июнь 2023 06:47 #215

  • Vladimirovich
  • Vladimirovich's Avatar
  • OFFLINE
  • Инквизитор
  • Posts: 107787
  • Thank you received: 2128
  • Karma: 106
alexlaw wrote:
Любой двухходовки, трехходовки и т.д.
Кроме этюдов
Для задач только полный перебор графа вариантов.
Там нет обычно никакого позиционного понимания, в задачах, и нечего вырезать из расчета.

В этюдах может быть, но и там лучше считать все.
Известная история, как Ботвинник, возомнивший себя великим алгоритмистом, заставил свой драндулет Пионер решать этюд Надареишвили
В результате он фактически захардкодил свое решение этюда в программу, а оно оказалось неверным, как выяснилось потом :)
Каждому - своё.

Bitboard в программировании шахмат №2 14 Июнь 2023 18:46 #216

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 195
  • Thank you received: 10
  • Karma: 1

Bitboard в программировании шахмат №2 17 Июнь 2023 08:43 #217

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 195
  • Thank you received: 10
  • Karma: 1
Таблица транспозиции и хеширование Zobris

Проблемы
Первая проблема заключается в том, что, хотя одни и те же шахматные позиции часто повторяются во время альфа-бета-поиска, мы можем рассчитывать только на то, что это произойдет где-то в пределах 15% -20%.
Поэтому на каждые 100 записей, которые мы сохраняем в нашей таблице транспозиции, мы можем использовать только 20 записей.
Следовательно, какую бы схему таблицы транспозиции мы ни выбрали, она должна быть очень эффективной, потому что мы будем хранить и искать больше бесполезных записей, чем полезных.
В идеальном мире у нас была бы возможность просто сохранять каждый узел, который мы ищем, в нашей таблице транспозиции. К сожалению, это просто непрактично. Требования к памяти для этой схемы были бы выше, чем могут вместить большинство компьютеров. Кроме того, время, потраченное на поиск в такой большой таблице, перевесило бы любые преимущества экономии времени. Поэтому мы должны признать, что наша таблица транспозиции ограниченного размера не будет хранить все узлы, которые мы ищем.
Warning: Spoiler! [ Click to expand ]



tt_info.jpg


Сначала нам нужно выяснить, как однозначно идентифицировать каждую позицию, с которой мы сталкиваемся. Это должно быть чрезвычайно эффективным, поскольку нам придется делать это для каждого узла в нашем поиске. Простое преобразование шахматной доски в строку значений типа FEN выполняется слишком медленно.
К счастью для нас, процесс индексации игровых позиций, называемый хешированием Zobrist, уже изобретен профессором Висконсинского университета по имени Альберт Зобрист.
Хэш Zobrist, однозначно представляющий нашу шахматную доску, будет 64-разрядной переменной.
Warning: Spoiler! [ Click to expand ]


Коллизии

Прямо сейчас вы, возможно, заметили, что 64-битное значение недостаточно велико для представления всех возможных шахматных позиций. Таким образом, используя приведенную выше схему, можно получить 2 разные шахматные позиции, оцениваемые с одним и тем же 64-битным хэш-значением. Это называется коллизией, и независимо от того, как вы это реализуете, у вас всегда будет небольшая вероятность коллизии. Ключевым моментом здесь является минимизация вероятности столкновения до достаточно малого значения, чтобы выигрыш в скорости, который вы получаете от наличия таблицы транспозиции (и, возможно, постоянного углубленного поиска), перевешивал отрицательный эффект от возможности столкновения.

Немного о хэш функциях
Last Edit: 17 Июнь 2023 08:58 by alexlaw.

Bitboard в программировании шахмат №2 18 Июнь 2023 04:51 #218

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 195
  • Thank you received: 10
  • Karma: 1
По ходу дела переписал парсинг Fen :)
Warning: Spoiler! [ Click to expand ]


Заодно и создание Fen

Warning: Spoiler! [ Click to expand ]

Bitboard в программировании шахмат №2 09 Июль 2023 20:26 #219

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 195
  • Thank you received: 10
  • Karma: 1
alexlaw wrote:
Видно что у меня поддерживат POPCNT.

Решил все же разобраться с этим вопросом с помощью Coreinfo.
Утилита Coreinfo [1] от Марка Руссиновича предоставляет в этом плане гораздо больше возможностей.
Coreinfo также полезна для получения подробной информации о процессоре.
Warning: Spoiler! [ Click to expand ]


Теперь точно ясно, что popcnt поддерживает мой процессор.

Взял за горло искуственный интеллект и не отпустил его до тех пор, пока не получил правильный ответ :beer:

Warning: Spoiler! [ Click to expand ]

function UsePopcnt(value: Cardinal): Cardinal;
asm
  MOV EAX, value
  DB $F3, $0F, $B8, $C0 // popcnt eax, eax
  MOV Result, EAX
end;

Warning: Spoiler! [ Click to expand ]

function UsePopcnt64(value: UInt64): Cardinal;
asm
    PUSH EBX
    PUSH EDI
    PUSH ESI
    MOV ESI, DWORD PTR [value]         // Загружаем младшую часть значения в регистр ESI
    MOV EDI, DWORD PTR [value + 4]     // Загружаем старшую часть значения в регистр EDI
    XOR EBX, EBX                       // Обнуляем регистр EBX для подсчета суммы
    // Первая 32-битная часть
    MOV EAX, ESI
    DB $F3, $0F, $B8, $C0 // popcnt eax, eax
    ADD EBX, EAX                       // Добавляем результат к общей сумме
    // Вторая 32-битная часть
    MOV EAX, EDI
    DB $F3, $0F, $B8, $C0 // popcnt eax, eax
    ADD EBX, EAX                       // Добавляем результат к общей сумме
    MOV Result, EBX
    POP ESI
    POP EDI
    POP EBX
end;


Warning: Spoiler! [ Click to expand ]


Warning: Spoiler! [ Click to expand ]

function IsPopcntSupported: Boolean;
var
  IsPopcntSupportedResult: Integer; // Объявляем переменную для результата проверки   
asm
    PUSH EBX
    PUSH EDI

    MOV EAX, 1
    XOR EDX, EDX
    CPUID

    MOV EBX, 1
    SHL EBX, 23
    AND EBX, ECX

    POP EDI
    POP EBX

    TEST EBX, EBX
    SETNZ AL

    MOV IsPopcntSupportedResult, EAX
end;

Bitboard в программировании шахмат №2 10 Июль 2023 08:04 #220

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 195
  • Thank you received: 10
  • Karma: 1
Попытылся сравнить два метода подсчета бит.
Комбинированный метод
function count_bits(bb:UInt64):integer;
var
n:UInt64;
a1,a2,a3,a4:UInt64;
begin
 a1:=$5555555555555555;
 a2:=$3333333333333333;
 a3:=$0F0F0F0F0F0F0F0F;
 a4:=$0101010101010101;
 n:=bb-(bb shr 1) and a1;
 n:=((n shr 2) and a2) + (n and a2);
 n:=((((n shr 4) + n) and a3) * a4) shr 56;
 result:=n;
end;
и popcnt
function UsePopcnt64(value: UInt64): Cardinal;
asm
    PUSH EBX
    PUSH EDI
    PUSH ESI
    MOV ESI, DWORD PTR [value]         // Загружаем младшую часть значения в регистр ESI
    MOV EDI, DWORD PTR [value + 4]     // Загружаем старшую часть значения в регистр EDI
    XOR EBX, EBX                       // Обнуляем регистр EBX для подсчета суммы
    // Первая 32-битная часть
    MOV EAX, ESI
    DB $F3, $0F, $B8, $C0 // popcnt eax, eax
    ADD EBX, EAX                       // Добавляем результат к общей сумме
    // Вторая 32-битная часть
    MOV EAX, EDI
    DB $F3, $0F, $B8, $C0 // popcnt eax, eax
    ADD EBX, EAX                       // Добавляем результат к общей сумме
    MOV Result, EBX
    POP ESI
    POP EDI
    POP EBX
end;
Результат
Начальная позиция, perft=6

Prof_popcnt.jpg


Для себя сделал вывод - оставить Комбинированный метод :dontknow:

Bitboard в программировании шахмат №2 16 Июль 2023 08:00 #221

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 195
  • Thank you received: 10
  • Karma: 1
alexlaw wrote:
кто может предложить математический алгоритм для решения композиции, только мат в n ходов?

Решил этот вопрос :)

Логическое описание:

Если на любой ход атакующей стороны найдется хотя бы один ход защищающейся стороны, который не ведет к мату, при максимальной глубине, то другие ходы атакующей стороны на данной глубине - можно обрезать.
Если на любой ход защищающейся стороны найдется хотя бы один ход атакующей стороны, который ведет к мату, при максимальной глубине, то другие ходы защищающейс стороны на данной глубине - можно обрезать.

Запутанно :popcorn: , но както так

Warning: Spoiler! [ Click to expand ]


Проверил с помощью MateMaster

Warning: Spoiler! [ Click to expand ]


Warning: Spoiler! [ Click to expand ]


Warning: Spoiler! [ Click to expand ]


:)

Bitboard в программировании шахмат №2 16 Июль 2023 19:12 #222

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 195
  • Thank you received: 10
  • Karma: 1
Чуть подправил код поиска мата
function SearchMate(depth:integer):integer;
var
 i:integer;
 source_squareInt,target_squareInt,pieceInt,promotedInt:integer;
 bitboards_12_temp:array[Tencode_pieces] of UInt64;
 occupancies_3_temp:array[TSide] of UInt64;
 side_temp:TSide;
 enpassant_temp:TBoard_squares;
 castle_temp:integer;
    type_pieces_temp:array[TBoard_squares] of Ttype_pieces;
    tp_pc_temp:array[TBoard_squares] of Tencode_pieces;
    color_pieces_temp:Tcolor_pieces;
    pos_kings_temp:array[0..1] of TBoard_squares;
begin
    Application.ProcessMessages;
    result:=-1;
     generate_moves_list(add_move);
     if (add_move^.count=0) and (count_piece_check<>0) then  begin
          Inc(Checkmates_);
          result:=1;
     end else  result:=0;
     if (ply_=0) then Checkmates_ :=0;
     //мат определяется при ходе второго игрока
     if (depth=0) then exit;
     for i := 0 to add_move^.count-1 do  begin
       // preserve board state
       //===================================================//
       Move(type_pieces[a8],type_pieces_temp[a8],SizeOf(type_pieces));
       Move(tp_pc[a8],tp_pc_temp[a8],SizeOf(tp_pc));
       Move(color_pieces[a8],color_pieces_temp[a8],SizeOf(color_pieces));
       Move(bitboards_12[P_],bitboards_12_temp[P_],12*SizeOf(UInt64));
       Move(occupancies_3[white],occupancies_3_temp[white],3*SizeOf(UInt64));
       Move(pos_kings[0],pos_kings_temp[0],SizeOf(pos_kings));
       side_temp:=side;
       enpassant_temp:=enpassant;
       castle_temp:=castle;
       //===================================================//
if (ply_=0) then begin
   ClearDesk ();
   DrawPieceBoard();
   source_squareInt:=get_source(add_move^.move[i],get_move_source);
   target_squareInt:=get_source(add_move^.move[i],get_move_target);
   DrawLine(source_squareInt,target_squareInt,0);
end;
       make_move(add_move^.move[i],all_moves);
       Inc(ply_);
       Inc(add_move);
       result:=1 and SearchMate(depth - 1);
       Dec(add_move);
       Dec(ply_);
       (*
       если ход первого (ply_ and 1)=0 и найден мат result=1  или
       если ход второго (ply_ and 1)=1 и  мата нет result=0
       *)
       if ((ply_ and 1)=0) and (result=1)  then begin
       best_move:=add_move^.move[i];
       exit;
       end;
       if ((ply_ and 1)=1) and (result=0)  then exit;
       // restore board state
       //===================================================//
       castle:=castle_temp;
       enpassant:=enpassant_temp;
       side:=side_temp;
       Move(pos_kings_temp[0],pos_kings[0],SizeOf(pos_kings));
       Move(occupancies_3_temp[white],occupancies_3[white],3*SizeOf(UInt64));
       Move(bitboards_12_temp[P_],bitboards_12[P_],12*SizeOf(UInt64));
       Move(color_pieces_temp[a8],color_pieces[a8],SizeOf(color_pieces));
       Move(tp_pc_temp[a8],tp_pc[a8],SizeOf(tp_pc));
       Move(type_pieces_temp[a8],type_pieces[a8],SizeOf(type_pieces));
       //===================================================//
     end;//for
     if (ply_=0) then make_move(best_move,all_moves); 
end;

Протестировал на разных задач.
Решение находит правильно.

Мат в 5 ходов нашел быстрее MatMaster :P

Warning: Spoiler! [ Click to expand ]
Last Edit: 16 Июль 2023 19:53 by alexlaw.

Bitboard в программировании шахмат №2 18 Июль 2023 07:43 #223

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 195
  • Thank you received: 10
  • Karma: 1
Чуть потестил, алгоритм показал себя рабочим.

Скомпилированная прога с задачами

Нужно запустить с параметром "show", нажать в правом углу >> и выбрать задачу, затем нажать меню-мат в n ходов.
После того, как прога сделает ход, можно сделать ответный ход.
В общем то мне было важно проверить идею нахождения мата в n ходов.

PS
Перекомпилировал (если нет решения задачи, то выводится соответствующее сообщение)
Но, в общем то я считаю, что эту задачу решил :)
Last Edit: 18 Июль 2023 11:09 by alexlaw.

Bitboard в программировании шахмат №2 18 Июль 2023 11:23 #224

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 195
  • Thank you received: 10
  • Karma: 1
Думал ошибка :blush:
Ан нет, все правильно :)
no_solution.jpg

Bitboard в программировании шахмат №2 19 Июль 2023 09:19 #225

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 195
  • Thank you received: 10
  • Karma: 1
С 1966 года Международный день шахмат принято отмечать 20 июля. Число выбрано не случайно: именно в эту дату в 1924 году в Париже, в период проведения Восьмых олимпийских летних игр, была основана Международная шахматная федерация.
Первый официальный чемпион мира по шахматам Вильгельм Стейниц в молодости жил в Англии, зарабатывая себе на жизнь игрой на ставку со случайными партнёрами в ресторане Simpson's Divan. Один из таких партнеров платил фунт стерлингов за каждую проигранную партию к большой радости Стейница, который неизменно побеждал. Но как-то ему сказали, что он может потерять выгодного партнера, если все время будет брать над ним верх. Этот совет показался Стейницу разумным, и в одной из партий он, умышленно подставив ферзя, признал себя побежденным. Партнер закричал: "Я выиграл у чемпиона мира! Моя мечта сбылась!" - и выбежал на улицу. Больше Стейниц его никогда не видел.
С наступающим! :)

Bitboard в программировании шахмат №2 19 Июль 2023 09:21 #226

  • Vladimirovich
  • Vladimirovich's Avatar
  • OFFLINE
  • Инквизитор
  • Posts: 107787
  • Thank you received: 2128
  • Karma: 106
:beer:
Каждому - своё.

Bitboard в программировании шахмат №2 22 Июль 2023 09:51 #227

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 195
  • Thank you received: 10
  • Karma: 1
Финальная проверка алгоритма:

Warning: Spoiler! [ Click to expand ]


Z.LIBIS Original 1991 Мат в 4 хода







6Bk/5Q2/8/6P1/3p4/K6n/1p6/1b6 w - - 0 1
Решение задачи:
Warning: Spoiler! [ Click to expand ]

Warning: Spoiler! [ Click to expand ]

Z.LIBIS Original 1991 Мат в 5 ходов







3b4/2r3pr/2np1N2/1B3P2/1p5p/8/5K1p/7k w - - 0
Решение задачи:
Warning: Spoiler! [ Click to expand ]

Warning: Spoiler! [ Click to expand ]

C.OPALEK Original 1991 Мат в 5 ходов







8/6p1/4p1K1/5PNB/4p1Pk/4P3/3P3B/8 w - - 0 1
Решение задачи:
Warning: Spoiler! [ Click to expand ]

Warning: Spoiler! [ Click to expand ]

S.SOVIK 4° WCCT 1990 Мат в 5 ходов







K1N1Q3/B1p1Npb1/5ppn/pP6/q2rkPpP/P1r1p1P1/B1p1P3/1n5b w - - 0 1
Решение задачи:
Warning: Spoiler! [ Click to expand ]

Warning: Spoiler! [ Click to expand ]

L.POLACEK Original 1993 Мат в 6 ходов







8/3R4/3pk3/1N1p4/p5N1/2p2K2/2p5/8 w - - 0 1
Решение задачи:
Warning: Spoiler! [ Click to expand ]

Warning: Spoiler! [ Click to expand ]

S.VOKAL Original 1993 Мат в 5 ходов







k1K5/rp2p3/p3pp2/7Q/8/5p2/8/4b3 w - - 0 1
Решение задачи:
Warning: Spoiler! [ Click to expand ]

Warning: Spoiler! [ Click to expand ]
Last Edit: 22 Июль 2023 10:04 by alexlaw.

Bitboard в программировании шахмат №2 22 Июль 2023 10:51 #228

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 195
  • Thank you received: 10
  • Karma: 1
Кстати, интересно было бы создать на сайте раздел композиции, где посетители бы решали шахматные задачи, а оппонентом выступал бот, использующий указанный алгоритм. :)
PS
точнее алгоритм модифицировать для защиты.
это не сложно
Last Edit: 22 Июль 2023 10:52 by alexlaw.

Bitboard в программировании шахмат №2 23 Июль 2023 09:15 #229

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 195
  • Thank you received: 10
  • Karma: 1
Интересная теория :)
Теория окончания «Два коня против пешки» была разработана известным исследователем шахмат А. Троицким еще в начале XX века. Эта теория получила название «Линия Троицкого». По ней, если пешка слабейшей стороны блокируется не позднее, чем показано на первой диаграмме, то возможность мата гарантируется (иногда пешка может находиться за линией Троицкого и тогда все зависит от положения короля). Но в определенных вариантах, чтобы соорудить мат требуется более 100 ходов. Это нарушает правила шахмат. Поэтому немецкий гроссмейстер К. Мюллер создал теорию, по которой число ходов для мата не превышает 50-ти – «Вторая линия Троицкого» (на нижней диаграмме).







8/8/1p4p1/2p2p2/p2pp2p/8/8/8 b - - 0 1







8/8/1p4p1/p1pppp1p/8/8/8/8 b - - 0 1

White is winning DTZ 138 DTM 143








3k3N/8/8/8/1N1p4/8/8/K7 w - - 0 1

'DTM' - Глубина для мата. Для каждой представленной позиции 'DTM' указывает теоретическое значение и количество ходов победителя для "мата" в случае выигрыша / проигрыша - при условии, что победитель минимизирует, а проигравший максимизирует DTM.
'DTZ' - Глубина до обнуления
DTZ (количества слоев) Количество слоев обнуляется тогда и только тогда, когда пешка выдвинута или сделан захват. Для каждой представленной позиции "DTZ" указывает теоретическое значение и количество ходов победителя до достижения цели "Выиграть и обнулить количество ходов" в случае выигрыша / проигрыша - при условии, что победитель минимизирует, а проигравший максимизирует DTZ.
Last Edit: 23 Июль 2023 09:16 by alexlaw.

Bitboard в программировании шахмат №2 23 Июль 2023 11:10 #230

  • Vladimirovich
  • Vladimirovich's Avatar
  • OFFLINE
  • Инквизитор
  • Posts: 107787
  • Thank you received: 2128
  • Karma: 106
Такие вещи лучше таблицами считаются
Каждому - своё.

Bitboard в программировании шахмат №2 24 Июль 2023 10:08 #231

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 195
  • Thank you received: 10
  • Karma: 1
Vladimirovich wrote:
Такие вещи лучше таблицами считаются

Заинтересовался.
Но как можно использовать именно в своей проге?
Пока с наскока не нашел.
Пока что решил скачать 3-4-5 pieces: 1 Gygabyte of storage.

Bitboard в программировании шахмат №2 24 Июль 2023 10:24 #232

  • Vladimirovich
  • Vladimirovich's Avatar
  • OFFLINE
  • Инквизитор
  • Posts: 107787
  • Thank you received: 2128
  • Karma: 106
alexlaw wrote:
Но как можно использовать именно в своей проге?
Не знаю, не углублялся.
Где-то отсюда надо копать
www.chessprogramming.org/Syzygy_Bases
где про API написано
tb_init initializes the tablebase
tb_probe_wdl probes the Win-Draw-Loss (WDL) table for a given position
tb_probe_root probes the Distance-To-Zero (DTZ) table for the given position.
Каждому - своё.

Bitboard в программировании шахмат №2 24 Июль 2023 11:55 #233

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 195
  • Thank you received: 10
  • Karma: 1
Vladimirovich wrote:
tb_init initializes the tablebase
tb_probe_wdl probes the Win-Draw-Loss (WDL) table for a given position
tb_probe_root probes the Distance-To-Zero (DTZ) table for the given position.

Вот описание и исходники на СИ - Syzygy TB probe tool

Bitboard в программировании шахмат №2 24 Июль 2023 13:32 #234

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 195
  • Thank you received: 10
  • Karma: 1
В принципе получилось :) выдернуть инфу из базы.
Чисто ради спортивного интереса
Fathom.jpg

Bitboard в программировании шахмат №2 24 Июль 2023 18:51 #235

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 195
  • Thank you received: 10
  • Karma: 1
На делфи это выглядит так:
//test
 //-WDL (Win-Draw-Loss).
 (*
1.Loss - Unconditional loss.
2.BlessedLoss - Loss that can be saved by the 50-move rule.
3.Draw - Unconditional draw.
4.CursedWin - Win that can be frustrated by the 50-move rule. 
5.Win - Unconditional win.
 *)
 //-DTZ (Distance to zero).
  try
 (*
  1-a:\
  2-b:\
  3-c:\
  4-d:\
 *)
 GetDir (4,Dir_str);//возвращает в Dir_str букву диска(см пример)
 //если файл fathom.exe существует по указанному пути
 if FileExists(Dir_str+'Fathom-1.0\fathom.exe') then begin
    //позиция для примера
    fenpos:='3k3N/8/8/8/1N1p4/8/8/K7 w - - 0 1';
    ParseFEN(fenpos);
    ClearDesk ();
    DrawPieceBoard();
    //"D:\Fathom-1.0\fathom.exe" "--path=D:\3-4-5" "3k3N/8/8/8/1N1p4/8/8/K7 w - - 0 1"
    Info.PrintInfo(GetDosOutput('"' + Dir_str + 'Fathom-1.0\Fathom.exe" "--path=' + Dir_str + '3-4-5" "' + fenpos + '"',Dir_str + 'Fathom-1.0',ResultCode));
 end else begin
    Info.PrintInfo(Dir_str+'Fathom-1.0\Fathom.exe не найден');
 end;
  finally

  end;
 //test

запуск приложения Fathom.exe и получение результатов
//http://delphimaster.net/view/4-1140074783
function GetDosOutput( const CommandLine, WorkDir: String;
                      var ResultCode: Cardinal ): String;
var StdOutPipeRead, StdOutPipeWrite: THandle;
   SA                             : TSecurityAttributes;
   SI                             : TStartupInfo;
   PI                             : TProcessInformation;
   WasOK                          : Boolean;
   Buffer                         : array[0..255] of Char;
   BytesRead                      : Cardinal;
   Line                           : String;
Begin
   Application.ProcessMessages;
   With SA do
   Begin
      nLength := SizeOf( SA );
      bInheritHandle := True;
      lpSecurityDescriptor := nil;
   end;
   // создаём пайп для перенаправления стандартного вывода
   CreatePipe( StdOutPipeRead,  // дескриптор чтения
               StdOutPipeWrite, // дескриптор записи
               @SA,              // аттрибуты безопасности
               0                // количество байт принятых для пайпа - 0 по умолчанию
              );
   try
    // Создаём дочерний процесс, используя StdOutPipeWrite в качестве стандартного вывода,
    // а так же проверяем, чтобы он не показывался на экране.
    with SI do
    Begin
       FillChar( SI, SizeOf( SI ), 0 );
       cb := SizeOf( SI );
       dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
       wShowWindow := SW_HIDE; //не показывать окно
       hStdInput := GetStdHandle( STD_INPUT_HANDLE ); // стандартный ввод не перенаправляем
       hStdOutput := StdOutPipeWrite;
       hStdError := StdOutPipeWrite;
    end;

    // Запускаем компилятор из командной строки
    //WorkDir := ExtractFilePath(CommandLine);
    WasOK := CreateProcess( nil,
                            PChar( CommandLine ),
                            nil,
                            nil,
                            True,
                            0,
                            nil,
                            PChar( WorkDir ),
                            SI,
                            PI );
    // Теперь, когда дескриптор получен, для безопасности закрываем запись.
    // Нам не нужно, чтобы произошло случайное чтение или запись.
    CloseHandle( StdOutPipeWrite );
    // если процесс может быть создан, то дескриптор, это его вывод
    if not WasOK then
     raise Exception.Create( 'Ошибка выполнения или компиляции: ' +
            Chr( 10 ) + Chr( 13 ) + CommandLine )
    else
      try
        // получаем весь вывод до тех пор, пока DOS-приложение не будет завершено
        Line := '';
        Repeat
           // читаем блок символов (могут содержать возвраты каретки и переводы строки)
           WasOK := ReadFile( StdOutPipeRead, Buffer, 255, BytesRead, nil );
           // есть ли что-нибудь ещё для чтения?
           if BytesRead > 0 then
           Begin
              // завершаем буфер PChar-ом
              Buffer[BytesRead] := #0;
              // добавляем буфер в общий вывод
              Line := Line + Buffer;
           end;
           Application.ProcessMessages;
        Until not WasOK or ( BytesRead = 0 );
        // ждём, пока завершится консольное приложение
        WaitForSingleObject( PI.hProcess, INFINITE );
        ResultCode := 0;
        GetExitCodeProcess( PI.hProcess, ResultCode );
      finally
        // Закрываем все оставшиеся дескрипторы
        CloseHandle( PI.hThread );
        CloseHandle( PI.hProcess );
      end;
   finally
     Result := Line;
     CloseHandle( StdOutPipeRead );
 end;
end;

Bitboard в программировании шахмат №2 24 Июль 2023 20:20 #236

  • Хайдук
  • Хайдук's Avatar
  • OFFLINE
  • Наместник
  • Posts: 49531
  • Thank you received: 133
  • Karma: 17
намёк понял, но я ... скупой халявщик :blush:

Bitboard в программировании шахмат №2 25 Июль 2023 10:30 #237

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 195
  • Thank you received: 10
  • Karma: 1
К сожалению скачанные базы 3-4-5 оказались ипорчены. :(
(if every file if OK you're good to go)


SlavaSoft Optimizing Checksum Utility - fsum 2.52.00337
Implemented using SlavaSoft QuickHash Library <www.slavasoft.com>
Copyright (C) SlavaSoft Inc. 1999-2007. All rights reserved.

FAILED       MD5          KBBBvK.rtbw
FAILED       MD5          KBBNvK.rtbw
FAILED       MD5          KPvK.rtbw
FAILED       MD5          KRPvK.rtbz


4 checksums failed
Для продолжения нажмите любую клавишу . . .

Проверил утилитой входящей в состав баз - fsum.exe

Unconditional_win.jpg


draw.jpg


Надо искать другую ссылку на 3-4-5

Bitboard в программировании шахмат №2 25 Июль 2023 11:58 #238

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 195
  • Thank you received: 10
  • Karma: 1
Не очень понимаю, точнее совсем не понимаю :angry:
Скачал только испорченные файлы:
Ссылка вверху этого сайта - "Таблицы эндшпиля" - "tablebase.lichess.ovh" - "standard/ " - "3-4-5/ "
Ошибка md5 осталась у одного файла
Massimiliano Goi (c) 2017 http://chess.massimilianogoi.com

Checking the integrity of the 3-4-5 pieces Syzygy files
(if every file if OK you're good to go)


SlavaSoft Optimizing Checksum Utility - fsum 2.52.00337
Implemented using SlavaSoft QuickHash Library <www.slavasoft.com>
Copyright (C) SlavaSoft Inc. 1999-2007. All rights reserved.

FAILED       MD5          KPvK.rtbw

1 checksums failed
Для продолжения нажмите любую клавишу . . .

Но теперь вот ...

draw-1.jpg


Короче полный швах :dontknow:

Bitboard в программировании шахмат №2 25 Июль 2023 12:16 #239

  • Vladimirovich
  • Vladimirovich's Avatar
  • OFFLINE
  • Инквизитор
  • Posts: 107787
  • Thank you received: 2128
  • Karma: 106
А что не так?
Это абсолютная рыба
Каждому - своё.

Bitboard в программировании шахмат №2 25 Июль 2023 12:23 #240

  • Vladimirovich
  • Vladimirovich's Avatar
  • OFFLINE
  • Инквизитор
  • Posts: 107787
  • Thank you received: 2128
  • Karma: 106
Вообще видно, что поменяли там файл в 2021 году
Ну если, что-то не так, вот у меня копия от 2013 как у всех остальных

File Attachment:

File Name: kpvk.zip
File Size: 10 KB
Каждому - своё.
The following user(s) said Thank You: alexlaw
Moderators: Grigoriy
Рейтинг@Mail.ru

Научно-шахматный клуб КвантоФорум