色々自主的に機械学習を遊んでると模範解答が溢れている入門課題から実践課題への間くらいの丁度いい例題が必要だとわかる。必要なステップ数は個人差があるがゼロというわけにはいかないだろう。
ところで、先月こういう話があった。
以前どこかで聞いたのですが、
— 西遊棋実行委員会 (@kansaishogi) 2018年1月15日
平手の初形から、相手の駒の初期配置を自由にいじって良いとしたら、どの形が相手にとって最悪か、という問題?があります。
よかったら考えてみてください。
相手の駒が元いる場所、つまり、
一段目、三段目の全てと2二、8二
に駒を置いてください。二歩はなしです。
相当ひどいのができた pic.twitter.com/NZxkRG2NbX
— 48 (@bleu48) 2018年1月15日
ぽんぽこで軽く読ませて,2500近い評価値が出るw
— 48 (@bleu48) 2018年1月15日
ということで、例題
・相手の駒20枚を自由に並び替えて、局面評価値が最も高くなるものを求めよ。
という辺りで自主課題を設定してみた。
itertools.permutationsをやったらフリーズした。
そうよね。 20! / 9! /2 /2 /2 /2 位の数になるもんね。
ってことで、これはGAの課題だろうってことでGAで取り組みました。
試行錯誤の結果、組み換えはorder-based two-point crossover(日本語で何て言うか知らん)、突然変異体はチャンピオンデータのランダム二点入れ替え(正式に何て名前なんだろう?)が比較的うまく動いた。
選択は乱暴だがsubprocessで動かしたやねうら王(Apery SDT5評価関数)のノード数100万制限での評価値でソートした。
ノード数制限にした理由は計算時間が予測しやすいから程度の理由で、実は同じ局面でも値が変動するのでよくない部分もある。
で、ryzenで数十分程度GAさせて作ったのが以下の局面。初手16歩で玉頭致命的である。
興味ある人コピペ用→sfen psgnnplbp/1g5l1/rppppsppk/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1
この局面で一応私が手動で作ったものより優秀な数値は出た。しかしながら、上記の回答に対してネット上でもっと良い数値を出している方もいるので、まだまだかなぁという感じ。今のところこの程度のGA力です。