自分の将棋思考アルゴリズム、間違ってないか?

はじめに

要旨

将棋、実は思考アルゴリズムや認知の方法が悪いと大損するのでは?自分の考えを書くので、皆さんどう考えているのか、気づいた点など教えてください。

エピソード

将棋を指していると、子供の指し手の速さに驚かされます。本当に考えているのか?と思えるぐらい。自分だと例えば「こう指したら、相手はこう来て…」と3手先まで読み、それぞれの局面で2通りの応手を考えるとします。計算すると、

  • 初手:2通り
  • 2手目:2×2=4通り
  • 3手目:2×2×2=8通り
  • 合計 14通り

1手を1秒で読むとしても14秒かかります。しかし、子供はもちろん、将棋ウォーズなどオンライン対局では、多くの人が10秒未満で指してくるのです。もちろん、定跡やパターンを知っていたり、良い手を自然に選べる感覚(評価関数的な直感)を持っていたりすることで、読む手数自体を減らしているのでしょう。それでも、この速さはやはり不思議です。

仮説

振り返ると、自分も思考方法を少し変えるだけで効率が良くなった経験があります。そこで、こんな疑問が湧きました。

  • 実は自分だけ、変な思考アルゴリズムで考えているのでは?
  • 子どもが速く指せるのは、そもそも考え方が根本的に違うのでは?
  • 人間はコンピュータより処理速度が遅いのに、コンピュータのような総当たり(brute force)的な読み方をすると損では?
  • 認知の方法次第で、上達速度も大きく変わるのでは?

しかも、自分の思考アルゴリズムが効率悪いことには、なかなか気づきにくいです。ざっくばらんと将棋に関することをどう考えているのか言語化してみるので、みなさんもどう考えているのか教えてほしいです。

将棋ネタいろいろ

  • 「2級」「初段」「現在(二段)」という表記で、その時期にどう考えていたかのかを分けて書いたもの。将棋ウォーズ基準。
  • 競プロ×将棋の方々向けに書いたので、ところどころで、プログラミング用語を使用しています。

【1】詰み判定

以下の詰みの局面を例に挙げます。

2級

下図のように王手がかかると相手の玉が⇒の方向に逃げるので、全ての逃げ方を考え逃げても捕まるから詰みということをチェックしてました。

  • アルゴリズム:相手玉の周囲9マスそれぞれについて、「自分の駒が利き範囲」にいるかを判定する。
  • 計算回数:9マス×近隣の自分の駒数×駒の利きマス数


初段

ある日、今の方法では遅いのではと気づき、以下のようになりました。

  • アルゴリズム:相手玉の周囲9マスが、「自分の駒の利き範囲」で埋まっているかを判定する
  • 計算回数: 近隣の自分の駒数×駒の利きマス数

例えば以下の図面では、馬の利きが赤色マス、銀の利きが青色マス、歩の利きが緑色のマスで、相手玉の周囲がいずれかの色で塗られています。このイメージです。
これで9倍高速化しました!(今までが他人の9倍遅かったともいえますが…)
ただ、実際テトリスのようにピースを組み合わせた図をイメージするのは、たまに1マス抜けていたりしてスルっと逃げられることはありました…。

現在(二段)

周囲9マスを埋める判定なのですが、ただ、将棋では利きに隙間がないのは良型として知られているようなので、そういう複数のピースは最初からひとかたまりだと思ってイメージするようにしました。これで雑にイメージしても、「この辺は隙間はないな」と考えられるようになり、ちょっと楽になりました。


あと、詰将棋を解いていると、隙間なく効率よく埋められる組合せはよく出てくる気がします(例:「角+金」「飛車+銀」「角+角(筋違い)」「桂+桂(筋違い)」)。

実際、詰み判定でひと固まりピース判定が有効なケースは多くはないのですが、似た判定で「自陣に打ち込まれないか判定」もあります。この場合定数倍の部分が9マスから27マスになるのでより有効です。(自陣のすべてのマスに駒が利いているかは将棋では重要で、これにより相手の駒の打ち込みによる攻撃を一方的に遅らせることができます。)

【2】動けない合い駒

以下の場面で何も警戒せず

ポロっと金を取られたことが何度あったことか…。銀で相手の馬を取り返すことはできません…。

王が相手の飛車・角・香車で睨まれているときは、間の駒は「何も書いてない、"どこにも動けない駒"」とイメージすることで、若干見えやすくなった気がしますが、上記のような典型ケース以外では未だにミスします。皆さんどうしてるんでしょう。

【3】速度計算

将棋では、あと手番が何回きたら自玉や相手玉が詰むかを考えて、攻めか受けか適切な手法を選んだりします。どっちが速いか読むことを「速度計算」と呼びます。

2級

「詰ませるのよりも、詰めろをかけ続けることが大事だ」というのを聞いていたものの、なぜかは理解できず。

初段

何かで速度計算に関する記事をみたときに、これはターン戦闘型RPGで、

RPG 将棋
HP 3 2手スキ
HP 2 詰めろ(1手スキ)
HP 1 詰み
HP 0 王が取られた状態

双方ともに、

  • 攻撃(相手HP-1)
  • 回復魔法(自分HP+1)

を使える。また、条件が揃うと、

  • ドレイン攻撃(=詰めろ逃れの詰めろ)(相手HP-1 自分HP+1)
  • 死の宣告(=必至)(相手は回復できない)

も使えます。

最初の例の「詰ませるのよりも、詰めろをかけ続けることが大事だ」は、「相手のHP2だったら、こちらは攻撃してれば、相手は次ターン回復魔法を使うしかないので、自分は安全。ずっと自分の攻撃ターン」と同じなんだと理解。

と謎の例えを書いたのですが、YouTubeをみたら全く同じ方法で理解をされている人がいたので、こちらを観た方が絶対分かりやすいです。

www.youtube.com
カードゲームでも同様の概念を表す用語があるらしい(けど忘れた)

現在(二段)(というか悩んでる点)

速度計算のフローチャートは、以下のようになっています。

  • ①相手玉が詰むか?
    • 相手のHPが「1」に相当する状態。
      • → YESなら即攻撃して勝ち。
      • → NOなら②へ。
  • ②自玉が詰むか?
    • 自分のHPが「1」に相当する状態。
      • → YESなら回復魔法=受けの手を選ぶ。
      • → NOなら③へ。
  • ③詰めろや必至をかけられるか?
  • 相手のHPを「1」に追い込めるかを検討。

アルゴリズム的に無駄がないのは、①→②→③の順ですが、自分も①→②→③で考えていますが、これが最適か?というと、少し疑問が残ります。どっかの将棋本で②を一番先に考えるという例は見たことがあります。詰みが難しい場合は③が一番先もありそう。皆さんはどの順で考えているのでしょう??

あと、これってうまくモデル化できれば自分にとって最適な考え方が決まりそうな気もします。

  • {読みの詰む・詰まない}x{実際詰む・詰まない}の全4パターンの確率関数
    • 読む時間をかければかけるほど精度があがる、詰みまでの手数が長いと精度が下がるので、その2変数の関数になりそう
  • それぞれの場面の価値(勝ち、すっぽぬけなど)

これらは棋譜から測定できると思うので、人によって最適な思考順が計算できれば面白いと思います。
まぁでも、長期的に上達のことを考えたら、①→②→③で考えよ!と一蹴されそう…。

【4】詰将棋

詰将棋は、詰めチャレでいまだに初段~二段で、たぶん同棋力の人に比べてだいぶ苦手です…

2級

深さ優先探索か最良優先探索をしているだけです。

ただし、自分の場合、深さは3手ぐらいで打ち切られる。

現在(二段)

思考アルゴリズムの進歩がない…。上記の探索に加えて、

  • 一旦詰まそうとして詰まなかった場合に「もし、ここに駒が利いてたら、詰んでたのに…」と分かるので、次の探索時に考慮する。
  • ぜったいに詰まない形(ゼット)の知識
  • どの本にも共通して載っている非常に基礎的な詰み型の知識

一般的には、「詰将棋は答えをすぐ見て良い。3手詰等の短い手数の詰将棋を、丸暗記して、数秒で解けるようにする」のが良いとされています(アルゴリズムでいうとメモ化 - Wikipedia?)。ただ、この暗記が全くできる気がせず、結局毎回最初から考えるので、いまだに3手詰でも20秒程度はかかります。よほど映像記憶力が強い人でないと、答えを見て丸暗記はかえって難しいのではと思える…。
ただ将棋強い人に聞くと「詰みを読むとき、途中の手をスキップすることがある。」と聞いたこともあるので、メモ化が効いているのでしょう。

また、「詰み形から逆算することがある。」というのも聞いたことがあります。総合すると両端からの探索が最強なアルゴリズムな気がします。

  • 初手から(正方向)で見ると分岐が少ない
    • 正方向からの深さ優先探索
  • 詰み側から(逆方向)で見ると分岐が少ない
    • 逆方向からの深さ優先探索
  • 正方向でも逆方向でも、中間に分岐が多い
    • 両端からの探索

がベストな方法に思えます。ただ、人間がやるには非常にやりづらそう…。皆さんはどう考えているのでしょう?

【5】手番

手番は将棋用語としてすでに2種類ある。
手番 - 将棋用語説明|将棋講座ドットコム

2級
手番の意味1:対局者のうち、次に手を指す方。

例えば、

初段

初段ぐらいからは以下のイメージになってます。

手番の意味2:その局面において先に攻めることができるか否か

手番の意味2は、連続する手番の集合で、相手玉が受けざるを得ない状況、飛車・角等が追い回されて逃げざるを得ない状況などでは、攻め方が自由な手を指し続けることができる。つまり「ずっと俺のターン!」が発動します。手番を握っているともいいます。詰めろ・2手スキなども意味2の手番でカウントしますね。

他のゲームでも同じ手番の概念はあるようですが、自分は知りませんでした…。知ってるのと知らないのとで+0.5級分ぐらいの価値があるので、将棋習いたての時点で知っておきたかったです。

【6】攻めるときは一気に詰ませるのが最善

将棋のゲームの特徴、持ち駒に関連した話。

2級

中途半端に攻めて相手の守りが少し崩れるものの、こちらの攻めは一旦途切れる。駒不足なので、また駒を増やして攻めようとするものも、相手に反撃をくらう。

現在(二段)

将棋の持ち駒には以下の特徴があります。防御力ダウンすると攻撃力アップする怖いゲームです!

  • 盤上の駒が持ち駒になる⇒攻撃力アップ
  • 駒交換⇒双方の攻撃力アップ
  • 敵陣でも自陣でも崩れるときは駒交換がされる⇒防御力ダウンすると攻撃力アップ

こういうルールのゲームは将棋以外でも、カードゲームや私の好きな三国志大戦でもあるのですが…。終盤で攻め開始したら一気に詰ませないと、詰ませられなかったときは相手の攻撃力が上がっているので、逆転負けのリスクが高まります。

(もちろん攻めながら駒をぽろぽろ拾えるケースはいいのですが、ここでは考えてない)

【7】王の早逃げ

将棋の格言に「王の早逃げ八手の得」というのは知っていたけど、さすがに八手の得はしない。

2級

戦うか逃げるかの判断基準がなく、囲いが崩れる前に逃げて普通に捕まる。早く逃げすぎ。

現在(二段)

たぶん、敵の駒が集中していてるときほど、早逃げが有効な気がする。ファイアーエムブレムなどのシミュレーションゲームとは違って、1ターンに動かせるのは1つだけ。ゆえに、敵の攻め駒が複数あったとして、そこから王が逃げても、相手は全部の駒が追いついてくることは不可能。ゆえに得。

仮想局面。4枚香車が自陣を破っても、王将を追いかけるのは移動回数×4手かかるので、逃げ得。

【8】進展性・理想形・手待ち

囲いについては手数をかけるほど基本的には固くなる。ただ種類によって、短手数で囲えるものがあったり、分岐があったりするので、またその成長曲線のようなものをイメージしています。銀冠のように一瞬隙が生まれて薄くなることもあるので、相手より差が開いているタイミングで仕掛けるのが基本良い。いろんな分岐があったり、時間が経つと強くなったりする囲いもある。進展性がある囲いと言ったりもする

ただ、自分も相手も仕掛けられないと、いずれ膠着状態になる。戦闘開始前の強さの最大、ベストな配置のことを「理想形」と呼ばれています。

で、将棋はパスできないゲームなので、この最大値に到達した次の手が難しい。基本マイナスの手になってしまう。少しのマイナスで済む手がさせればいいものの、実は「手待ち」するための手段はいろいろ知ってないとまずく、手待ちの手のはずが隙ができて大きなマイナスになったり、中途半端にこちらから仕掛けざるを得ない状況になって不利になることがある。

これについては、将棋を始めた時になぜか教えていただいて、その時はよく分かっていなかったです。

【9】手番の価値

2級

例:歩の突き捨てや叩きの歩
飛車道などを通すためのは理解できても、それ以外のケースは端に相手が得するだけの手に見える
また序盤から中盤にかけたあたりで行われる理由も分からず。

初段

手番の価値が、序盤はほとんどなく、終盤は+∞になるということに気付く。

イメージですが、基本、歩の突き捨てや叩きの歩は、

  • 相手が歩を取ると 相手 +10、手番は自分のまま。
  • 相手が歩を無視すると 相手 -500になるが、手番は相手にとられる。

ぐらいなので、序盤はまぁ無難に取られてしまいます。ただ、中盤・終盤になると、無視したほうが良い場面も出てきます。
せっかく良い叩きの歩でも、終盤なのでそのまま無視されて負けるということが理解。また、突き捨てなどは、早すぎるとただの損で、遅すぎても無視されて負けることもあるというのを学ぶ。

二段

初段からかわらず。明確な判断基準もなく、なんとなく指してます…

【10】勝利条件

2級

通常の詰み以外に、入玉でも勝てるということを知る。

初段

さらに、「相手の攻めが切れるのも、ほぼ勝利」というのも知る(競プロ将棋大会で三段の方と戦って、相手が自陣飛車で完全に切らされて覚えた)
相手の攻め駒が3枚以下になると、自陣が薄くない限り攻めが切れる可能性がでてくるので、攻めを切らす手もたまに指すようになってきます。

現在(二段)

初段のころから変わらず…。攻めが切れるか?により良い判定があるのかも。

その他ネタ

2箇所以上で駒がぶつかった場合に、どちらからとるべきか・無視するべきか?

2択に見えますが、無視もありますし、相手の手番もいろいろあるので分岐が何気に多いので、よくミスります。
結局全パターンを試すしかないのか…。ただ、取ったり取られたりの際に王手もかかるときは相手は無視できないので、そちらを優先することが多いです。