Консолька классно смотрится. Для отладки вообще самое оно.
Смотрите Алекс. Пока мы пишем в чистом паскале движок легко скомпилируетсяи запустится везде : на любой платформе и на любой разрядности процессора. А вот когда мы начнем думать о СИМД ускорителях нам неизбежно придется делать сложный выбор : в ДЕлфи или ФриПаскале дальше будем компилировать, на каких Интел или на новых Маках запускать ( у меня такой), на 64 или 32 битах крутить и даже на Виндоусе или нет будет машина
В regedit перейдите к HKLM\Software\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont
Щелкните правой кнопкой мыши на правой панели, выберите New -> String value.
Напишите 00 в качестве названия записи.
Щелкните правой кнопкой мыши на новой записи, нажмите на Modify.
Введите название нужного шрифта в поле Value данных. Это значение должно совпадать с одной из записей в HKLM\Software\Microsoft\Windows NT\CurrentVersion\Fonts
Если вы хотите добавить дополнительные шрифты, повторите предыдущие шаги, каждый раз добавляя 0 к названию записи (то есть третья запись должна быть 000 и так далее).
Перезагрузите компьютер, чтобы применить изменения.
Откройте окно консоли, щелкните правой кнопкой мыши на строке заголовка, выберите Properties.
Выберите Font вкладку. В списке должны появиться новые шрифты
Вы можете использовать апплет Charmap.exe, чтобы посмотреть, какие глифы доступны в конкретном шрифте.
uses
Windows
var
s: WideString;
i: integer;
Written: Cardinal;
begin
SetLength(s, 12);
for i := 0 to 12 do
s[i] := WideChar(i+9811);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), PWideChar(s), 12, Written,nil);
// print board
procedure print_board(var Board:TBoard);
var
NumCharsWritten: DWORD;
rank_,file_:integer;
fig_str:String;
begin
Writeln('');
// loop over board ranks
//rank - ряд, горизонталь, а file — столбец, вертикаль
for file_ := 7 downto 0 do begin
// loop over board files
for rank_ := 0 to 7 do begin
// print ranks
if rank_ = 0 then begin
Write(1 + file_);
Write(' ');
end;
Write(' ');
//Write(board[rank_][file_] );
//King=6;Queen=5;Rook=4;Bishop=3;Knight=2;Pawn=1; // BK=-6 BQ=-5 BR=-4 BB=-3 BN=-2 BP=-1
case Board.Squares[Decoder[8*file_+rank_]] of
1:fig_str:='♙';
2:fig_str:='♘';
3:fig_str:='♗';
4:fig_str:='♖';
5:fig_str:='♕';
6:fig_str:='♔';
-1:fig_str:='♟';
-2:fig_str:='♞';
-3:fig_str:='♝';
-4:fig_str:='♜';
-5:fig_str:='♛';
-6:fig_str:='♚';
0:fig_str:='.';
end;
//Write(fig_str);
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), PChar(fig_str), Length(fig_str), NumCharsWritten, nil);
end;
// print new line every rank
Writeln('');
end;
// print new line
Writeln('');
// print board files
Writeln(' a b c d e f g h');
Writeln('');
end;
Почитал документацию Stockfish о NNUE
Сделал для себя вывод.
Чтобы воспользоваться преимуществом NNUE, нужны параллельные вычисления на процессоре, что характерно для архитектур типа SIMD (Single Instruction, Multiple Data), где одна инструкция применяется к множеству данных.
Иначе нет разницы в оценке нейросетью и обычной оценочной функцией.
Если в двух словах (в моем понимании), кто быстрее заглянет глубже в переборе и точнее и быстрее оценит позицию на большей глубине, тот и на коне.
Но я вижу, куда будет развиваться дальнейшая нейро-компьютерная-шахматная мысль.
Это оценивать позицию без всякого альфа-бета перебора.
Получаю не объяснимую ошибку: try
case Board.Squares[Decoder[8*file_+rank_]] of
1:fig_str[1]:=char($2659);
2:fig_str[1]:=char($2658);
3:fig_str[1]:=char($2657);
4:fig_str[1]:=char($2656);
5:fig_str[1]:=char($2655);
6:fig_str[1]:=char($2654);
-1:fig_str[1]:=char($265F);
-2:fig_str[1]:=char($265E);
-3:fig_str[1]:=char($265D);
//-4:fig_str[1]:=char($265C);
-4:fig_str:='♜';
-5:fig_str[1]:=char($265B);
-6:fig_str[1]:=char($265A);
0:fig_str[1]:=char($00B7);
end;
//Write(fig_str);
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), PChar(fig_str), Length(fig_str), NumCharsWritten, nil);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Если вместо -4:fig_str:='♜';
ввести
-4:fig_str[1]:=char($265C);
получаю EAccessViolation: Access violation at address 000000000054154C in module 'small_chess.exe'. Write of address 0000000000000000
именно только для -4
Да - это фундаментальный документ - там все по делу. Но на сложном техническом уровне описано.
Вы неправильно поняли : нейросеть значительно превосходит "ручную" оценочную функцию за счет того что находит скрытые признаки позиции. А SIMD просто позволяет сделает ее по возможности быстрой.
"Если в двух словах (в моем понимании), кто быстрее заглянет глубже в переборе и точнее и быстрее оценит позицию на большей глубине, тот и на коне."
В двух словах так и есть. Потому и оптимизируется все по быстродействию на совесть.
"Это оценивать позицию без всякого альфа-бета перебора."
Есть 2 направления: "альфабета" (Стокфиш) и "монте-карло" (Альфазеро, Леела). Альфабета пока на коне. За счет NNUE
Stockfish 16.1
Двойной NNUE: Впервые Stockfish включает в себя дополнительную нейронную сеть, используемую для быстрой оценки позиций.
Все же я думаю они двигаются в направлении оценки позиции без перебора (ну или прощупывают это направление)
На мой взгляд это нереально : тактические нюансы надо перебором вычислять. Не оценкой. А стокфиш это в первую очередь всегда офигенный перебор. А лишь потом - кусочек nnue . Я в новой своей версии тоже попробую отдельную сеть для быстрой оценки ряда позиций. Там что-то есть.
Бросил на почту Функцию перебора модели форсированной игры с "обвязкой". По частям буду - что то устал за неделю. Поиграйтесь с ней, посмотрите как она работает. Попробуйте ее в вашем "переборе" вместо просто оценки . Не то чтобы чудеса должны быть, но , может, хоть материал зевать перестанет .
Кстати перебор на 1 полуход так и надо делать : из корня делаете все ходы. В позициях с ходом противника оцениваете позицию и возвращаете ее с противоположным знаком. Из всех таких оценок выбираете максимальную.
На почте у вас уже и полноценный перебор с комментариями. Пока медленный как черепаха, поскольку все делает неоптимально, грубо и бестолково. Но в шахматы уже играет . Мы сделали это. Предлагаю кодовое название для этого релиза "инфузория". Простейшее, которому еще эволюционировать и эволюционировать. Но уже сожрет чего , если без присмотра оставить
Не знаю как вставлять апплеты. Только что смеха ради провел партию с Руффианом (когда-то гроза и ужас когда я только начинал писать движок). Каждому движку поставил уровень 5 полуходов перебора. Чтобы равные условия. Даже несмотря на то что у нас вообще "плоский" перебор. Без продлений. Так черными того Руффиана как котлету сожрали. Вот только у нас пока нет проверки повторения позиции - сбежал, подлец, на ничью повторением позиции.
Ну а беленькими довела дело до победы. Причем в одну калитку. Каждому движку - по 6 полуходов перебора. Значит правильно нейросеть реализовал - там партия на заглядение. На 2 головы выше по пониманию позиции.
Ход, конечно, не украшает. Другое дело что оценочная функция после напрашивающегося размена ферзей не чувствует опасности. Ну нет рокировки. И...ладно - мат не получу. А то, что "ходить нечем", особенно ладьям, так это простая оценочная из "на рубеже веков" не понимает.
Руффиан, кстати, и при снятии ограничений на перебор в анализе только Крd8 и рассматривает как лучший. После минуты полноценного анализа. Ну да - такой вот уровень движков тех лет. 2650-2700 ЭЛО
Руффиан, кстати, и при снятии ограничений на перебор в анализе только Крd8 и рассматривает как лучший. После минуты полноценного анализа. Ну да - такой вот уровень движков тех лет. 2650-2700 ЭЛО
Там уже и выбора особого нет. 16я Вобла тоже не находит лучшего, считает уже гроб.
Да и я не вижу
Проблема в том, как движок доигрался до этого к 7 ходу.
Сам маневр, кстати, вполне разумный. Но позиция фигур к этому не располагает. Вот это учесть старые движки не могли, да.
Т.е. ошибка была совершена раньше.
Вот как эту идею реализовал Карпов. Но для этого нужно быть Карповым
Поставил бойцам испанку после 3 хода белых. Чтоб рокировались. Руффиан - жулик! При 6 полуходах в некоторых позициях используя удлиннения смотрит на все 8-9 . Опять такая же ничья (движок черными) : в ладейнике с собственным преимуществом в 2 пешки повторение позиции
Да там много таких идей - в одном берлине таких позиций как грязи. Движок просто в плане оценочной функции карпова уже превосходит (сетка хоть и маленькая и медленная ,но вполне полноценная и движку под 3000 ЭЛО вполне к лицу ). А перебор пока - полный шлак
Белыми интересно играл. Пожертвовал пешку, понимая что проходная будет очень опасной. Куда больше 6 полуходов до горизонта. В начисто уже выигранной опять начал повторять позицию.
Ну что ж, Алекс. Дальнейший план такой. Надо реализовать ровно 3 совершенно жизненно-необходимые вещи:
1. Хештаблица
2. Оценка ничейных терминальных узлов (правило 50 ходов, повторения, материал).
3. Очень бы желательно Static Exchange Evaluator прицепить хотя бы в зачаточной форме, чтобы какие-никакие продления реализовать и модель форсированной игры порезать. Жрет много.
Вот как эволюционирует инфузория до прямоходячих - полагаю на уровень 2700-2800 замахиваться макет точно будет. Ну а дальше уже оптимизации всего и вся + ваше творчество в переборных алгоритмах для собственного почерка движка.
Движок просто в плане оценочной функции карпова уже превосходит (сетка хоть и маленькая и медленная ,но вполне полноценная и движку под 3000 ЭЛО вполне к лицу ).