2020-10-22 08:00:00

将棋ソフト開発 Week1 ~ 将棋のコア部分を作る ~

プログラミングの勉強がてらに、将棋ソフト開発をしています。0週目は作るプログラムを方針を作成しましたが、1週目が終わり進捗報告と、やったこと、これから取り組むことについて記載していきたいと思います。 1週目ではリポジトリやパッケージ構成の準備と将棋のコア部分である各駒や盤の実装や、ルールの実装を取り組みました。

目次

進捗報告

一旦ランダムに動くところまで作りました。将棋のプレイを管理するクラスはまだ書いてないのでテストコードで無理やり実装して動かしているだけです。

ちょろっと書いてあるプログラム自体は色々この後いじってるので、後述の解説?とは違うところがあります。

1週目でやったこと

  • 将棋のコア部分の作成
    • パッケージ、リポジトリ構成決め
    • 駒の作成
    • 盤の作成
    • 移動のルールの作成

駒や盤といってもプログラム的に作成してるだけなので、実際に目に見えるものは作っていません。 一応Debugようにコンソール上で表示するようにはしました。

方針の変更

若干方針を変更しまして、拡張性の高いプログラムを作ると言っていましたが、一旦汎用的なものではなく普通の9x9の将棋をわかりやすく作ることにします。 あまりに汎用的なものを作るともはやボードゲームエンジンになってしまうので、ソレは非常に作るのは大変です。まずは動くものを作ることを優先!

パッケージ、リポジトリ構成決め

gradleのマルチプロジェクトにします。 ちなみに言語はJavaを使って書き始めてしまいました。今覚えばKotlinにしておけばよかったと思ってます。 時間があればKotlinで書き直すかもしれません。

3つのプロジェクトを包含していて、それぞれ役割毎に別リポジトリにしています。

  • shogi-presentation-cli
    • プレゼンテーション層
    • 末尾にcliとしているのは一旦コマンドラインでの入出力を作成するため.
    • 今後cliではなくWebAPIのインタフェースなども作る可能性もあるが、このプレゼンテーション層のみ変更すればよいです。
  • shogi-application // アプリケーション(ユースケース)層
  • shogi-core // ドメイン層

この分け方はクリーンアーキテクチャ(Clean Architecture)やオニオンアーキテクチャを意識した分け方にしています。

画像はClean Coder Blog より引用

今の所インフラ層はないですが、今後作るアプリケーションで棋譜保存が必要になるとか、外部との通信が発生するとかとなれば作ればよいです。

現状作るものでcliのアプリを想定して下記のような構成を予定しています。

.
|-- gradle
|   `-- wrapper
|-- shogi-application // submoduleで別リポジトリ, アプリケーション層のコードを格納する
|   |-- gradle
|   |   `-- wrapper
|   `-- src
|       |-- main // アプリケーション層の実装コード
|       |   |-- java
|       |   |   `-- com
|       |   |       `-- naginagisa
|       |   |           `-- shogi
|       |   |               `-- application
|       |   |                   |-- manager
|       |   |                   `-- service
|       |   `-- resources
|       `-- test // アプリケーション層のテストコード
|           `-- java
|               `-- com
|                   `-- naginagisa
|                       `-- shogi
|                           `-- shogiapplication
|-- shogi-core  // submoduleで別リポジトリ, ドメイン層のコードを格納する
|   |-- gradle
|   |   `-- wrapper
|   `-- src // ドメイン層の実装コード
|       |-- main
|       |   `-- java
|       |       `-- com
|       |           `-- naginagisa
|       |               `-- shogi
|       |                   `-- core
|       |                       `-- domain
|       |                           |-- model // ドメインモデル
|       |                           `-- service // ドメインサービス 必要ない場合もある
|       `-- test // テストコード
|           `-- java
|               `-- com
|                   `-- naginagisa
|                       `-- shogi
|                           `-- core
|                               `-- domain 
|                                   |-- model
|                                   `-- service
`-- shogi-presentation-cli // submoduleで別リポジトリ, プレゼンテーション層のコードを格納する
    |-- gradle
    |   `-- wrapper
    `-- src
        |-- main // プレゼンテーション層の実装コード
        |   |-- java
        |   |   `-- com
        |   |       `-- naginagisa
        |   |           `-- shogi
        |   |               `-- shogipresentationcli
        |   |                   |-- presenter
        |   |                   `-- controller
        |   `-- resources
        `-- test // プレゼンテーション層のテストコード
            `-- java
                `-- com
                    `-- naginagisa
                        `-- shogi
                            `-- shogipresentationcli

一旦仮おきで、細かくはもっと分けるかもしれませんし、若干の構成変更はするかもしれません。 ただこの層で分けた、マルチプロジェクトの構成は変わらない予定です。

week1で今作ってるのはshogi-core(ドメイン層)の部分です。 submoduleにしてあるので、実際にはshogi-coreのリポジトリ単体で開発をしていけます。

駒の作成

本プログラムは高速なものを作るつもりは一切ないので、bitboardとかは使いません。コンピュータ将棋は勉強したてであまり良くわかっていませんし。 余談ですが、相当速度は犠牲にしているので、探索や学習で性能が出なくて使い物になないかだけが不安です。

domain.model.piece以下に駒関連のクラスを生成します。

pieceType側(enum)に全てロジック持つこともできそうですが、クラスで分けたほうが素直そうなので今回はクラスで分けてます。

各駒クラスはイミュータブルなものとしています。スレッドセーフになりますし、意図していないところで変更の影響を受けないようにするためです。 毎回オブジェクトを生成するのはコストではありますが、 将棋は81マスで、先手後手と駒の種類があるとして1つのコマあたりたかだか 81*2 で162のオブジェクトの生成で済みます。この程度であれば事前に生成しておく、もしくはキャッシュしておくなどすればそれほどコストはかからないかと思います。

pieceTypeはこんな感じ。 javaの場合はenumの中に振る舞いをかけてしまうのでそっちに各駒のルールなどのロジックを書いてもよいですね。

public enum PieceType {
    FU,
    KYO,
    KEIMA,
    GIN,
    KIN,
    KAKU,
    HISYA,
    TOKIN,
    NARI_KYO,
    NARI_KEI,
    NARI_GIN,
    UMA,
    RYU,
    GYOKU
}

今はクラス内で自分自身が動ける箇所を求めるメソッドを持っています(legalMoveList). 中でさらにメソッドに分けたりはしていますがやっていることは下記のことです

  • 自分の持つ効き(Effect)方向に探索して動ける箇所(Position)を取得
  • 歩は1段目(後手の場合は9段目)には存在できないなどのルール上での動ける箇所(動けない箇所)の取得

最終的に動けるマスは、これらで求めたPositionの集合の積集合や差集合などの集合演算で求めています。 ルールとかも別クラスに切り出したいですが一旦ベタ書きです Effectも将棋はたまたま効きと駒の動きが一緒ではありますが、本来動きと効きは別物だとも考えられるので分けておきたくもあります。チェスとかだと実際に効きと動きが違う駒もありますしね。 とはいえそういう変則将棋をもし作るとなったときに考えれば良いので、一旦効きと移動箇所は一緒のものにしておきます。

効きに関しては次のように定義しています。 enumですが、Javaの場合は振る舞いを持てるので盤上の他の駒を考慮しない効きのPositionのリストを返すpositionListというメソッドをつけています。

各駒クラスの、legalMoveListの実装で1つ気になっているのは王手放置などの反則手を含めるかどうか。 ここでピンや、王手放置などの手を省くもしくは、後述の盤(Board)側で省くのも良いのですが、探索時に次の局面を作ってその局面が合法な局面かどうかを判断するほうが簡単そうな気がします。 っというわけで一旦ここは反則手ありの手を生成するようにしています。 その場合メソッド名は要検討ではありますが.

盤の作成

盤関連のクラス図は次のようにしています

BoardもImmutableにしたいですが、盤には駒を追加していったりするので、一発で生成するのは引数が多くなってしまったり、例えば駒を追加するときに生成側で駒のコレクションを生成したりと大変になってしまいます。 なのでBuilderクラスを用意して生成することにしています。

マス目の表現

Squareはマス目を表します。将棋盤であれば9x9の配列で表しています。 この二次元配列も別クラスに切り分けたほうがよさそうですが一旦、このままで。後々リファクタリングするかも。

持ち駒の表現

CapturedPiecesは持ち駒を表します。 単純Mapで歩が○枚、金が▲枚みたいな感じで持っているだけですね。 持ち駒は打つことができるので、uchiteListメソッドで打つ指し手のリストを返すように実装しています。

ボード上でのすべての指して

すべての指してはlegalMoveListで求めます。 やっていることは、各コマのlegalMoveListメソッドの返り値と、持ち駒のuchiteListをすべてマージしています。

    public List<Move> legalMoveList() {
        List<Move> legalMoveList = new ArrayList<>();
        legalMoveList.addAll(pieceSet(teban).stream().flatMap(p-> p.legalMoveList(this).stream()).collect(Collectors.toList()));
        legalMoveList.addAll(currentCapturedPieces().uchiteList(this));

        return legalMoveList;
    }

pieceSetメソッドは書いてないですが、現在の手番の駒をすべて取得するようなメソッドです。 各駒クラスや、持ち駒クラスにそれぞれの領域での手の生成は任せているので、簡潔にかけます。

moveメソッド

指し手(Move)を作用させた後の盤を返します。 Move自体の説明は後述の指し手の表現を参照してください。 つまり1手指した後の局面を作るメソッドです。

指し手の表現

一旦こうしています。※ダメな実装です

from: 移動元の位置、 to: 移動先の位置, isPut: 駒打ちかどうか putPieceType: 打つ駒の種類 isPromotion: 成るかどうか

駒を打つときはfromはnullになって、 isPutフラグで駒打ちかどうか判断できる。 一見なんとかなりそうですが、 さすがにこのクラスはいろいろ問題点が多いので流石に後で直します。

問題点

  • 呼び出し側でisPutフラグを見て判断しないといけない
  • 駒を打つときはfromがnullになっていることを意識しないといけない。 Optionalなどでチェックを強制できるがあまりよいとは思えない

解決策 駒の移動のアクションと、駒を打つアクションを一緒くたにしてるのが問題な気がします。

といわけで、例えばですが指し手インタフェースを作って、それを実装した駒打ちクラス、駒移動クラスなどと言った形で各アクションごとの実装クラスを分けたほうが良さそうです。

week2で直しておきたい。

やったことのまとめ

全体のクラス図としてはこんな感じになります。 細かい関係の線は複雑になるのであえて省いています。

だいぶ部品は揃ってきたかなーという感じです。

これから取り組むこと

これからweek2で取り組むことについて

  • week1で残した課題の解消
  • 最低限のusiプロトコルの実装

先に探索部分を作ろうかとも思いましたが、さすがにコンソール画面上で将棋動かしているだけではつまらないですし、自分で対局しようにも、コマンド打ちながらというのも大変なので先にUSIプロトコルの実装をすることにしました。

USI(Universal Shogi Interface)プロトコルとは、将棋GUIソフトと思考エンジンが通信をするために、Tord Romstad氏によって考案された通信プロトコルです。USIの原案は、以下で読むことができます。

将棋所:USIプロトコルとは より引用

要は、USIプロトコルを実装すれば、自分で作った将棋ソフトも、将棋所や将棋GUIでエンジンとして登録できるようになるということです。 将棋GUIや将棋所が使えれば、マウスなどGUI操作で自分のソフトを試すことができるのでテストプレイが非常にやりやすく成りますね。

というわけでこちらを優先してweek2は取り組もうと思います。

2020-10-15 01:00:00

将棋ソフト開発 Week0 ~ 将棋アプリ開発始めます ~

コンピュータ将棋の勉強をしていると以前振り返りの記事で書きましたが、理論だけではなく実際に作ってみたいなぁと思いました。 とはいえ勉強していたのはAIの部分でしたので、今回はゼロから将棋アプリを作って行こうと思います。

目次

目的

今回強い将棋ソフトを作ることは目的としません。

今の将棋ソフトがもう強すぎるため、強いソフトを作って自分の将棋の勉強のために使うとかそういうのもあんまりモチベーションにならないので。 また強いソフトを作るための機械学習とかやり始めたら、計算リソースとかも必要なので。

というわけで今回何を目的にするかというと、主に下記を目的とします。

  • プログラミングの勉強
  • 拡張性の高い将棋アプリの作成
    • 変則将棋などもやることがあるので、自分で作れたら便利なため

プログラミングの勉強

今回はプログラミングの勉強を一つの目的として行うため将棋アプリをゼロからスクラッチで作ります。 スクラッチというのは、yaneuraouなど既存のOSSの将棋ソフトがあったりしますが、そういったものは使わずに自分でゼロから開発していきます。

拡張性の高い将棋アプリの作成

将棋系Vtuberとしても活動をしていますが、その中で仲間内でこんな変則将棋やってみたい、といったアイデアが出てくることがあります。 そういった企画をやりやすくするために、拡張性の高い将棋アプリケーションを作ることを目的とします。

方針

UI面の要件はまだ未定です。 まずは将棋のコアとなる部分を作成します。 確認のために最低限自分で対局できるくらいのusiは実装するかもしれません。

UIは未定ですが、コア部分さえ作成すれば、あとからアプリに組み込むこともできますし、サーバで動作させて通信によりブラウザで動作させることも可能なためです。

コア部分の作成には一般的に将棋に必要な機能の他に、AIの思考ルーチンも含めます。

コア部分で作るもの

  • 盤面の表現
  • 合法手生成
  • CPU指して生成

作らないもの

  • 棋譜保存

さいごに

将棋などのボードゲームを作るのは初めてで、うまくできるかわかりませんがとりあえず動くものは作れるようにまではしたいと思います。 進捗に関しては毎週報告できればなーと思います。

2020-10-05 20:00:00

将棋初めて1年 成長した? 変わったことは?

2019年10月から本格的に将棋初めて1年が経ちました。1年でどれだけ成長、強くなったのか、変わったこと、振り返りなどを実体験を踏まえて書きたいと思います。 自分の振り返りとして書き残しておきますが、同じく将棋を始めたての方などの参考になれば幸いです。 棋力アップの勉強以外にもプロ棋士の将棋を見たり、コンピュータ将棋を勉強してみたり、1年で将棋について詳しくなりました。

目次

将棋始めたときの棋力

将棋は子供の頃に親から動かし方は教わって、動き方は知っているというくらいな状態でした。 棋力的には、ハム将棋に時間無制限でめちゃめちゃ考えてなんとか勝てる程度。 将棋ウォーズで5級程度でした。

将棋ウォーズでも5級で達成率が99%にならなくなったので、その程度の実力でした。

勉強量

勉強時間については1日何時間とか、そういう勉強はしていないので正直わかりません。 1日5時間位将棋指してるときもあれば、1週間以上将棋指さないような時期もありました。

そのため、ここではわかる範囲で「解いた詰将棋の数」、「対局数」を参考に書いておきます。

詰将棋

3手詰めはかなりやってましたが、1年やってて5手詰めハンドブック1周すらできてないのは勉強不足ですね。。 楽な方に逃げていたかもしれません。

対局数

  • 将棋ウォーズ10分切れ負け
    • 343局
  • 将棋ウォーズ3分切れ負け
    • 1167局
  • 将棋ウォーズ10病将棋
    • 43局
  • 81dojo
    • 233局

1年間でどれだけ成長した?

2019年10月5日 初将棋ウォーズ(この後5級で達成率高止まり)

2019年10月27日 3切れ4級昇級

2019年11月3日 10切れ4級昇級

2019年11月6日 10秒将棋 3級昇級

2019年11月23日 10分将棋 3級昇級

2020年1月13日 3分将棋 3級昇級

これ以降は2020年10月4日現在まで特に昇級はしてないです。

将棋勉強し始めて2ヶ月間が一番成長して、この頃が一番楽しくて勉強時間も多かった気がします。

2020年1月13日以降一切昇級等していないわけですが、全く棋力向上していないかというとそうではないと思ってます。(そうでないと信じたい。。)

具体的には下記のような知識は増えているのかなと思っています。

  • 知っている戦型が増えた
  • 知っている囲いが増えた
  • 知っている手筋が増えた

囲いや手筋の名前を知っていることが非常に重要で、ちゃんと名前をおぼえることで認識できるようになります。 例えば天守閣美濃とか名前を知らない頃は初見か否かにかかわらず毎回「何この玉あがり!初めてみた!こんな手あるの?どうしたら良いの!」って毎回言ってました。 天守閣美濃って名前を教えてもらってかららは「あー天守閣美濃ね」って冷静に対応できるようになります。

バーダーマインホフ現象というやつですかね。一度名前を覚えるとソレを意識することができるので、名前を覚えることは大事だと思ってます。

勉強法

基本的には詰将棋と実戦をメインに行っていました

定跡勉強

詰将棋、実戦がメインで定跡とかを棋書みて勉強というのはあまりしていません。

定跡を勉強したのは四間飛車と、45角戦法くらいでしょうか。 勉強したと言ってもこれも、棋書ではなくYoutubeなど動画に上がっているもので勉強していました。

唯一戦法の棋書を見たのはこちらの本。

四間飛車にハマっている時期があって、藤井システムを知りたくなってこちらの本を読みました。

振り返ると、定跡勉強をちゃんとしてないので仕掛けがわからないということが対局中多かったと思います。

序盤の駒組あたりはそんなに崩すことはなくなってきたのでいいのですが、仕掛けの局面あたりは定跡や棋書での勉強を増やしていかないといけないかなーという気がしました。

詰将棋

3手詰めをまずは完璧にしようと思って、3手詰めハンドブックはかそれなりに周回しています。

ただ5手詰め、ソレ以上の詰将棋に関してはそれほどやっていないので足りていなかったかもしれません。

使っていた書籍はこちら

3手詰めハンドブックほのかに詰将棋パラダイスというアプリで詰将棋をしていました。

振り返ると5手詰め以上の詰将棋をあまりやっていないのは反省かなと思います。

実戦

実戦は将棋ウォーズもしくは81dojoで行い、最近はソフトを使って検討をするようにしています。

ソフトは水匠を使っていまは検討していますね。

ソフト研究は数値化された評価値がでて最善手がわかるので良いのですが、囲いや手筋の名前については教えてくれないので、パターンとして認識するのは難しいのかと感じました。

前述したように、天守閣美濃を天守閣美濃として認識してないと玉が上がられたときに何だこれっ!ってなりますし、よくある詰み筋、例えば送りの手筋なんかも、ソフトで検討だけではあーこんな手あるのかってその場では思いますが、実戦ではなかなかそのパターンがでても認識できません。 送りの手筋としてパターンとして認識できていれば実戦でも候補にあがり、認識するのが容易になると思います。

なので、ソフトだよりの検討だけよりも、やはり棋書などで手筋などは覚える必要があるのかなと感じました。

実戦は将棋ウォーズの棋譜をみるとわりと、序盤・中盤は優勢になることが多いのですが、中盤以降優勢になっても勝ちきれない、寄せが下手というのは実感しています。

このあたりはやはり、棋書や次の一手などでパターンを覚える必要性があるのかと思っています。

将棋を初めて変わったこと

将棋用語を使うようになる

将棋解説など見てると、わりと将棋以外の会話でも将棋用語を使うようになったりします。

一番使いやすいのは「序盤」「中盤」「終盤」と言った言葉でしょうか。

私はピアノ配信とかをYoutubeでやっていたりするのですが、音楽の話をするのに「イントロ」という言葉が出なくて「序盤」とか言ってしまったり。。

プロの将棋対局を見るようになる

将棋を始めるまでは将棋解説の番組を見たことがなかったのですが、見てみたらこれが面白い!

将棋の指し手について淡々と解説するのかなと思いきや、 ニコ生とかAbemaの生放送を見ていると棋士の方のトークが普通に面白かったりするんですよね。

もちろん将棋自体も面白くて、解説で「この手はすごい手だ!」と言った感じで盛り上げていたり。正直普通に自分が棋譜を眺めているだけであれば、すごい手なのかどうかもよくわからないのですが、解説があることによって何倍も面白くなります。

また、プロの解説見てると非常に勉強になります。その対局自体もそうですが、変化なども解説してくれるので考え方なども非常に参考になります。 角換わり腰掛け銀の形なんかはプロの対局によく出てきて、そのたびに何度も解説されるのでわりと形だけは見てるだけで覚えれちゃったりしました。

将棋始める前までは、将棋棋士といえば、羽生善治先生と、藤井聡太先生と「ひふみん」こと加藤一二三先生くらいしか知らなかったのですが、解説など見ているうちに知ってる棋士もだいぶ増えました。 AbemaTVトーナメントとかもすごい面白かったですよね。いろんな棋士知ることができました。

コンピュータ将棋を勉強し始めた

将棋ソフトを使っているとそのソフトがどうやって動いているのか気になって夜しか眠れなくなります。

というわけで軽くコンピュータ将棋についてもメモしておきます。 コンピュータ将棋勉強し始めたばかりの初心者なので間違いなどがあったらすいません。

評価関数について

基本的に今の将棋ソフトの評価関数の作成には機械学習によって行われます。 将棋ソフトの機械学習で用いる特徴量は例を上げると、下記のような駒間の位置関係を表すものが使われるようです。

  • KP : K(玉)とP(玉以外の駒)
  • KKP : K(自玉)とK相手玉)とP(玉以外の駒)
  • KPP : K玉)とPとP(玉以外の2つの駒)

そして、これらの駒はもちろん81マス上の任意の位置にいる可能性があるので、例えばKKPであれば 81(自玉の位置のパターン数) * 81(相手玉の位置のパターン数) * 1548(玉以外の駒の位置のパターン) のベクトルなどで表現されます。

Pにあたる玉以外の駒のパターン(1584パターン)は駒種、自駒・相手駒の区別、持ち駒などもあります。 具体的にはコードに定義されてるのを見ると良いです。

YaneuraOu/evaluate.h at 105ab1c069fa50778f649808e687d754f5cde429 · yaneurao/YaneuraOu

成銀、成桂、成香がなくてあれっ?って最初見たときは思ったのですが、金と同じ扱いにするようです。

そして重みも同次元のベクトルなのでベクトルの内積で評価値は求まることになります。 重みは機械学習によって更新される値です。

厳密にはソフトによっていろんな工夫があったりすると思いますが、すごくざっくり説明するとこのような理解です。

あとは差分計算とかで高速化していたりとかいろいろあると思いますが、ただの振り返り記事なのでここではキーワードだけにとどめておきます。 差分計算は1手進んでも、1駒しか動かないので、駒の位置関係の殆どは変化がないのはまぁ想像がつきます。

NNUE評価関数

あともうちょっとだけ触れておきたいのはNNUE。

私がソフト検討とかで使わさせて頂いてる「水匠」もNNUE評価関数が利用されてます。

技術的な内容はこちらのアピール文書で公開されていて、とてもありがたい。

NNUEのアピール文書

ニューラルネットワークを用いた評価関数の実装なのですが、GoogleのDeepMind社のAlphaZeroなどとはまた別のアプローチで、面白いです。

4層の全結合ニューラルネットワークでそれほど深いネットワークではありませんが、非線形の評価関数となっています。 ニューラルネットワークの計算はベクトルと行列の積ないしは、行列行列積の演算になり、なおかつ各層で演算があるので計算量が多いです。

特に将棋は入力層のニューロンが多くなる、NNUE評価関数では「Half-KP」というのが使われていて 81 * 1548 = 1225388次元です。 実際は疎なベクトルなので、そんなに計算量は多くなさそうですが、それでも入力層の占める計算コストの割合が多いようです。

もちろん各層のニューロン数、層数で計算量は変わってきますが、NNUEのネットワークはは W1(入力層) = 1225388 * 256, W2 = 512 * 32, W3 = 32 * 32, W4(出力層) = 32 * 1 となっていることから、入力層が一番計算量が多いのはわかるかと思います。

NNUEはこの入力層の計算量の問題を差分計算で解決している。

前述したように、1手進んでも、もとの局面との差異が少ないので、ここも差分計算ができるのはなんとなく想像がつきます。

アピール文書の(13)式に計算式もあるのでやって見るとわかります。

もともとニューラルネットワークにそれほど詳しいわけではありませんが、入力層を差分計算で高速化を図ってるのがニューラルネットワークの例であまり見たことがなかったので面白いと感じました。 前後のデータがある将棋などのデータならではの最適化かなと。

コンピュータ将棋の勉強してみての感想

コンピュータ将棋を初めて勉強してみましたが、近年ではニューラルネットワークやディープラーニングを取り入れた手法も出てきていて面白そうです。 NNUEに関しては全結合ニューラルネットワークですが、将棋は二次元の盤面なのでCNNとかも使えるのでは?とか、考えると夢が広がりますね。もちろんすでにやってる人はいるんでしょうけど。

コンピュータ将棋はあまり追っかけてなかったですが、勉強してみたら面白かったので、今後は追っかけてみるのも良さそうですね。 大会とかもあるそうなので、今度見てみようかなとおもいます。

コンピュータ将棋勉強したからには、次は実際にソフトを作るのかという話になりますが、強い将棋ソフト作るモチベーションは今のところありませんね。 今の将棋ソフトがもう強すぎますし、機械学習とかやり始めたら、計算リソースとかが必要なので。

強い将棋ソフトを作るモチベーションはありませんが、ニューラルネットワークの勉強のお題でやってみるとか、変則将棋とかもたまにやってたりするのでそれようにソフトを作るとかであればモチベーションありそうです。

ただの振り返りなのに、意外と文量書いてしまったので、もはや別記事にすればよかったですね。

さいごに

振り返り記事を書いたことでなんとなく、これからする勉強など変える必要があるなと感じました。

振り返りをもとに次の勉強法を考えて行きたいと思います。 まずはウォーズ2級に早く上がりたいですね。

棋力向上の他にも、プロ棋士の対局だったり、コンピュータ将棋など他の将棋の楽しみ方もありそうなので、このあたりの幅も広げていけると良いなと思います。