ЈакшаХ - Историјат верзија и мемоари једног програмера
Верзија: 0.01
Датум: 27.02.2004.
Биљешке:
- Имплементација од "нуле". Фокус на коректности игре, а не на снази и брзини.
- Генератор потеза: Подржани основни потези свих фигура са изузетком рокаде, анпасана, промоције пјешака,
откривања мата, пата, односно ремија са понављањем.
-
Алгоритам за претрагу: Алфа-бета (побољшана Верзија рекурзивног "нега мини-макс" алгоритма).
- Репрезантација шаховске табле: 12x12 (као једнодимензионални низ).
- Евалуатор позиције: За сада узета у обзир само материјална вриједност фигура.
- База отварања, графички интерфејс, као и инсталациони програм нису планирани у ближој будућности.
- Компјутер игра сам против себе првих 5 потеза. Први забиљежени потези ЈакшаХ-а: 1. г4, е6 2. Лх3 ...
Верзија: 0.02
Датум: 03.03.2004.
Биљешке:
- Алгоритам за претрагу: Исправљена грешка код утврђивања најбоље позиције супарничке стране.
- Кориснику омогућено по први пут да игра против Јакшаха у текстуалном моду.
- Евалуатор позиције: Сада се рачуна и позициони положај пјешака.
- Побољшано исцртавање шаховске табле тј. тренутних позиција у текстуалном моду.
- Партија се такође истовремено записује у датотеку "JaksaH-PosljednjaPartija.log". Иначе, трудио сам се да за
програмски код (имена датотека, промјељивих, класа, метода, коментаре...)
користим називе на српском.
Морам да признам да сам понекад имао проблема, или благо речено недоумица, са избором
прикладних именица.
Рецимо, класу која сав програмски излаз истовремено шаље и на екран
као и у датотеку (Writer, јелте) сам првобитно
назвао "Записничар" да бих потом име скратио за читава два слова па je преименовао
у "Записник", а двоумио сам се
да употријебим још краћи назив "Писач".
Од "Писач"-а сам убрзо одустао јер би тако нешто написано са ASCII словима
(енглески алфабет) "Pisac",
могло бити протумачено више него двосмислено: "Писац" (о.а. "Књижевник") или чак још и горе: "Пишач"! :)
Називе за моје остале класе не смијем чак јавно ни да спомињем. Оног дана кад снимање и превођење изворних датотека буде
могуће урадити у Уникоду (енфл. UNICODE), ЈакшаХ ће бити у потпуности написан у ћирилици.
- Подржана промјена страна (бијеле фигуре могу да буду постављене на 7 и 8 реду).
- Убачен код за откривање брзине процесора од аутора Павлоса Тоубоулидиса.
Верзија: 0.03
Датум: 06.03.2004.
Биљешке:
- Омогућен регуларан завршетак партије са матом или патом.
- Генератор потеза: Омогућена рокада.
- Мјерење времена по потезу (секунде) и по евалуацији (милисекунде).
- Додат код за читање и снимање корисничких опција у Wиндоwс Регистрy под кључем: "HKEY_LOCAL_MACHINE\SOFTWARE\JaksaH\Opcije".
- Почео сам да архивирам изворни код од свих верзија.
Верзија: 0.04
Датум: 08.03.2004.
Биљешке:
- Брзина претраге драстично повећана кад сам сав контолни код ставио под _DEBUG макро. Евалуација више од пола милиона позиција
је на Пентиуму II 400 МHz умјесто првобитних 105 секунди сада трајала око 16 секунди (550%!), а Пентиум 4 2400 МHz је, умјесто 31 секунду,
потрошио непуне 4 секунде (побољшање од читавих 650%!!). Овај дан ћу дефинитивно да славим, као и све жене свјета... којима уједно
и поклањам ову верзију.
- Омогућена измјена корисничких опција. Подржана три мода игре: ЈакшаХ против самог себе (демо), ЈакшаХ против корисника (игра)
као и корисник против корисника (нпр. за анализу партија).
- Рилис (engl. Release) верзија ми је крахирала нон-стоп на самом почетку, док је дибаг (engl. Debug) нормално радио.
Испоставило се да је овај баг изазван
компајлерском директивом за оптимизацију брзине (/02) када је преводилац из само њему знаних разлога одложио позив приватном конструктору
који инициализује статички показивач на тај објекат (синглетон шема) што је изазвало добро знан "Access Violation Error 0xC0000005".
Проклети Мајкрософт...
- Реорганизовање кода за генерисање потеза донијело је додатних 20% побољшања при брзини.
- Побољшан код за рокаду, исправљено пар грешака у њему и извршена припрема за преостале специфичне потезе: анпасан и промоцију пјешака,
кориштена су бит поља.
- Исправљена грешка при откривању тучених поља.
- Исправљена грешка при постављању бијеле даме и краља на 8 ред (колоне су им тад замијењене за разлику од поставке на првом реду).
Верзија: 0.05
Датум: 13.03.2004.
Биљешке:
- Прва верзија која у потпуности игра све потезе по правилима ФИДЕ што практично значи да је овај шаховски програм завршен.
Цјелокупан рад од сада па надаље и убудуће ће спадати у домен оптимизације и побољшања. Данас је тачно мјесец дана прошло од
како сам почео да пишем код, али активно вријеме проведено на кодирању и тестирању бих свео на свега 10-так ударничких дана
(од по пар сати по дану). Да бих сва Фидина правила испоштовао до краја, требаће још да се дода подршка за откривање пар специфичних
реми ситуација (три потеза са понављањем, 50 потеза без освајања фигуре или помјерања пјешака као и ситуација када нема довољно
материјала да се матира противничка страна).
- Додата опција за постављање стране која је прва на потезу.
-
Евалуатор позиције сада узима у обзир и број поља која су тучена од даме, топа, скакача или ловца.
-
Уграђен код за предају партије ако је позиција веома лоша по ЈакшаХ.
-
Приликом неправилног уноса потеза од стране корисника, приказана је листа свих дозвољених потеза.
- Исправљена грешка при рокади ако је топ који миче био поједен.
Верзија: 0.06
Датум: 17.03.2004.
Биљешке:
- Дјелимично сам подржао WинБоардов најновији шаховски протокол, верзију 2, односно Винбоард програм вер. 4.2.7, тако да сада корисник,
по први пут, може да игра против ЈакшаХа и са графичким интерфејсом!! Било је јако узбудљиво играти против ЈакшаХ-а на овај начин.
Тек сад кад сам га видио "како је проговорио", сконтао сам у ствари колико је то једно недорасло чељаде. Није што је мој, али што мали волиии да шахира, па то нема нигдје. Ово ће ми пуно значити код тестирања и додатних побољшања... Сад напокон могу очекивати и од људи да почну
да играју против ЈакшаХ-а. Исто тако, ово отвара могућност и за утврђивање ЈакшаХ-овог рејтинга јер му је сада буквално омогућено да игра против стотине других шаховских програма који исто подржавају Винбоард. Држ’ га Лаки!!
- Омогућено започињање нове партије без поновног покретања програма. Ово важи и за текстуални мод.
-
Неке методе сам декларисао као "инлајн", што је донијело нова побољшања у брзини.
-
Исправка која онемогућује рокаду кад је краљ у шаху.
Да су моји видјели како је ЈакшаХ 0.05 елеганто рокирао кад му је црна дама дала шах, одма’ би ме се одрекли.
-
Убачен код за праћене свих анализираих потеза до дна стабла претраге. Нормално, ово значајно успорава брзину, па сам овај
код ставио под предпроцесорске директиве.
-
Исправљена грешка у случају вишеструких узастопних анпасана.
- Још увјек сам и те како сконцентрисан на коректност игре, тестирање,
а сада и на графичку подршку, тако да истински рад на рејтингу и оптимизацији програма још није почео. Кад се то деси, убјеђен сам да ће
ЈакшаХ врло брзо постићи снагу достојну барем нивоа мајсторског кандидата.
Верзија: 0.07
Датум: 23.03.2004.
Биљешке:
- Подржан регуларан завршетак партија у Винбоарду са порукама на српском и енглеском, без напрасног напуштања програма од стране
ЈакшаХа у случају предаје, мата или пата.
-
Подржан завршетак партије у случају ремија са три понављања.
-
Укинута опција 'bf' (положај бијелих фигура) у текстуалном режиму ради боље компактибилности са графичким режимом рада. Колико сам примјетио, мада то нисам нашао нигдје у упутсву, Винбоард увјек поставља бијеле фигуре на 1 и 2 ред без обзира на режим игре. Ово ми је и логично
с обзиром да им то олакшава учитавање/снимање партија у стандардној шаховској нотацији.
- Исправљена још једна скривена грешка у алгоритму за провјеру исправности рокаде. Више ми је мука од овог кода за рокаду јер сам
још од верзије 0.03 стално чинио неке исправке. Ваљда ће сад радити фино, мада никад не реци никад...
- Коригована грешка при именовању лог датотеке у текстуалном моду игре. Ова грешка није ни постојала до верзије 0.06, а разлог за
њену појаву је била моја жеља да записничка датотека увјек буде креирана у истом директоријуму гдје је и ЈакшаХ.
С обзиром да Винбоард покреће ЈакшаХ из његовог матичног директоријума, тамо је био и усмјераван запис, па сам морао да правим
вратоломије око пуне адресе лог датотеке што је зезнуло, ни крив ни дужан, текстуални режим.
Верзија: 0.08
Датум: 31.03.2004.
Биљешке:
- Први значајни рад на оптимизацији програма при брзини претраге обухвата двије нове технике: Хаш табеле и кружно продубљивање.
-
Имплементација такозване хаш (или транспозиционе) табеле омогућава меморисање огромног броја позиција, а самим тим и значајну
уштеду при претрази уколико се наиђе на истовјетну позицију произашлу другачијим редосљедом потеза. Књига "Увод у алгоритме" ми
је добро послужила за ову свру. Још један веб сајт ми је био одличан извор информација. Ускоро ћу навести све сајтове или литературу
који су ми били значајан извор информација при развијању овог програма.
- Друга техника је коришћење тзв. “кружног продубљивања” у стаблу претраге при чему се најбољи потез тражи тако што се крене од
нулте дубине па до циљне која је постављена опцијом "Дубина анализе". Примјеном ове двије технике сам добио и једну ствар бесплатно,
а то је извјесно побољшање при одређивању редосљеда потеза. Алфа-бета алгоритам ће значајно смањити број позиција које треба да
буду анализиране, без губитка квалитета при проналаску најбољег потеза, ако су сви генерисани (дозвољени) потези уређени тако да су
потенцијално најбољи кандидати при самоме врху. Ово хеуристичко знање о добрим кандидатима сада долази комбиновано из хаш табеле
пуњене кружним продубљивањем.
- Искрен да будем, мало сам разочаран првим резултатима. Очекивао сам да ће побољшања бити толика да ће ЈакшаХ моћи да анализира
један потез даље у дубину, а за приближно исто вријеме. Са друге стране, реална побољшања нису ни безначајна. Број евалуираних позиција
при већој дубини анализе је сада за половину до трећину мањи од броја претходне верзије 0.07. Проблем је само да су ова побољшања
донекле умањена додатним временом неопходним за ажурирање и претрагу хаш табеле.
-
Са хаш табелама сам се зезао добра три дана. Ђаво је, као и увјек, у детаљима. Додатне тешкоће се се јавиле при креирању шифри
које ће сваку дату позицију учинити јединственом, јер би само складиштење позиција прогутало огромну меморију. Испоставило се да је
јако тешко, ако не и немогуће, креирати јединствене шифре у апсолутно свим случајевима, тако да при огромном броју позиција
(пар стотина хиљада или више) понекад долази до мањих деформалитета код евалуционих вриједности, а у односу на првобитне верзије без
хаш табеле. Ма, ако ми неко у наредних мјесец дана спомене било шта што почиње са Х, убићу га, хоћу хљеба ми!
-
Коригована је још једна грешка при рокади која се јавила у коду који је исправио другу погрешку. Овај баг је стварно био лапсус,
"copy & paste" тип грешке, али ме је дефинитивно направио да "стрепим" сваки пут кад треба да извршим рокаду.
Верзије: 0.09 (српски), 0.10 (енглески)
Датум: 07.04.2004.
Биљешке:
- Посљедња побољшања урађена у 0.08 су ми дозволила да идем један полупотез удубину више за исту процесорску брзину.
-
Побољшан евалуатор позиције да подстиче рокаду, отварање линија и дијагонала, као и да умањи значај напредовања крајњих пјешака.
-
Имплементирана функција за поништавање (враћање) потеза приликом анализирања свих дозвољених потеза.
Ово је ефикасније од коришћења привременог објекта за позицију по потезу због његове неефикасне конструкције.
- Додата пуна подршка и за верзију на енглеском језику.
-
Несумљиво најјача верзија ЈакшаХ-а у односу на претходна издања.
Верзија: 0.11
Датум: 09.04.2004.
Биљешке:
- Испоставило се да покушај да се иде један полупотез дубље приликом претраге, учињен у претходној верзији, одузима много времена,
тако да ћу од тога за сада морати одустати док не учиним даљна побољшања у алгоритму претраге.
-
Исправљена грешка у коду за поништавање потеза тако да евалуатор сада правилно подстиче рокаду. Додао сам и “казну” за рокирање
супарничке стране тако да сада ЈакшаХ има више мотива да и ту супарнику прави проблеме.
Верзија: 0.12 (енглески)
Датум: 04.05.2004.
Биљешке:
- Издање на енглеском језику верзије 0.11 уз мање модификације.
-
Записничка датотека преименована у "JaksaH.log".
-
За процесоре спорије од 700 МHz, дубина анализе је два потеза.
За све брже процесоре дубина је три потеза или 5 полупотеза.
-
Написана корисничка документација и за верзију на енглеском.
Верзија: 0.13 (енглески)
Датум: 24.01.2006.
Биљешке:
- Настављен рад на програму након готово двије године паузе. Кад сам радио на првобитном дизајну, нисам био сасвим сигуран за које
"тржиште" пишем програм. Данас ми се та мисао сасвим искристалисала, и желио бих да ЈакшаХ превасходно усмјерим за такмичења против
других шаховских програма. Ово ће изискивати реорганизовање кода како би се уклониле неке ствари које и нису баш толико неопходне.
Ова верзија је управо помак у том правцу.
- Уклоњен је код за снимање и измјене опција у регистру ОС-а (енгл. Windows Registry).
- Уклоњен је код за снимање промјена у датотеку.
-
Уклоњен је код за аутоматско покретање ЈакшаХ-а.
-
Уклоњен је код за израчунавање брзине процесора.
- ЈакшаХ је од почетка бивао развијан са потпуно легалним Мајкрософтовим софтвером
(Windows 2000 Pro, Visual Studio 6.0 Pro). Цд-ове сам бесплатно добио од Мајкрософта који их је великодушно дијелио студентима
компјутерских наука у Ванкуверу на факултету гдје сам студирао.
Верзија: 0.14
Датум: 17.02.2006.
Биљешке:
- Напокон је подржано вријеме игре, а додатно је унапријеђена компактибилност са Винбоардом.
- Пројекат се од сада развија са Мајкрософтовом алатком Visual Studio 2005 на XP Pro. Користио сам компајлерску опцију /Za
да омогућим потпуну компактибилност са ANSI као и ISO C++ стандардом, а документација је писана са Визио 2007 Бета алатом.
-
Употребу STL вектора сам замјенио са статичким низовима. Сва ова побољшања су доприњела скоро дупло бржој игри ЈакшаХ-а
него што је то био случај до сада.
- Код је реорганизован тако да се јасно зна граница између два главна модула: "Посредника" и "Мислиоца". Напокон сам завршио и један
дио дизајна. Знам, знам, прво треба да се у потпуности заврши дизајн, па тек онда почне са развојом, али ја само примјењујем моја
богата искуства стечена у вишегодишњем контакту са софтверском индустријом :) Уосталом, јесте ли чули за појам "Reverse Engineering"?
Па то су управо инжињери и измислили како би и даље могли, али овај пут са добрим изговором, да "избјегавају" досадно писање
пројектне документације, и усресреде се на ствари које обожавају да раде, што би народ рекао, "на кајмак" :)
- Текстуални режим игре додатно је приближен графичком режиму. Јаснија упутсва за играње у текстуалном режиму омогућавају да,
након свега пар секунди читања, корисник започне партију.
Верзија: 0.15
Датум: 27.02.2006.
Биљешке:
- Тек са овим издањем сам заокружио први озбиљнији рад на побољшањима започет још у верзији 0.08. Наиме, ради се о томе да се
сви потези из претходне претраге сортирају пред нову претрагу тако да ће се најбољи кандидати од сада увијек први претраживати.
Ово значајно унапређује смањује стабло претраге без губитка снаге. Просто не знам како ми је ово промакло да урадим још у верзији 0.08,
иако сам ову технику споменуо још у биљешкама те верзије. За сортирање сам користио најбржи алгоритам опште намјење, тзв. "Quick Sort".
- Подржао сам Винбоардове команде "time" и "otim" које говоре програму колико је преостало времена како њему тако и противнику.
Наравно, ово вријеме рачунам интерно и ја, али није лоша идеја да се вријеме синхронизује са Винбоардом, на крају крајева он је
тај кадија који одреди јел' ти пала казаљка или не :)
- Исправио сам погрешку у коду за постављање почетног времена која је учинила да ЈакшаХ "пуца" кад је покренут са Ареном в1.99 Бета2.
-
Исправљена мања неправилност у коду за утврђивање ремија са три понављања.
- Интересантно је споменути да је на исти дан прије двије године објављења прва верзија Јакшаха. Трудио сам се да са сваком новом
верзијом постигнем видна побољшања у игри, односно унаприједим Јакшахов ФИДЕ рејтинг, и веома сам задовољан досадашњим учинком.
Да ми је изгурати још једно 15-так издања, па ћу чак почети бивати и поносан на ово моје мусаво чељаде. :)
Верзија: 0.16
Датум: 06.03.2006.
Биљешке:
- Временска контрола је побољшана како би се боље оптимизовало вријеме за дуже партије.
-
Исправљено неколико погрешки.
Верзија: 0.17
Датум: 06.07.2006.
Биљешке:
- Још једна од верзија која доноси многобројне исправке али без значајнијих промјена у коду.
-
Уклоњен проблем са Винбоардом кад би реми из претходне партије онемогућио покретање нове.
- Исправљена грешка у текстуалном моду игре кад је нотација била приказивана увијек на српском.
-
Робуснији код кад су у питању улазно\излазне операције.
- Код који се брине за логику партије је "прочишћен".
- Иначе недавно сам имао прилику да играм против шаха који ће доћи у наредној верзији Мајкрософтовог
Виндовса (Виста).
Драго ми је било кад сам видио да би ЈакшаХ без проблема тукао првих 7 нивоа (од укупно 10)
овог
јединог Мајкрософтовог шаховског програма. Истина је да је Мајкрософт тај програм направио више у намјери
да демонстрира
Вистине графичке могућности, него да буде јак. Без обзира на то, драго ми је кад знам да смо
"много јаки" :)
Верзија: 0.18
Датум: 20.09.2007.
Биљешке:
- Исправљене грешке у коду за утврђивање времена. ЈакшаХ, иако можда игра незнатно слабије у односу на претходну верзију
(јер сада троши више времена на утврђивање преосталог времена), више не би требао да губи на вријеме.
Верзија: 1.00
Датум: 27.02.2008.
Биљешке:
- Репрезентација шаховске табле са 64-битним ријечима. Ово је изискивало темељну реорганизацију изворног кода.
Ова верзија, са свим побољшањима која су је пратила, би требало да подигне Јакшахов рејтинг за барем 200 ЕЛО поена.
- Поред кода за статичку претграгу, додат и код за динамичку евалуацију позиција са продубљеном анализом потеза
који обухватају шахирања као и заробљавања фигура (енгл. quiescence search).
- ЈакшаХ уочава понављање позиције.
- Исправљене грешке у алгоритму за претрагу код граничних вриједности алфа и бета, као и друга разноразна побољшања
при брзини, ефикасности, стабилности и логици игре.
- Зобристове шифре за хаш табелу. Број даминих тучених поља се више не узима у обзир код статичке евалуације.
- Додат код за креирање статусне датотеке у случају примјећених неправилности при извршавању.
Датотека са именом "JaksaH_log.txt" ће се креирати у истом директоријуму гдје се налази и сам ЈакшаХ. Уколико
примјетите да је таква датотека креирана, молим вас да је пошаљете на ajaksic@hotmail.com. Хвала!
- Пројекат пребачен на Visual Studio 2008. 32-битна као и 64-битна верзија програма објављене по први пут.
- Изврорни код у потпуности написан на ћирилици изузев кад се ради о резервисаним ријечима и наредбама језика C++. Да ли
заиста могуће да је ово први српски програм чији је комплетан изворни код написан у ћирилици? Надам се да јесте!
- Све у свему, издање које доноси многобројна побољшања, стабилност као и нову снагу. Верзија која у постуности заслужује
скок са 0.18 на 1.00.
Верзија: 1.01
Датум: 15.03.2008.
Биљешке:
- ЈакшаХ напокон разликује мат од пата (тако да ће сада радо матирати противника ако му се пружи прилика за то).
- Исправљена грешка у коду за играње анпасана (бит поље поједеног пјешака није било ротирано што је
онемогућило правилно креирање листе дозвољених потеза након одиграног анпасана.
- Евалуациона функција сада препознаје удвостручене пјешаке.
- Коригована грешка у коду који имплементира Фидино правила за откривање ремија се три понављања.
Реми по тумачењу правила наступа након што се сама позиција (а не низ потеза) поновила три пута.
- Исправљена грешка збох које је ЈакшаХ предавао партије игране у Арени. Код је претпостављао да се након истеклог времена
аутоматски додјељује ново вријеме за нови број потеза (као сто то ради WинБоард). Медјутим, Арена додјељује фиксно вријеме за
цијелу партију (нема временског повећавања) тако да је ЈакшаХ напросто предавао позиције због истицања времена.
- Због грешке у претходној верзији, ЈакшаХ је у свим ситуацијама избјегавао реми са понављањем,
а од сад ће покушати избјећи реми само у случају ако му је позиција боља.
- Уочавање реми позиција након одиграних 50 потеза без освајања фигуре или помјерања пјешака.
- Побољшан код за обраду завршетка партије и исправљена грешка гдје ЈакшаХ није пријавио да је партија завршена
усљед матирања супарника.
Повратак на ЈакшаХ