今日のプログラムいじり(将棋ベーシック改の次の名前なんにしよ)

朝からやる気を出して将棋ベーシック改のソースコードと格闘していた。

まずビットボードをビジュアルベーシックで本当に実現できるのか。

そのへんの検討で今のコンピュータは64ビットなので将棋盤81ビットを作るには整数型ふたつをつなげることとなる。そして主にビットボードで計算が縮むのはGenerateMovesつまり手生成。合法手生成とでも言おうか。3手読みというと語弊があるので正確に書くと、今の局面で指せる全ての合法手をまずメモリに全羅列し、1手進めてその局面での相手の全ての合法手、さらにそれに対する自分の全ての合法手まで探索深度3手進めたら1手ずつ巻き戻して次の手を読む。短いときで10万手、多い時は800の3乗つまり5億手くらい探索する。秒間10万手くらいなので、5億手になると数分かかる。だいたい、手駒が増えると盤面の何処にも置けて相手もそうしてそこからさらに枝が伸びる。たまに計算が返ってこないのかと思うくらい長いのはそういう事だ。まあバグっている可能性もある。トレースで人力で全ての手を追いかけることは現実的でないので。

そして、手生成で空きマスを数えているのは1箇所なのだが、探索深度3であることから反復的に呼ばれるので、ビットボードを実装するともしかしたら1割ほど計算が縮むかも。計算量計算をすると何だよ1割かよと思うわけだ。それを簡単に実現できるならやりたいが、VBの機能でどこまで出来るか、自分の実装でどこまで、期間的に数分で片付くか何日もかかるかなど。

それなら飛車、角。香車などの飛び利きも縮まないかとコードを読み直すのだが、これも一筋縄ではいかない。上には上のプログラマがいるとはいえ、俺もまあその道で食ってきたのでロジック的に無駄のあるコードは書いていない。だが、掛け算にかかる時間と足し算にかかる時間の違いなど、CPUのハードウェアの問題とソースコードコンパイルされて機械語でどう解決されるかみたいな問題まで突っ込んで、少しでも計算を早くしたいとなったら、もっと度肝を抜かれるような手法は存在する。そういう勉強をすると、ついに憧れのゲーム機用プログラマに1歩近づいたなと思う。俺のプログラミングはウインドウズ95以降のハイスペックマシンで力技的に解決している部分が残っているからだ。

計算量計算を真面目に考えると、計算部分の最適化より局面進行を差分に変えるのが効果的に思えるが、そのためにはデータ構造から作り直す必要がありそうだ。

そうこうしている間に午前が過ぎ、昼飯にカップ麺とレンジのご飯にふりかけをかけて食べて、考え疲れたのでゲームでもしようかと思ったがそれもする気にならず、朝の情報番組で昨日の音楽番組のダイジェストと宮本浩次のカバーアルバムを聴いたのを思い出して、リッツクラッカーを食って近所の自販機まで歩いてコーラを買いに行き、それを飲んだらこんな時間(16時35分)なのである。

いま将棋について考える頭がハイで乗っているので、他のゲームを遊んでそれを忘れたくないのだ。だが、よく考えると毎朝の精神安定薬を飲み忘れていたので、単に病気かもしれない。

俺がブログにハマるのもプログラミングは進めても同じことをもっと上手くやるために巻き戻す作業がけっこう発生するからだ。だがまあ、名文を書く作家もたぶん発表のために多くの未発表部分を隠すのであろうな。

いじりだして立ち行かなくなったソースコードを朝の分まで巻き戻し、つまるところ今日の進捗はリッツを食ってコーラを飲んだだけである。


🄫1999-2023 id:karmen