2021.g.nov.red.
piezīme: Sākotnējais dokuments ir padsmit gadus vecs, ir aizgājušas lietas, tomēr kopumā viss pareizi.
Aktualizēju jaunāko. Šobrīd pat elektroniskie pulksteņi var apspēlēt lielmeistarus, tāpēc zemāk rakstītais vietām ir kā vēsturisks konspekts.
Saites var būt kļūdainas, jo daudz web lietas pazūd un aiziet nebūtībās, tas zināms.
Šahs un datori, jeb gribu programmēt šaha programmu
(2021.g.red.)
Programmēšana
Zemāk aprakstītais domāts vairāk datoriķiem, kas vēlas izkopt šaha spēles
programmēšanu. Šahisti vienkārši spēlē šahu. Nolēmu padalīties apkopotajā
informācijā, ja nu kādam uznāk entuziasms un nav vēlmes izgudrot velosipēdu.
Tas ir iespējams un programma var būt absolūti minimāla.
Lūk elegants piemērs p4wn, uzrakstīts Javascript valodā tikai 5Kb apjomā.
Algoritms nav pārskatāms, bet programma darbojas, kaut arī visai glupi no šahista viedokļa.
Ja gribam izveidot ko stiprāku, tad sākam domāt par teoriju, un tā ir plaši atrodama internetā.
Lai nebūtu lieki jāsērfo, dažas tēzes zemāk.
Novērtēsim sarežģītību. Vidēji pozīcijā viena puse var
izdarīt ~30 gājienus (nu kaut vai). Uz katru no tiem – tāda pati atbilde. Jau
~900 pozīcijas. Ja mēs rēķinam savu otro gājienu, tad atbilde uz to jau ir (900)
* (900)...., utt. Pēc 3-ā mūsu gājiena - jau 24 miljoni. Var sanākt tā, ka sevišķi tālu rēķināt
nevaram, ja gribam arī uz ekrāna reālā laikā pabīdīt figūriņu.
Te ir dziļāka teorija.
Vienkārši sakot, visi izmanto tā
saukto min-max algoritmu (skat.alpha-beta pruning). Kalkulācijas dziļumu apzīmē ar ply (wikipēdijā var
daudz atrast). Pirmais ply ir mūsu iespējamie pirmie gājieni, kur pēc min-max
algoritma novērtējam iespējamās pozīcijas un cenšamies iegūt labāko(max). Otrais
ply ir pretinieka atbildes gājiens, kur skatamies sliktāko(min) priekš sevis
pozīciju, kuru pēc loģikas spēlēs pretinieks. Tālāk trešais ply ir mūsu otrais
gājiens, kurā atkal meklējam labāko. Ceturtais ply ir otrā gājiena atbilde no
pretinieka puses. Vēl sastopami tādi apzīmējumi kā search depth (rekursijas dziļums), kā arī nodes (varianti, jeb grafu virsotnes kokā).
Tātad stiprās (gudrās) šaha programmas jāprogrammē vismaz C valodā,
ja gribam panākt ātrdarbību. Piebildīšu, ka, ja šaha galdiņš ir 8x8, tad
informāciju var glabāt baitos un pielietot AND, OR, XOR, <<,>> bitu (bitwise) operācijām.
Izvēlētai programmēšanas valodai ir milzīga nozīme.
Uzvar tikai un vienīgi "brute force" metode - iteratīva EVAL funkcija.
Viss pārējais apkārt ir nianses. Nav jēgas rēķināt vienu gājienu un cerēt uz labu šaha sniegumu.
Tieši tāpat ir ar datora ātrdarbību – rekursija aiz rekursijas
prasa jaudīgu tehniku. Nosacīti, jo tagad pat mobilie ir ļoti ātri. Agrākie PC bija kā kājminami skūteri salīdzinājumā:) Viss mainās, bet tomēr. Spēles atlātnes visas puslīdz nopietnās programmas nerēķina vispār,
bet izmanto jau gatavus binārus kokus (books sākot no dažiem Mb) ar gatavām
novērtējuma vērtībām. Tieši tāda pati ideja ir spēles nobeigumam, kur atpakaļ
no mata tiek sarēķināts koks pretējā virzienā - endgame tablebases(wiki).
Kopš reāli datu apjomi kļuvuši terrabaitos, ir veiktas kalkulācijas, piemēram, visām 6-figūru galotnēm un pēc pozīcijas uzreiz var iegūt labāko nākamo gājienu (Nalimova tabulas) bez jebkādiem aprēķiniem.
Internetā ir web-lapas, kur pēc pozīcijas uzreiz tiek iedoti varianti, piemēram, 6-men tables (vai šeit).
Diemžēl šis risinājums ir ļoti datu ietilpīgs. Pērkot saīsinātā versijā sanāk ducis DVD disku, pēc instalācijas 100GB.
Jaunums tāds, ka syzygy lapā ir 7-men tables daudzos terrabaitos. Tātad resursi patērēti un ir visiem pieejams rezultāts. Var lejuplādēt.
Kā jaunākais virziens tiek attīstīti tā saukti "neural networks", kā piemēram NNUE stockfish. Tātad pie vājprātīgām, arī paralēlām kalkulēšanas iespējām uz TPU,GPU un CPU korēm, var uzturēt grafu ar norādēm uz nākamām pozīcijām, tās var izpētīt un novērtēt atsevišķi bitu līmenī, saglabāt kā objektus, utt. Sanāk arī tāds kā self-training modelis, kuru programma tikai apkalpo. Viena pozīcija vienmēr ved pie nākamām. Var padarīt šo zinātni par monstru arī. Pirmais itkā bijis AlphaZero šaha dzinis tāda tipa. Padarbojies uz sākuma atklātnēm dažas stundas daudzos TPU un samācījies-uzkrājis lielu pārsvaru pār Stockfish. Var teikt, ka pašapmācošie šaha dziņi, bet var teikt, ka mašīnresursu izvirtības, kur pati šaha programma ir tikai EVAL vērtēšana.
Faktori, kurus programmas izmanto pozīciju novērtēšanai:
1.materiāls uz galdiņa;
2.figūru tuvums centram;
3.savu figūru tuvums savam karalim (cik piesegts);
4.smago figūru tuvums pretinieka karalim;
5.blakus esošu bandinieku skaits pret vientuļiem (vājumi);
6.ieņemtās līnijas visā garumā;
7.attālums bandiniekiem līdz dāmai;
8.figūru apdraudējums pretinieku figūrām;
9.utt, daudz sīku nianšu un faktoru kopums.
Iespējamās taktikas:
Nobeigumā karali cenšas bīdīt uz centru, sākumā tura pēc iespējas noslēptu.
Varbūt ir vērts nerēķināt ātrāko matu vispār, bet censties pēc iespējas vairāk nokaut pretinieka figūras.
Atmest gājienus, kas nevērtējami kā aizdomīgi jau pirmajos aprēķinos, bet nu te algoritms var kļūdīties.
Kvalitāte pozīciju novērtējumā nedaudz atsver rēķināšanas dziļumu.
Ir tāda laba viltība, ko var pielietot min-max algoritma izstrādē, kas balstās uz nulles gājienu (null move). Doma tāda, ka, ja pozīcija neuzlabosies (salīdzinot novērtējumus pēc katra) arī, ja mums iedos divus gājienus uzreiz (bez atbildes gājiena pa vidu), tad tajā virzienā meklēt nav vērts.
Tad vēl ir tāda tehnika kā nepieļaut atkārtotu rēķināšanu no vienas un tās pašas pozīcijas,
kas var sanākt pamainot gājienu secību (piem,1.d4-d5 2.e4 sanāk arī 1.e4-d5 2.d4).
Tomēr tādi gadījumi var sanākt pietiekoši reti, lai sarežģītu algoritmu.
Horizonta efekts var sanākt, ja programma meklē kādā virzienā, vienmēr liekas tālāk dziļāk kas interesants ko jānoskaidro, bet laiks tiek patērēts un labākais gājiens varbūt netiek apskatīts vispār.
Tālāk seko daži seni pētījumi tolaik stiprai java applet programmai Jester (no Ludochess). PC bija vāji un java bija virtuāla mašīna uz Win32, praktiski interpretators. Source nebija pieejama, bet es papētīju dekompilētā veidā. Šī bija stipra java bāzētā "vecā" stila programma bez 64bitu bitboard elementiem, pārnesama pat uz javascript un actionscript. Atstāju kā spriedu toreiz.
...Aizdomas, ka programma sazinās ar serveri man pazuda, tiklīdz zaudēju tai ar atslēgtu internetu. Programmu izrādās var uzrakstīt 90Kb java kodiņā tā, lai tā visai labi spēlētu šahu!
Ideja slēpjas labi sabalansētā matemātiskā modelī, kurš darbojas dziļā rekursijā. Tātad vajag ātrdarbību, bitu
operācijas, zināt precīzus koeficientus un prioritātes (būt draugos ar šahu) un tad pat nevajag atklātņu
datubāzes, jo modelītis nedarīs muļķības partijas sākumā. Kā uzzināt šo matemātikas modelīti- tas ir cits jautājums. Skaidrs ir
viens, ka tradicionāli pārskatāmas un cilvēkam saprotamas programmas šaha gadījumā neder, jo būs lēni.
Tikai matemātika, cipari, rekursijas un precīzi koeficienti.Diemžēl.
Dažas viltības, pētot kodiņu, es tomēr atklāju. Tās būtu sekojošas:
1. neanalizējam visus variantus, bet ticamākos (dažādas tehnikas katrai programmai kā to darīt);
2. prioritāte kaušanai un to vispirms rēķinam tik dziļi, lai kaušana vairs nebūtu iespējama;
3. varianti ideāli glabājas koka veidā (grafā), t.i. varbūt labāk lietot objektorientētu pieeju (new node()) un klases (Position.score, Position.nextvariants[]), nevis masīvus [0....x-miljoni]. Garbage collection gan ir lēnāka nekā iepriekš rezervēts atmiņas bloks, jāskatās apjomi un konkrētā vide. Un arī kā tiek izmantotas hash tabulas (sk.zemāk);
4. vērtēšana ir sarežģīta, jāizmanto gandrīz visi elementi, kā brīvie bandinieki, bloķētie, pāra, kādi
laidņi,utt.
5. Nav vērts pat sākt, ja skaidri zināms, ka kods darbosies lēni un rekursijas nespēs laikā
sarēķināt. Būs ne tikai švaks spēlētājs, bet pat ļoti, ļoti iesācējs.
6. Ir gadījumi, it sevišķi spēles beigās, kad jāvērtē nevis nākamie gājieni, bet figūru uzvedība un
taktika, kaut randomizētā veidā (bandinieks varētu skriet dāmā tuvākos 5
gājienus, karalis varētu ķert bandinieku, vai vajadzētu pienākt ar karali, lai
ieliktu matu)....
nu tāds apskats, bet tas bija toreiz.
Matemātiskās likumsakarības
Nopietna dziņa izstrādei noteikti jāizmanto dabas dotas skaitļu likumsakarības. Eksperti savos algoritmos tās pielieto kā pašsaprotamas un obligātas.
1) Obligāti: iepriekšminētās bitu operācijas -vieninieciņu un nullīšu visātrākās skaitļojamās operācijas. Kopš ierīces kļuvušas 64-bitu (taisni kā šaha galdiņš 8x8=64), Bitboard(uint64) maskas un prekalkulācijas dod priekšrocības. Nežēlīgam šaha dzinim skatīt zemāk "maģiskos skaitļus", tas šobrīd novienkāršojis visu... Bet nu tomēr, cilvēkiem nepatīk tikai zaudēt, un vecās programmas spēlē interesanti un līdzvērtīgāk.
Atgriežoties pie tēmas, bitboard maskas, piemēram sliding piece attacks, ļauj rēķināt figūru iespējamo gājienu lauciņus ar bitwise operāciju, tā vietā lai ciklā apskatītu 64 lauciņus un apkārtējās figūras. Bitu operācijas ir ātras, kā arī var galdiņu un figūras atmiņā grozīt pēc patikas (wiki). Starp citu, bitu skaits var atspoguļot materiālu (algoritmi aprēķinam, t.i. pozīcija ir skaitlis, biti-figūras). Pie tam 8x8 galdiņa sakritība ar baits=8biti, integer=2baiti, long=vēl x2 baiti, un int64 (jeb long long tips) 64-bitu skaitlis taisni kā nosedz visu laukumu pa bitam (visi to izmanto);
2) Secīga xor operācija iegūst atpakaļ sākotnējo rezultātu (piemēram xor(xor(11,5),5)=11), ko izmanto ātrai gājiena un atpakaļ gājiena skaitļošanai, kā arī unikālas pozīcijas atslēgas (vai atmiņas adreses) iegūšanai. Pie xor izmantošanas jāpiemin Zobrist ideja. Doma ir tāda, ka pozīciju (figūras, rokāžu indikatorus, jebko citu) var nošifrēt xor(xor(xor(...))) vienā skaitļa atslēgā un dešifrēt atpakaļ. Kā otro operandu xor-am pielieto iepriekš uzģenerētu random skaitļu masīvu (ir gatavi algoritmi). Tas tāpēc, lai atslēga noteikti sanāktu arī unikāla - ja nu kautkā pēc 20tā gājiena sanāk identisks cipars, kas, starp citu, praksē gadās (raksts). Ja visas šīs atslēgas saglabā masīvā, tad iegūstam pozīciju datubāzīti ar visu pozīcijas pilnu pierakstu samērā kodolīgā pierakstā. Ja metodi izprot, tad sanāk automātiska šujmašīna baitiem :)
3) Binārā meklēšana un labākā gājiena sortēšana pēc pozīcijas novērtējuma meklēšanas ciklos. Tas vienkārši ir efektīvs ātruma palielinājums.
4) Protams, nekādas pakāpēs celšanas vai decimālskaitļu dalīšanas normāli šeit nav pieļaujamas.
Augstākās valodās (java,interpretatori), kur ātri darbojas masīvu sakārtošana vienā komandā .sort(), to jāizmanto pirms variantu pārlases, zinot pozīciju vērtējumus. Reāli "timeout" vienmēr notiekās un jāatgriež atrastais gājiens. Un visa masīva kopēšana vienā komandā .slice arī ātrāka par cikliem.
Bet vispirms jāiepazīstas ar maģiskajiem bitboardiem zemāk, jo tas padara programmu spēcīgāku.
Pētot c,c++ līmeņa dziņus, atklāju speciālu "nolaišanos" assemblera koda līmenī, lai pielietojot BSR, BSF mašīnkoda instrukcijas "momentāni" noteiktu lielāko un mazāko bitu. Valodā c nav analoga un cikli vājina dzini.
5) Parasti šaha galdiņu glabā 64bitos (a1=0..63=h8) katram figūru tipam. Ja tomēr tiek izmantots galdiņa masīvs, tad 8x8 vietā uztur 10x10 masīvu, jo tad figūra uz e2 ir masīva 25tais elements. Tāpat redzēti 12x12 masīvi, kur 2(nulles)+8+2(nulles) vienkāršo matemātiku.
6) Skaldīšana pa bitiem. Vienā baitā lauciņu var reprezentēt arī tā: 3(rinda)+3(kolonna)+2(liekie) biti. Tad kolonna ir (baits&7) un rinda ir ((baits>>3)&7), piemēram e2=20. Divos baitos ievietojas gājiens. Pēc pozīcijas novērtēšanas, gājienam pievieno pozīcijas novērtējumu (brīvajos augšējos bitos), kas lieliski ievietojas 4baitos skaitlī. Lieki piebilst, ka skaitļi sortējas un saglabājas hash tabulās.
Maģiskie skaitļi (magic bitboards)
Kopš 2007.gadā Pradu Kannan (wiki) sarēķināja savus "maģiskos skaitļus" (wiki), visi to lieto un neko citu stiprā programmā nelieto. Te viņa darbs, un arī programmas. Maģiskie skaitļi ir speciāli sagatavoti figūru gājienu noteikšanai-ģenerēšanai, neko labāku izdomāt vairs laikam nevar.
Ja šaha programmu veido kompaktu, smuku un ne obligāti ļoti stipru, tad var iztikt bez maģiskajiem skaitļiem, bet sacensību nolūkam jāiepazīstas ar labāko, ko matemātika šaham piedāvā. Matemātiski to sauc par "de Bruijn" virknēm vai skaitļiem (raksts). Saviem vārdiem tas skan tā, ka pietiek ar vienu reizinājumu un apskati sarakstiņā, lai noteiktu, piemēram, visus konkrētās pozīcijas figūras gājienus uz konkrēta lauciņa. Reizina ar iepriekšēji piemeklētu tādu skaitli, kurš tīri sakritības rezultātā trāpa uz "figūras iespējamajiem gājieniem". Un šis saraksts ar gājieniem ir sašaurināts. Tā bitu >> operācija ir projicēšana sarakstā. Tajā ir visas maskas katram lauciņam katram figūras tipam pie visām bloķējošām kombinācijām. No maskām bitus "izlasa" mazā ciklā ar tuvākā bita atrašanu:
LSB(X) = ((X)&-(X)); removeLSB(X) = (X&=X-1); Var pat sagatavot tabulas masīvus visiem LSB[x].
To visu iepriekš sarēķina un šaha dzinis tikai lieto. Var sarēķināt citas skaitļu tabulas, nav viena vienīga. Bet programma kļūst ļoti matemātiska, toties zinātāji uzreiz saprot kur kas.
Vēl ir tā, ka tādā python to var darīt, bet lua nesanāks, jo tur 32 bitu skaitļi tikai.
+vēsturiski materiāli........
Šaha dziņu (Chess engines) attīstība
Vēsturiski, uz PC pirmie brendi bija ChessBase (datubāze),Fritz, ChessMaster(wiki), Crafty (profesors), Hiarcs, vēlāk Rybka, Houdini laikam.
Stockfish kļuva visiem kā etalons (open source, kolektīvs darbs, atvasina daudzi). Ir versijas arī mobilajiem. Attīstības vēsture blogā. Katrā versijā pieliek klāt pie endgame tablebases, lai pretinieks ilgi nemocītos uz partijas beigām, laikam:).
Toreiz senāk viss bija par maksu, neko tā brīvi nepublicēja un programmas bija slēgtā koda. Izņemot Crafty un GNU chess.
Komercija, protams, pārsvarā gadījumos nepieļauj source programmu tekstu brīvu iegūšanu,
tomēr vecākām versijām internetā tas reizēm parādās, ja nav zudis.
Visbiežāk sastopami athīva failiņi ar distributīvu atbilstošai platformai – tikai dziņi.
Ir kategorija šaha dziņu brīvai lejupielādei ar visām sourcēm, sevišķi GitHub serveros. Jāsaka, ir daudz bezmaksas chess engines,
kur projekts kādreiz sācies, turpinājies un loģiski nobeidzies, nespējot
cīnīties ar šaha grandiem programmu jomā. Nu vai arī nav mērķis. Tā arī aiziet vēsturē kopā ar flash vai applet pluginiem. Tomēr iesācējam noteikti ir vērts tos apsakatīt, pirms atsisties
pret dīvainām kļūdām algoritmā. Tik viegli arī nebūs. Viens rakstīja: „Itkā pēc pozīcijas esmu
uzvarējis, bet nezkāpēc algoritms nevis mato, bet karalis tikai muļķīgi skraida
pa galdiņu".
Taisnību sakot, nu jau ir stipri dziņi brīvi pieejami un izpētāmi, nav noslēpumi tikai.
Crafty garadarbs.
Pētīju sen publicētās sources tekstus C valodā. Aptuveni 1Mb .c failiņu. Darbojas gan uz Windows,
gan Linux platformas. Nu priekš Mac gan jau arī var atrast kāda dziņa sourci.
Kods ir ievērojams, rakstīts sen un pamatīgi. Internetā sastopami daudz atvasinājumi,
jo spēlē visai augstā līmenī. Crafy vispirms rezervē vietu atmiņā, ņem talkā
atklātņu tabulu pirmajiem gājieniem no faila, un, kad esmu to novedis no kursa
ar a2-a3, rēķina cik nu var tālu paspēt sarēķināt. Protams, kods ir jūtami
novecojis un ir labāki, tomēr arī šajā darbs ieguldīts ievērojams un pietiekami
apjomīgs. Pētot pozīciju vērtēšanas algoritmus, nonācu pie slēdziena, ka tiek pilnībā izmantotas jau tolaik visas uzkrātās zināšanas par šaha teoriju. Algoritms nekļūdīgi pēc figūru izvietojuma jūt tālāk spēlējamo taktiku. Šaha teorija aprakstīta wikipēdijā, tas viss atrodams Crafty kodā. Man prieks, ka šādas labi dokumentētas augstas klases programmas kāds piedāvā brīvai apskatei. Starp citu, kādreiz dokumentēja daudz nopietnāk, biezos sējumos smukās drukās. Pēdējās izmaiņas Crafty saistītas ar galotņu tabulām, kas nu jau ir sarēķinātas 6-figūrām un dzinis to var izmantot reāli. Crafty vispār skaitās sentēvs un no viņa nākuši daudzi atvasinājumi, kā piemēram Glaurung (Stockfish ir viņa pēctecis).
Šaha programmētājiem labi zināms ir GnuChess. Internetā ir daudz tā klonu un tam ir daudz versiju (no 90jiem). Bet nu jau prātīgi ir pētīt Stockfish, tomēr nav tik patīkami dokumentēts, visu gribēt nevar.
Pārsvarā datorprogrammās tiek nodalīts dzinis (chess engine) no vizuālās daļas (GUI - graphics user interface). Savienojuma standarts ir UCI (Universal Chess Interface), kuram tad visi dziņu izstrādātāji arī
piemērojas. Vecs protokols, bet nu tāda ir attīstības vēsture. Visas šīs programmas, lai cik slavējamas no šaha viedokļa, absolūti neslavējamas no
integrēšanas viedokļa. Vienreiz uztaisīts 90s un tā arī lieto. Tas jūtami nekad nav bijis šaha programmu pamatuzdevums. Varēja failiņu kādu padot-saņemt kā Crafty, bet nē... Parasti kopā ar UCI (specifikācija / detalizēti) tiek minēts winboard/xboard standarts, ko arī šaha dziņos iekļauj. Labs salīdzinājuma raksts detalizēti apraksta plusus un mīnusus. Bet nu būtībā šaha dziņa interfeisam nepieciešamā funkcionalitāte ir pozīcijas uzdošana un komanda meklēt ar dziļuma parametru. Tehniski tas viss notiek caur standarta stdin/stdout datu plūsmu. Dzinis tiek startēts kā process un tam tiek padoti pieprasījumi. Reizēm GUI izstrādātāji pārkompilē opensource dziņus, stabilākai un optimālākai darbībai.
Lejuplādei var dabūt www.sdchess.ru, vai playwitharena.de. Brīvi pieejami open source stipram šaham, par brīvu, protams gan GUI, gan dziņi komplektā Arena, arī
Xboard, Winboard.
Mūsdienu šaha programmas spēlē nikni. Piezīmēšu, ka ja tam pašam vecajam Chess Master 3000 (no
seniem Windows 3.1 laikiem, kas bija 16-bitu OS) uzliek dziļāku meklēšanas līmeni, tad mēs arī
panākam visai labu šaha programmu, pateicoties mūsdienu datorjaudām. Gribēju
teikt, ka Deep Blue pret mani nav vajadzīgs.
Tiem, kam patīk vēsture, iesaku apskatīt microchess, kur laikam ir pirmais assemblera šahs.
Pirmā programma nemācēja ne rokādes, ne garāmsišanas. Otrā plaši zināmā assemblera programma bija Sargon no 1978.gada, kuras kods ir pieejams (wiki).
Citas adreses ko apskatīt: vāciski ar bildēm un informāciju bagāta šaha vēstures lappusīte vācu valodā, britu lappuse par šaha programmu vēsturi, kā arī kaissa par padomju laiku pirmo šaha skaitļotāju. Un te lapā var izbaudīt vecās šaha programmas darbībā pārlūkprogrammā.
Adresē spacious-mind.com atrodama lieliska 30 gados uzkrāta kolekcija-saraksts par šaha kalkulatoriem (nezinu kā tos nosaukt), programmām, vispār vēsturi ar visām bildēm, kas regulāri tiek arī papildināta. Piebildīšu, ka mūsdienu šaha kompjūteri-kalkulatori (ar galdiņu vai bez) tagad ir tās pašas spēcīgās šaha programmas parastos datoros. Agrāk tomēr bija atšķirība tos kodējot katru pēc tehniskām iespējām: lampiņas, rezistori, 8-bitu korejiešu procesora shēmiņa. Cik man zināms, piemēroja tādus šaha assemblera kodus kā Sargon un Colossus, kuru te lapā var pamēģināt.
Par mobilo ierīču šahu
Šahs mobilajā telefonā ir vājāks par šahu uz stacionārā datora vai laptopa, jo iekārtai ir ierobežotas skaitļošanas iespējas. Ha ha, cik rupji:) Relatīvi protams. Tā bija un būs, bet apspēlēt mobilo nu jau arī vairs nevar. No programmētāja viedokļa, mobilos var sadalīt tā: androidi (Google Android SDK, java), iphones (jālieto Apple SDK), Windows mobiles (Microsoft Visual Studio). Nekas jauns tur būt nevar, visādi around wrapperi un toolchaini, lai apk taisītu no kāda Unity. Android šobrīd ir stipri tirgus līderis. Android aplikācijas ir java, lai arī nav nekāds C++. Javisti nekur nepazūd:) Tātad mobilajos šaha programmas ir vairāk GUI, nu un labs java dzinis.
Vēsturiski, pirms viedajām ierīcēm starpposmos bija visādi PocketPC, tam arī šaha programma pocketgrandmaster. Arī Palm datoriem bija Chess Tiger. Nu un javaME laikmetā bija .jar failiņi Symbian OS priekš vecām nokijām, java šahs tātad, var atrast te lapā.
Tātad tagad visur androīds un arī vecās java programmas lieliski tajā iederās, kā OliThink, vai Jester, lai arī sākotnēji tās bija paredzētas konsolē un appletā.
Spēcīga java chessgenius ,arī shredderchess. Būšu uzmanīgs ar ieteikumiem, bet simpātiska liekas DroidFish, kura ir stipra 64-bitu maģisko bitboardu bāzēta, atvērtā koda .java programma, minimāls .apk lejuplādei. Tagad ir daudz šaha programmu mobilajiem. Jebkurā gadījumā, tādos serveros kā FICS un portālos kā chess.com ir visas iespējas iegūt atbilstošo programmu mobilajam telefonam spēlei tiešsaistē.
Planšetu iekārtas ir kā jaudīgāki mobilie mapītes izmērā, tomēr vājāki par dotoriem un par samērā augstu cenu. Programmas tām izstrādā gandrīz kā priekš mobiliem. Piebildīšu, ka stipru šaha programmu radītāji acīmredzot no tā visa ir tālu, zinātne turās pie daudzprocesoru stacionārajiem. Nu un, kā jaunums, jau strīminga platformām un mākoņiem, bet par to zemāk:).
Par šaha programmu dažādību - platformas, valodas, veidi
Nopietnās šaha programmas Windows vienmēr bija .exe aplikācijas - pārsvarā bija C līmenī taisītas programmas. Vai kādā Borland paveidā kā C,pascal. Bija diskos (vai disketēs) pērkamas un nopietni instalējamas. Varēja ko dabūt lejuplādei arī. Bija 3D arī, atceros Chess Titans jau pašā Windows Vista, vai stiprais Chessmaster 10th. Vai Fricis.
Kādreiz liels izaicinājums bija šahu "aiznest" līdz parastajam datora lietotājam, kurš neinstalē programmatūru, bet labprāt sērfo internetā. Tātad pārlūkiem bija pieinstalējami plugin rīki, kuros šaha kalkulācijas bija iespējamas. Javascript tolaik vispār bija vājš palīgs weblapai.
Ilgus gadus visa grafika web-lapās balstījās uz Adobes flash. Kurš gan nezin flash spēlītes?! Tagad tas viss ir vēsture, kopš viedo ierīču ražotāji pieprasīja mazāk resursus slogojošus risinājumus, attīstījās video streaming un flaši pazuda nebūtībā. Lai nu kā, mazas norādes atstāšu. ActionScript(AS3) valodā (Adobe flash, jeb vienkārši "flex"), varēja taisīt 32-bitu šahu. Varu ieteikt lapu te, un arī bija tāds flashChess3, kuru webā var atrast. Java šaha aprēķiniem, protams, ir daudz ātrāka un piemērotāka. Žēl, flash spēlītes bija foršas.
Tāpat bija java applet plugini pārlūkiem (wiki). Tajās bija arī šahs, ko varēja web-lapā spēlēt. Diemžēl tas viss beidzās. Bet programmas palika, tās iespējams var atrast.
Savukārt Microsoft arī smagi aptaisījās(citu vārdu nevaru atrast) ar savu Silverlight(wiki) tehnoloģiju. Sāka labi, bet pārtrauca. Silverlight bija jāinstalē kā plugin. Programmas .cs (C#), kas ir samērā ātrs un 64-bitu. Labi piemērots šaha programmēšanai.
Lai nerastos jautājumi, .exe (C,C++,arī C#), protams ir pati labākā programmēšanas valoda un rezultāts šaha dzinim, t.i. ņemiet MS Studio Express, un uz priekšu. Var ļoti labi arī GCC, spēcīgs C. Un, protams, ir arī citi C kompilatori. Visual Basic būs daudz lēnāk (vai nepiemērotāk). Nu tā.
Par python un Lua runājot, šīs divas valodas nemaz nevajadzētu noniecināt, lai arī šaha dzinim īsti nederēs. Python interpretators plaši tiek lietots grafikas programmās, jo tam ir pietiekami ātrdarbīgas matemātiskās funkcijas (teiksim, pietiekoši). Lua savukārt ir plašu popularitāti ieguvusi skriptu valoda video spēļu programmēšanā (nu ļoti ērta un to ātrumu vajag nosacīti). Lai arī šaha dziņa gadījumā to pielietošana ir apšaubāma, toties 3D funkcionalitāti tās var nodrošināt pilnā mērā. Un ir arī eksperimentāli šaha dziņi priekš python un lua.
Androidu aplikācijas tagad taisa tik daudzi, ka vairs neinteresanti. Stiprs šahs sanāk, bet ne kompju sacīkstēm. Protams. Bet java ir samērā ātra, tiešām.
Kopš attīstījies WebAssembly (wiki), web lapās stiprs šahs vairs nevar būt problēma nekādās jaunās ierīcēs. Emscripteņi arī pieejami. Uz priekšu!
Te ir daži interesanti linki:
Te var uzspēlēt pret datoru chess.com, kā arī shredderchess var uzreiz uzspēlēt un zaudēt web-lapā, t.i. tur ir kārtīga programma pieslēgta caur pieprasījumiem.
Webassembly un jsAsm kompilēts stockfish uz lichess.org darbībā, var pozīcijas novērtēt.
No sērijas „Kur šahists ar savu prasmi ir lieks un cīnās tikai programmas”.Var taisīt savu dzini un piedalīties.
Katru gadu dažādās pilsētās notiek šaha programmām organizēti turnīri (kas arī nosaka to savstarpējos reitingus) un zināmākie ir CEGT, ICGA, CCRL, WBEC, SSDF. Ir arī entuziastu web-lapas.
Šeit labi apkopojumi dažādiem reģistrētiem dziņiem: superchessengine.com, UCI engines, List of engines.
Android chess apskats, kā arī mobilo šahu tops no chess.com.
Atstāju adresīti, kura tāpat nedarbosies appleta java chess.
Diezgan labi spēlē uz javascript nokompilēts stockfish (GitHubs). Šahistiem arī noderīga lapa. Tas veikts ar Emscripten, kas ir C koda kompilēšana uz JS, bet tā nav gluži "tīrākā" portēšana, lai gan rezultāts spēlē visai labi. Līdzīgs projektiņš ir adresē gwt-svg-chess (apraksts). Lietojot Google Web Toolkit (GWT) rīkus, autors pārveidojis java-bāzētu šaha dzini uz javascript-bāzētu. Tagad gan ir WebAssembly risinājums, piemērs.
Visual Basic valodā uzrakstīts kods Migoya Chess.
Interesanti, ka šaha programmas rakstītas pat tādās senās biznesa programmēšanas valodās, kā FORTRAN un COBOL (publikācija).
Pārskatāmas programmiņas piemērs redzams arī Qbasic valodā no DOS laikiem (var arī lejupielādējot QB64 beisika piemērus). Kā arī viena Turbo Pascal valodā rakstīta šaha programmiņa.
Ja vienkārši jāapskata saglabātu partiju pozīciju fails (pgn) pgnviewer.
Te lapā var uzģenerēt šaha pozīcijas diagrammu, vai šajā.
Nedaudz novecojis, bet darbojas chesspublishing.com.
365chess.com ir laba partiju online datubāze, kurā var atrast arī aktuālākās partijas, kā arī senās klasikas. Laba meklēšana un apskate pārlūkā. Laba alternatīva Chessbase, tikai bez maksas.
SCID ir labs open rīks .pgn partiju apskatei - analīzei.
Nu un te sens saraksts ar šaha programmām, un arī labs apkopojums gatavām šaha programmām, vai šis brīvi iegūstamu programmu katalogs.
Atklāju visai labu avotu šaha programmu iegūšanai adresē filetransit.com, kur meklēšanā jāuzdod vārds "chess". Lejupielādes, apraksti un liela brīvo programmu dažādība.
Daži izdevušies portāliņi par šaha tēmu: worldchesslinks.net, chessgames.com, chess.com (ja kas,spēcīgs portāls: spēlēšana, lejupielādes, rubrikas, forums, t.i.visai nopietns darbs notiek), chessdom.com, chessok.com, chessvibes.com, chesscafe.com, lichess.org, gameknot.com.
Vairāk informatīvi šaha spēlētājiem: fide.com, Latvijā chess.lv.
Šaha datorprogrammu wiki.
TWIC šaha nedēļas žurnāls: theweekinchess.com, kurā ir praktiski visu aktuālo turnīru informācija: oficiālās lapas, dalībnieki, rezultāti, partijas, utt.
Visu galveno šaha turnīru rezultāti ir atrodami tam speciāli radītā adresē: chess-results.com, kā arī iespējams atrast šo to par notikušiem turnīriem.
Publicēšanai internetā lieti var noderēt šaha unikodu simboli (wiki):♔♕♖♗♘♙♚♛♜♝♞♟.
Kā arī šaha figūras .svg formātā un true type šaha fonti.
Par tiešsaistes šaha serveriem (online chess servers)
Internetā, protams, ir daudz programmu un serveru, tomēr tos var iedalīt pēc stila, popularitātes, dalības maksas, nu un uzstādāmās programmas veida. Var doties uz chess.com, bet nobērs ar reklāmām un noparazitēs kā weblapas apmeklētāju lohu, lai gan ir tulkošana un daudz kas. Cits moderns ir chess24.com. Nu un lichess.org esot populārs. Liels sens un zināms bezmaksas serveris ir adresē freechess.org, evolucionē lēnām līdzi laikam. Par maksu ir chessclub.com, playchess.com (varbūt free) , chessworld.net, arī caissa.com. Vēl raksturīgi, ka prasmīgi šaha spēlētāji izvairās no nepopulāriem serveriem, t.i. viņu skaits tomēr ir galīgs. Ieteicams lietot kārtīgu aplikāciju, nevis java, jo tās ir zināmas priekšrocības ātrumā. Protams, būtisks ir interneta pastāvīgums, citādi muļķīgi zaudējumi garantēti.
Telnet serveros tiek izmantoti arī spēlētāji-roboti (pieslēgts kāds dzinis caur interfeisu). Tieši tā daudzi arī testē savus šaha dziņus un pārbauda tos vienu pret otru :).
Vēsturiski, liels šaha spēlētāju skaits ir FICS un ICC serveros un tie arī ir visvecākie pat pēc savienojumu konstrukcijas (telnets caur portu 5000).
Serveros jāpiereģistrējas (uz savu e-pastu jāsaņem apstiprinājums un jāpabeidz reģistrācija pēc norādes), atkarībā no programmas: jāmeklē vai jāpiesaka spēles, vai jāiet istabās, jādefinē jauns galdiņš, vai "jāsēžas" pie kāda gaidoša (pievēršam uzmanību pretinieka stipruma reitingam un laika kontrolei). Spēli uzsākot, čatā vēlams uzrakstīt "Hi!" (sveiks :).
Kopš viedajiem mobilajiem, iespējams spēlēšana mainījusies, bet senāk jau pats savienojums bija sasniegums un tāpēc bija sava kultūra. Atceros gambler.ru programmu ar labu šaha galdiņu, bet regulāru offline. Nu tā bija.
Daži vārdi par gājienu datubāzēm (books)
Šaha partiju sākumā, protams, var analizēt pozīcijas un mēģināt darīt labākos gājienus, bet var arī papētīt
statistiku (necensties izdomāt riteni) par visbiežāk spēlētajām atklātnēm un variantiem, tādējādi novēršot
kļūdas un ietaupot laiku jau pašos pirmajos gājienos. Senāk pētot Crafty datubāzi, kas savos ~10Mb satur lielu daudzumu pozīciju binārā veidā,
kļuva skaidrs ieguldītā darba apjoms šāda maza failiņa iegūšanai. Tas nav vienkārši. Var mēģināt
atšifrēt ChessBase datubāzi, tomēr ir vienkāršāki veidi. Ir šaha atklātņu statistika
internetā chessgames, vai chess365.com, chessbase.com. Nu jau ļoti plaši pieejams un nav daudz jāmeklē. Pieļauju, to var lejupielādēt un automatizēti arī apstrādāt, tomēr man izdevās atrast apmēram 5,7miljonu partiju. Veicot metodisku apstrādi, kas prasīja iespaidīgus datorresursus, ieguvu datubāzīti tīra atklātņu teksta ar partiju skaitiem un rezultātiem katram variantam.
Ja apskatam jau gatavus risinājumus, tad praksē pastāv sekojoši atklātņu failu standarti: Polyglot (.bin failiņi), Arena (.abk), un Chessbase/Fritz (.cbk). Var "aiznemties" no kāda cita esoša šaha dziņa.
Ar programmu palīdzību ir radīti daudzi šo failu varianti, itkā savstarpēji savietojami dažādos šaha dziņis, tomēr praksē var izrādīties, ka kautkā nedarbojas un kāds amatieris sakomplektējis. Jāskatās no kurienes fails nācis. Fails pēc būtības ir gājienu datubāze. Tikpat labi var būt pozīciju/novērtējumu datubāzīte.
Polyglot formāta datos (wiki) meklē pozīciju pēc unikāla (nez vai pierādīts) koda, iegūst nākamos gājienus un to "svara novērtējumus" (iepriekš ar programmām aprēķinātus).
Visiem zināmi standarti
Jebkuru šaha pozīciju var aprakstīt FEN pierakstā, kas kļuvis ļoti populārs internetā, kā arī elektroniski saglabājot pozīcijas šaha programmās. Bieži, pielietojot interneta norādē kā parametru FEN pozīcijas kodu, tiek iegūta analīze pozīcijai/diagramma/citi brīnumi, ko piedāvā konkrētā lapa. FEN kodā pirmā daļa apraksta figūras uz galdiņa, sākot no galdiņa augšas uz leju. Melnajiem-mazie burti, baltajiem-lielie. Diagrammai protams pietiek, tomēr, pilnvērtīgas partijas gadījumā ir vēl papildus parametri: kam gājiens, kādas rokādes iespējamas, kuru bandinieku tagad var sist garāmejot, gājienu skaits bez sišanas (pēc 50 var pieprasīt neizšķirtu), partijas gājiens. Nu un šaha dziņi to lieto, lai uzdotu pozīcijas.
Partijas tiek pierakstītas un saglabātas tīri angliski PGN pierakstā un tāda paša paplašinājuma failos .pgn. Gadās vēl arī ChessBase faili .cb* , bet nu tie nav tik vērsti uz atklātā koda pusi :) Šis formāts satur papildus ChessBase iekšējos indeksiņus. Figūru apzīmējumi: bandiniekus neapzīmē nekā, N-zirgs, B-laidnis, R-tornis, Q-dāma, K-karalis. Pārējais itkā viegli saprotams visiem.
Šaha dziņa stiprumu, tāpat kā profesionālu šahistu gadījumā, raksturo ELO reitings. Ja šahistiem tas tiek aprēķināts pēc turnīriem (Rēķina FIDE organizācija), tad datorprogrammu gadījumā tas ir vairāk nosacīts. Vienmēr, kad runājam par šaha programmu, tomēr ir svarīgi uzreiz uzzināt ELO līmeni, uz kuru tas pretendē (Stockfish ~3548, Crafty ~2732, mans javascript garadarbs ~500).
Atklātnes ir sanumurētas un tām ir piešķirti ECO kodi (A00-E99), vai šeit.
Pozīciju analīzēs (anotācijās), bieži komentāru veidā parādās pozīciju novērtējums (PGN tekstos simbols $). NAG kods norāda uz pozīcijas vērtējumu pēc saraksta. Agrāk vērtēja šaha meistari, tagad kalkulē kompis. Anotācijas veidojot, parasti fonā darbojas kāds šaha dzinis, kas veic arī vērtēšanu.
Šahs kā uzdevums programmētājam
Ja pietrūkst šaha prakses, bet nav jau arī daudz jāprot.
Galdiņš 8x8, tumšais lauciņš sākot no A1, figūru gājieni un sākuma pozīcija - wikipēdijā labi aprakstīts, tāpat arī noteikumi. Sadaļa latviešu valodā.
Nianses(!), kas jāapskata, programmējot šahu pēc pareiziem šaha noteikumiem:
-bandinieka sitiens garāmejot (wikipēdijā En_passant aprakstīts), kā arī 2 lauciņu gājieni. Pārējās figūras iet visus savus iespējamos gājienus visos virzienos.
-ja karalis vai attiecīgais tornis ir izkustējies, rokāde vairāk šajā partijā nesanāk;
-rokāde šaha brīdī nesanāk, vai ja karalim jālec pāri apdraudētam lauciņam, vai jānonāk zem šaha;
-bandiniekam ieejot dāmā, tiek uzlikta figūra - dāma/tornis/laidnis/zirgs (var sanākt arī 2 melnās dāmas uz galdiņa, piemēram);
-ja ir šahs un to neizdodas novērst, tad ir mats (programmējot šī sadaļa ir specifiska, jo nevar vienkārši to ignorēt) un spēle beidzas (angl. white wins/black wins);
-ja nevaram vispār paiet un nav ne šahs (angl.check), ne mats (angl.checkmate), tad ir pats (angl.stalemate) un spēle beidzas, t.i. neizšķirts (angl.draw);
-ja pozīcija atkārtojas 3 reizes, tad ir neizšķirts un spēle beidzas;
-ja 50 gājienus nav nokauta neviena figūra, tad ir neizšķirts.
Cilvēciskos faktorus kā "pieskāries-jāiet", "velkam spēli mīcoties", neizšķirta piedāvāšanu, emocionālu padošanos - neapskatam.
Šaha pulksteņi arī varētu būt nākamais solis.
Rēķinot iespējamos figūru gājienus, jāņem vērā, ka lēkt pāri figūrām var vienīgi zirgs un kāpt virsū savām figūrām nedrīkst, turklāt sevišķs gadījums ir rokāde.
Tā īsumā viss pārējais ir atļauts un uzdevums nodefinēts.
Jaunākie šaha virzieni
Tas, ka šaha uzdevumus nu jau labāk risina programmas, radījis šahistos vēlmi attīstīt jaunus kreatīvākus virzienus. Ir visādas idejas, kā piemēram, jauns figūras veids uz galdiņa, vai nestandarta lieluma galdiņi, vai cits figūru izvietojums sākumā, vai vispār šaha galdi trijstūra vai sešstūra formās. Visveiksmīgākā ideja ir Fischer Random Chess (jeb Chess960). Tā jūtami gūst popularitāti un pat šaha programmas sāk tam piemēroties. chess960.net var iepazīties ar to, bet pamatā ir 960 iespējamas sākuma pozīcijas ar mainītu smago figūru izvietojumu. Protams, nu jau tā īsti sagatavoties partijai, samācoties atklātnes, sanāk visai grūti. Visnejēdzīgākā lieta ir rokāde, bet nu diemžēl šeit to nav vēl aizlieguši (mans imho). Piebildīšu, ka notiek pat turnīri un vairāki šahisti tiešām sāk pievērsties šim virzienam kā hobijam.
Ko pilnveido šaha dziņos
Šaha dziņu programmēšanā pēdējos gados svarīgākais:
1) Liela apjoma dati ar iepriekš izrēķinātiem labākiem gājieniem (spēles beigās ceļš līdz matam jo sevišķi (EGTB,Gaviota tablebases)). Pēdējā laikā Syzygy. Kā redzams, dator-izvirtības sit augstu vilni, 64 terrabaiti atmiņas un 2000 terrabaiti cietā diska jau tāds nieks vien ir.
2) Nu jau gandrīz katrs jaunais dzinis izmanto int64 skaitļus bitboard reprezentācijai, vairs ar int32 neaprobežojas.
3) Tagad visi (citādāk vairs nav nopietni sacīkstēm) izmanto "magic bitboards",t.i.ir liels daudzums iepriekš saskaitītu skaitļu masīvu, jo tas darbojas ātrāk un atmiņas vai diska vieta vairs nav problēma - milzīgs lietderības koeficients.
4) Daudzplatformu kompilācijas (Windows, Linux, Mac, protams apgrieztās versijās iOS (Apple ipad un iphone) un Android) gandrīz visiem zināmiem stipriem dziņiem.
5) Multiplūsmu kalkulācijas (threads) - reāli atmiņā sēž vairākas dziņa kopijas. Procesoriem ir daudzas cores, bet load balanceri vienmēr ir problēma - var atšķirīgi noslogoties un dot nepilnus rezultātus, vai bremzēt viens otru. Vienkāršākā gadījumā nākamos gājienus vienmērīgi sadala pa procesoriem un tie rēķina. Problēmas ir komunicēties starp thread-iem, bet ja minimāli, tad nekas. Senākos laikos bija viens procesors un algoritms arī bija vienkāršāks. Un pastāv arī uzskats, ka procesoru noslodzes regulēšanu labāk varētu atstāt pašas sistēmas pārziņā.
Neaizmirsīšu stāstus par mainfreimiem, kur visi uzdeva procesus, ar kuriem lielais netika galā. Tāpēc bija ieviestas prioritātes, bet beigās tāpat globāls restarts, lai rindu izdzēstu un visu visu izmestu lielā atdzīvināšanai :) Varbūt tāpēc tik tizla tā thread-u programmēšana - lai daudz nelietotu.
6) Kas attiecas uz programmēšanas valodām, tad C vietā vairāk tiek lietots C++ (.cpp), nekādas vairāk izmaiņas reāli pielietojamās valodās nav. Piezīmēšu, ka arī programmu kodi sirgst ar novecošanu, jo vienā brīdī paši dziņu izstrādātāji tos pārraksta no jauna.
7) Var taisīt savas virtuālās mašīnas mākonī kādā AWS, vai MS Azure, vai GCloud ar augstiem procesoru parametriem un rēķināt šahu pēc patikas. Par naudiņām protams. Nu un tagad plaši tiek piedāvāts šahs mobilajām iekārtām un planšetēm, tur vairs limitu nav. Un pat viens youtube sižets par tēmu.
8) Ir vēl tādas mazas kpk-tabulas, t.i. kad palicis karalis pret karali un bandinieku, tad 12Kb failā apskatās risinājumu.
9) Vietām SSE2 instrukciju lietošana. Jaunākiem procesoriem ir klāt nākušas operācijas, kas manipulē ar papildus reģistriem (vienā darbībā). Tādējādi ir ieviests 128 bitu skaitļa tips (__m128i). Praksē redzēju paātrinātu datu masīvu kopēšanu (divus int64 uzreiz). Grafikā tos lieto vektoru aritmētikā. Vēsturiski no MMX laikiem paplašinātie mašīnkoda operatori dod paātrinātu skaitļošanu.
10) 64-bitu Windows būtiska atšķirība, nokompilējot C kodu, ir pointeru adresācija. Agrāk datus apstrādāja "tuvumā" datu segmentā (max 4Gb), bet tagad milzīgā atmiņas masīvā ar adresi 64 bitos. Tāla adresācija nebūt nav optimāla maksimālai ātrdarbībai. Tad nu jādomā kā optimālāk organizēt mainīgos un atmiņas buferus.
11) Kā jaunākie virzieni, TPU tensor processing unit fermas var nodarboties ar neurālo tīklu pašizglītošanu, t.i. kalkulēt pozīcijas. Tas jau ir līmenī, kad šahu spēlē stipri, bet gribās vēl vairāk.
12) GPU rēķina ļoti ātri un paraleli. Tam var uzdot uzdevumus. Domāts grafikai, bet lieto kā slotu kam pagadās.
Hash tabulas
Hash ideja ir nerēķināt to, kas jau vienreiz izrēķināts. Hash tabulas parasti uzglabā pozīcijas un to novērtējumus. Parasti, startējot šaha dzini, tiek rezervēta ievērojama vieta atmiņā (ar malloc()) daudzu megabatu apjomā šaha pozīciju/to novērtējumu/nākamo variantu/u.c. uzglabāšanai. Tā dara praktiski visi nopietnie šaha dziņi. Tas, protams, dod milzīgas iespējas darboties ar jau aprēķinātu un saglabātu informāciju, tomēr būtiski padara programmu nepārvietojamu uz citām vidēm/programmēšanas valodām/iekārtām, kur nav šādu milzīgu atmiņas pārvaldīšanas iespēju. Klasiski būtu informāciju glabāt mainīgajos/masīvos/objektos, bet ne caur norādēm kaut kur dziļi sistēmas piešķirtos atmiņas apgabalos.
Bieži hash atslēga ir identiska polyglot .bin atklātņu atslēgas formātam, t.i. tiek izmantots tas pats daudzu xor() algoritms, kas iegūst 64-bitu skaitli, atspoguļojošu tekošo pozīcīciju. Ja FEN ir tekstuāls pozīcijas pieraksts, tad hash atslēga ir skaitlis pozīcijai.
Kad programmā tiek izsaukta funkcija, tā arī rezervē sev apgabalu privātiem mainīgiem. Ar to gribēju norādīt būtisku atšķirību šaha programmu uzbūvēs, ko nevar uzreiz pamanīt. Turklāt, analizējot šaha programmas un to klonus, kļūst redzama gandrīz vai viena un tā paša koda izmantošana ar minimālām atšķirībām (jo sevišķi tādas kā "hash.c").
Programmējot jāuzmanās, lai kolīzijas (maz atmiņas) un aprēķinu sarežģītība neradītu palēninājumu, jo bez hash var arī iztikt.
3D programmēšamas iespējas
Tiem, kas vēlas reāli veikt trīsdimensiju programmēšanu, iesaku lejupielādēt rīku Unity3D, vai smagāks UDK. Tas gan nav domāts tieši šaha dziņu programmēšanai. Nu ir arī daudz citas opcijas. Jāsaka, tagad ļoti smukus 3D šaha galdiņus programmās taisa, arī mobilajiem. Internetā var apskatīt un izvēlēties. Šahisti gan ir pieticīgi un pieraduši pie 2D. Un nepatīkami ir zaudēt, vienalga vai 2D vai 3D galdiņš :)
Mata meklētāji, jeb "checkmate solvers"
Labi spēlējošs algoritms meklē gājienus selektīvi, vērtējot pozīcijas (daudz kalkulāciju). Tas ir lieki, ja, piemēram, jāatrod mats 22 gājienos (pozīcija). Spēcīga šaha programma izvēlēsies stabilāko gājienu, bet pat neapskatīs figūru upurus, kuri (maz iespējams), noved pie forsētas uzvaras veiksmīgas apstākļu sakritības rezultātā. Internetā pieejams ChestUCI projekts šaha problēmu risināšanai, tomēr šī programma ir veca un, piemēram, Fritz var uzdot meklēt matu. Šī tēma būtībā ir saistīta ar šaha problēmu kompozīcijām (wiki). Protams, arī šeit tiek izmantotas jau zināmu pozīciju datubāzes. Parasti uzdevumos, kur jāatrod mats dažos gājienos, risinājuma variantā gandrīz katrā gājienā tiek uzbrukts karalim (šahs vai tuvu tam). Praktiski visi stiprie dziņi matu atrod vispirms, jo tas algoritmos ir prioritatīvi un neprasa lielas pārlases. Tomēr, ja risinājums prasa viltīgus manevrus, algoritmam nepieciešama vai nu intuīcija, vai pilnāka un dziļāka pārlase. Sanāk, ka parastām šaha programmām uzdevums tomēr ir nedaudz cits.
Uzģenerēti M1,M2,M3, arī daži M4, un programma atrodas šeit, tomēr M5 reālā laikā atrast šis kods jau nespēj.
Šaha blogi
Jebkurš sevi cienošs profesionālis šajos laikos var izveidot savu blogu, piemēram ar Blogger. Agrāk tomēr tas prasīja ievērojamas datorzināšanas, šobrīd tas ir kļuvis ļoti vienkārši. Tādējādi internetā parādās vairāk un vairāk šahistu blogi, kas interesanti tieši profesionāļu skatījumā.
Daži piemēri: susanpolgar.blogspot.com (vai A,B,C, D, nedaudz nopietnāks izpildījums: E,F un daudzi citi). Par šahistiem diezgan daudz informācijas var atrast wikipēdijā, sociālajos portālos, viņu oficiālajās lapās, protams googlē un bing. Šaha partijas attēlojums simpātisks šajā blogā. Pārskatāms, jebkurai pārlūkprogrammai un visiem datoram visos blogos lietojams (bez java vai flash). Labs programmētāja darbs. Ir piestrādāts arī pie variantu apskates anotācijās un komentāros. Bezmaksas, ja negrib komerciāli pelnīt.
Šobrīd jau nopietnos šaha turnīros tiek organizēta šaha partiju attēlošana tiešsaistē, t.i. šaha galdiņi ir saistīti ar datorsistēmām. Nu dārgi tie risinājumi. Tas turnīru organizētājiem nav lēti un šeit ir sava veida divu firmu monopols Monroi un DGT. Ir parādījies tāds ChessNoter, bet skaitās šmaukšanās iespēju iekārta, t.i.nobanots. Blogeriem piekļuve tiešsaistē ir visai ierobežota un partijas jāsalasa no turnīru mājaslapām, vai Chessbase, vai lieliem šaha portāliem kā chess-results.com. Ir tāds chessbomb.com, kur diezgan dzīvā režīmā var apskatīt turnīru partijas. Katram turnīram web lapā ir norāde kur skatīties "chess games live". Gan jau chess.com arī var.
Minimālā koda šaha programmas
Protams, stipra šaha programma ir visai niansēta un jebkuras tās kods ir visai ievērojams baitu ziņā. To izstrādātāji gadu no gada atrod kautko uzlabojamu un izlabojamu, tādējādi īsts projekts sanāk visai izstiepts pa gadiem un ļoti, ļoti kvalitatīvā kodā, t.i. katrs simbols ir rūpīgi pārdomāts.
Taču pastāv arī neliela sacensība nevis programmas stiprumā, bet gan tās īsumā (šedevrs-īss, liekvārdība kaitē). Protams, pirmās šaha programmas mašīnkodā var uzskatīt par īsa koda programmām, tomēr tās ir pārāk nepārskatāmas. Vislabāk tam piemērots C-kods. Vispār diezgan "matemātiski" sanāk šie dziņi. Tomēr piezīmēšu, ka viņiem raksturīgi reizēm neiespējami gājieni, muļķīgas pata situācijas, nespēja kalkulēt kombinācijas. Bet nu tā itkā darbojas un spēlē šahu.
Internetā atrodami sekojoši piemēri: Micro-Max šaha dzinis (wiki), Toledo nanochess šaha dzinis, no iepriekš minētiem: p4wn, microchess, ZX-81 in 1K.
Šaha programmu portēšana uz citām programmēšanas valodām
Protams, eksistē daudz uz citām programmēšanas valodām pārrakstītu un pielāgotu šaha programmu. Var apgalvot, ka visi šaha dziņi ir atvasināti viens no otra, tur grūti ko jaunu izdomāt. Tomēr šeit var rasties nepārvaramas grūtības, kas visu projektu iedzīs strupceļā. Kā būtiskākā ir 64-bitu atbalsts. Ja valoda neatbalsta (piem. javascript, actionscript, lua), tad algoritmā operators 1<<63 vienkārši dos kļūdainu rezultātu. Otra būtiska problēma ir atmiņas izmantošana (masīvi vs malloc). Kā trešo minēšu C++ funkciju setjmp-longjmp, kas ir tāds kā "goto". Tā parādās search iterācijās, lai burtiski "atsviestu" atpakaļ uz sākumu (vai piņķerīgi to aizvietot). Visbeidzot ātrdarbība ir ļoti būtiska. Algoritms var izrādīties par smagu miljoniem pozīciju pārlasei. No otras puses, datori kļūst jaudīgi, valodas mainās, var arī izdoties.
Attīstības vīzija
Izskatās, ka šaha programmas būs vairāk kā look-up terrabaitu datubāzēs no izsvaidītām daļām kādā NVIDIA vai Googles neurālā tīklā. Nu tak saskaitļos visu gandrīz līdz galotnei un šahu varēs pa tabulām meklēt. Savs foršums, savs trulums, ka negribēsies neko kreatīvu.
Ja esat iepirkuši labu videokarti, vai kādu bankrotējušu kriptovalūtas fermu ar daudzām videokartēm, tad zināšanai GPU var veikt matemātiskās darbības paraleli ļoti ātri. Datu pārsūtīšana pat būs ilgāka kā kalkulācija, tas paveicams pat ar python rīkiem. Tātad nebūs jēgas mocīt vienīgo CPU. Datorarhitektūra arī mainījusies, trula dārgas deficītas elektronikas izmantošana šobrīd fermās. Nu tā liekas 2021.g.