前回の続き。今日は王様の8近傍の守りについてです。
玉の8近傍に利きのない自駒に対してペナルティ
前回、たけわらべが金冠にしてしまうので、玉の右側にいる銀に王様以外の味方の利きがないのはよくない形なのではないかという話になりました。
そこで、玉の8近傍にいる駒に対して、王様以外の味方の利きがなければペナルティを課せようと思ったのです。
ついでに言うと、王様の8近傍の升が空いていて(自駒がなくて)、王様以外の利きがないパターンも(そこから駒を放り込まれたりして)嫌です。
そこで、これらにそれぞれPARAM1,PARAM2のペナルティを与えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// 玉の8近傍に玉以外の味方の利きがなくて駒があるなら、ペナルティ for (auto color : COLOR) // 両方の玉に対して { auto king_sq = color == BLACK ? king_black : king_white; // 玉の8近傍 if (dist(sq, king_sq) == 1) { int effect_us = color == BLACK ? m1 : m2; if (effect_us <= 1) // 自玉以外の利きがない。 score -= double((pc == NO_PIECE || color_of(pc) != color) ? PARAM2 : PARAM1) * (color == BLACK ? 1 : -1); } } |
いくらペナルティを与えれば良いのでしょうか?optimizerに尋ねてみました!
そうすると、PARAM1 = -20 , PARAM2 = 11と返ってきました。
ペナルティがマイナスだと・・・!?
そうなんです。王様の8近傍には王様以外の利きがなかろうとも駒がいたほうが良いのです。王手飛車取りのような王手がかからないので、8近傍には何であれ駒がいてくれたほうが嬉しいのです。駒が玉の8近傍升を占有していることの価値、それが20だと言うわけです。歩の価値が90ですから、玉の8近傍に自駒を置けば、歩の価値の2/9の得なのです。
駒のpositionalな(位置の)価値として、利きの発生源としての役割以外に、このような、その駒が玉の8近傍の升を占有している価値があるということですね。
また、玉の8近傍で、玉以外からの味方の利きのない空いている升は、11点のペナルティなので、これはやはりとてもよくない形であるというのもわかりました。
他の組み合わせは?
8近傍に関して
1) 玉以外の味方の利きがある/なし
2) その升が空いている(or相手の駒)/自駒
の2×2 = 4通りの組み合わせがあります。
さきほど、玉以外の味方利きがなしのケースについての2通りは試しました。
残りの、玉以外の味方の利きがある場合に、「その升が空いている(or相手の駒)/自駒」に関してどのような価値があるのでしょうか。
1 2 3 4 5 6 7 8 9 10 |
// 玉の8近傍 if (dist(sq, king_sq) == 1) { int effect_us = color == BLACK ? m1 : m2; if (effect_us <= 1) score -= double((pc == NO_PIECE || color_of(pc) != color) ? 11 : -20) * (color == BLACK ? 1 : -1); else // 自玉以外の利きがある。 score -= double((pc == NO_PIECE || color_of(pc) != color) ? PARAM4 : PARAM3 ) * (color == BLACK ? 1 : -1); } |
optimizerにPARAM3とPARAM4について尋ねてみました。
そうすると、PARAM3 = -11 , PARAM4 = 0と返ってきました。
玉の8近傍で、玉以外の味方の利きがある空き升(or 敵駒)はペナルティなし。玉以外の味方の利きがある自駒がある升には11点、加点せよとのことです。
これは、駒に紐がついている価値とは別です。将棋の終盤では王様の周辺の駒は高い確率で剥がされていくのですが、その駒が取られた時に駒Xで取り返して、そこに駒Xが来る価値、それが11点なのです。これは、その升にあった駒の価値(piece_value)には比例しないと考えられます。(本当は駒の種類Xごとに、この価値は異なるはずですが、どの駒の利きであるかという情報をKKPEE型の評価関数では持っていないので、これを利用できません。)
玉の8近傍に関して
まとめておきます。玉の8近傍升に関して、次の4通りの組み合わせがあり、それぞれにいくら加点するか。
・玉以外の味方の利きがない、その升が空いている(or相手の駒) なら -11
・玉以外の味方の利きがない、その升が自駒なら +20
・玉以外の味方の利きがある、その升が空いている(or相手の駒) なら 0
・玉以外の味方の利きがある、その升が自駒なら +11
将棋では王様の横よりは、斜め下が空いてるほうが嬉しいという話
たけわらべは、ときどき、王様の斜め下の升に銀を配置する囲い(?)にしてしまいます。
これはたけわらべは、この場所の銀は、王様に利きをつけている、わりといいポジションだと思っているからです。
利きに、王様からの距離に反比例する価値があるとして、上の左図は
1 + 1/2 + 1/3 ≒ 1.83
右図は
1/2 * 3 + 1/3 * 2 ≒ 2.16
で少ししか変わらないので、この差より価値の高い指し手が他にあるなら、そちらを優先して指してしまうためです。
将棋の初心者も時として、上の左図のような囲い(?)をしてしまうかも知れませんね。有段者のあなたは、銀が何故ここにいると悪い形であるのかを論理的に説明できますか?
この8段目にいる先手玉の斜め下の升にいる銀の話は、10年ぐらい前に私がPonanzaの開発者の山本君と初めて会ったとき、私が「3駒関係のパラメーターは計算式で割り出せるんじゃない?」と主張した時に、「いやいや、例えば、(8段目の)王様の斜め下にいる銀とか、いないほうがマシなぐらいでしょ。これどういう計算で出てくるんですかwww」みたいな感じのやりとりがありました。
※ 当時、私はこういうことを考えていたという↓。
3駒関係のパラメーターを計算式で割り出す実験
https://ls3600.hatenadiary.org/entry/20111014/p1
当時の私の将棋に対する理解では、何故、「8段目にいる先手玉の斜め下の升にいる銀」がいないほうがマシな駒であるのか説明ができなかったのですが、いまなら説明できるので、それを以下に書いておきます。
8段目の先手玉にとって、斜め下には駒がないほうが良い理由
遠方まで利く駒で王手されることがあります。ここで言う、遠方まで利く駒とは、香・角(馬)・飛(竜)のことです。
この時、玉の8近傍から打ちますと、(攻め方の利きがその升になければ)同玉と取られてしまいます。そこで、遠方駒での王手は(詰みが見えている時以外は)2升以上離れたところから打つことのほうが多いでしょう。
玉は、いま88にいると仮定しましょう。先手玉は終盤で28か88にいる頻度はわりと高いので、以下はわりと一般的な話だと思います。
上図の香・角・飛のように、玉の上、右斜め上、右から遠方駒で王手されます。ところが、玉の右斜め下、下、左斜下、左、左斜め上から、2升以上離れたところから遠方駒での王手はできません。(盤外であるため)
この理由により、遠方駒で王手される可能性があるならば、飛車で王手馬取りなどがかかるのを事前に避けるために、例えば王様の右側の升には何らか自駒があったほうが得です。しかし、上図の王様の右斜め下の升は、この升が空いていたところで、飛車で王手馬取りみたいな手はかからないので、右下の升は(退路として)空けておいて、それよりは、遠方駒で王手されうる、玉の右隣の升に自駒がいて欲しいのです。
しかし、この時、△79銀と捨てて▲同玉に△XX飛みたいなことをされると嫌なので、79(玉の右斜下)には、王様以外の味方の利きがあって欲しいのです。
美濃囲いがとても良い形である理由
そう考えると美濃囲いは、79はわざと升を(退路のために)空けてあって、かつここには味方の金が利いていて、△79銀と放り込まれる筋を消していますし、78の銀は、遠方駒での王手(王手馬取りなど)を事前に消しています。
また、97の升も同様に、わざと升を(退路のために)空けてあり、ここには99の香が利いているので、97から放り込まれての角で王手飛車取りみたい筋を消しています。
上図の美濃囲いで97と79が空いていることの価値がわかってきました。
こうして考えると、冒頭で書いた4通りの組み合わせに対して、それぞれoptimizerが返してきた値について、なんだか納得感があります。
今回のコード
今回のコード(残りは前回のコードと同じ)です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// 対象升(sq)の利きの価値。 (中略) // 玉の8近傍に玉以外の味方の利きがなくて駒があるなら、ペナルティ(実は、加点。利きがなくとも駒があることはプラスであった) (+R15) // 玉の8近傍で玉以外の味方の利きがなくて空いている(or 相手の駒)なら、ペナルティ 9。(+R20) for (auto color : COLOR) // 両方の玉に対して { auto king_sq = color == BLACK ? king_black : king_white; // 玉の8近傍 if (dist(sq, king_sq) == 1) { int effect_us = color == BLACK ? m1 : m2; if (effect_us <= 1) // 自玉以外の利きがない。この時、そこが空きか敵駒なら、減点。さもなくば加点。 score -= double((pc == NO_PIECE || color_of(pc) != color) ? 11 : -20) * (color == BLACK ? 1 : -1); else // 自玉以外の利きがある。この時、そこが空きか敵駒なら、減点なし。さもなくば9点加点。 score -= double((pc == NO_PIECE || color_of(pc) != color) ? 0 : - 11 ) * (color == BLACK ? 1 : -1); } } |
今回、どれだけ強くなったの?
・玉の8近傍に玉以外の味方の利きがなくて駒があるなら、ペナルティ(利きがなくとも駒があることはプラスであったので実際は加点している) (+R15)
・玉の8近傍で玉以外の味方の利きがなくて空いている(or 相手の駒)なら、減点。(+R20)
次回予告
次回「王様には居玉よりまだ悪い場所がある」です。お楽しみに!