noobLue / ShakkiAly

MIT License
0 stars 0 forks source link

Koodikatselmointi #3

Open tykkipeli opened 4 years ago

tykkipeli commented 4 years ago

Hyvää työtä. Koodi näyttää oikein siistiltä ja hyvin kommentoidulta. Testejäkin on kohtuullisesti.

ArvoSiirto-nimi luokalle on ehkä vähän harhaanjohtava. Siitä tulee mieleen, että siirto arvottaisiin.

Transpositiotaulun avulla hakua voitaisiin tehostaa. Tällä hetkellä minmax-algoritmi voi päätyä laskemaan saman position arvon moneen kertaan sillä sama positio voidaan saavuttaa eri siirtosarjojen kautta. Algoritmi tehostuu, jos minmax-algoritmin alussa aina tarkistetaan onko position arvo jo laskettu.

Sellainen asia, joka voisi nopeuttaa koodin vakiokertoimia, olisi käyttää koko ajan samaa lautaa minmax-algoritmin aikana. Tällä hetkellä joka siirtoa varten rakenntaan kokonaan uusi lauta uutta siirtoa varten. Sen sijaan siirto voitaisiin tehdä jo olemassa olevalla laudalla, sitten kutsuttaisiin rekursiivisesti minmax-algoritmia ja kutsun jälkeen tehty siirto peruttaisiin. Tällöin siirron tekemiseen tarvitaan vain pari pientä operaatiota eikä tarvitse kopioida koko lautaa joka kerralla.

Alpha-beta etsinnän kannalta olisi tärkeää, että siirrot järjestettäisiin jonkin järkevän heuristiikan avulla aina ennen siirtojen kokeilemista, jotta haaroja saataisiin karsittua mahdollisimman paljon. Siirtojen järkevällä järjestämisellä on valtava vaikutus alpha-beta etsinnän tehokkuuteen.

minArvo ja maxArvo olisi mahdollista yhdistää yhdeksi metodiksi, mikä säästää koodin toisteisuutta. Tähän kävisi Negamax-algoritmi.

Heuristiikka on shakkiin ehkä vielä aika yksinkertainen. Sitä voisi ehkä vielä parantaa, vaikka toki kieltämättä shakkiin ei ole turhan helppoa keksiä hyviä heuristiikkoja, sillä esim. kuninkaan turvallisuudella on täysin eri merkitys alku- ja loppupelissä.

Jos on aikaa ja mielenkiintoa niin seuraavat kikat tunnetusti toimivat shakissa hyvin: killer-heuristiikka eli jos jokin siirto on paras siirto jossain variaatiossa niin on todennäköistä että se on myös parassiirto jossain toisessa variaatossa. vaihteleva laskenta syvyys: jos juuri tehty siirto esim. lyö jonkin nappulan niin tätä laskentahaaraa kannattaa laskea vielä pikkaisen syvemmälle, sillä monesti vastustaja voi lyödä takaisin ja muuten heuristiikka antaa todella huonon arvion positiosta.