パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

mini shogiとdice shogiの将棋AIを世界4位と世界2位に育ててみた話

2024-04-28 | CodinGame

たまにはコーディングしておかないとなまってしまうので

dice shogiとmini shogiとを強くしてみる

現在の順位は4位と7位

 

<dice shogi>

 

これまでの設計

角と飛車の複数範囲の効きを無視する

歩と銀の成り駒を入力時点で金に変換する

持ち駒情報を一切利用しない という豪快な設計が特徴

 

3時間ほどで簡易詰めルーチンの実装ぐらいも目指し

diceshogi世界2位を目標にする

 

他にも

駒の効きもいくつ効いているかではなく効きがあるかないかという集合型での実装

コードを詰めまくって拡張しにくい

 

過去の自分もう将棋等のルーチン作り飽きていて

斜め上のコーディングばかりしている

 

とりあえず集合型をいったん外しておいて

内包表記とかをバラシて

飛車角の効きをループ使って正確にする

 

王手判定

王手をかけた駒にほかの駒の効きがあってかつそこに相手の王以外の効きがないときを判定する

王の逃げられる範囲すべてにこちらの効きがある時を簡易詰みと判定させる

 

一間龍のような詰みは判別できない

 

TVerで肝臓を奪われた妻などをみたりしながら

3時間半ぐらいたったので挑戦

目標の世界2位に到達

 

対局を確認してみると詰みの判別が少しおかしい

調べてみると歩の効きがおかしい

 

結論 先手と後手の駒の動きを逆にしていたことが判明

 

駒の移動に関してサーバーから有効手の中から選んでいたのでなんとか動いていた

飛車、角、龍、馬、王は逆でも同じだったのでそれでも評価値もそこそこ問題なかったようである

 

<mini shogi>

 

これまでの設計

角と飛車の複数範囲の効きを無視するという...

 

こちらの上位者は詰将棋までやっていそうで相手言語はC++

3位は無理そうなので4位を目指すことにする

 

もともとコピッて作っていたので

案の定 先手と後手の駒の動きを逆にしていたことが判明

 

詰み判定を同様に...

こちらはチェック判定が入っていた しかし実装はなんか無駄に長く

今回作った方がすっきりしていたので最後に置き換え

 

投入してみると5位

4位の人とのさしの勝負では勝っているが上位と当たりすぎたのが遠因

 

対局を確認してみると角が馬にならない

駒が成る手を評価全くしていない

 

そこだけ手直しして

目標の世界4位に到達

 

さてTVerでアンチヒーローみよっと


最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。