2021-07-15に更新

アルファベータ探索(alpha-beta pruning)やろうぜ(^~^)?

どふどふどふどふどふ(^~^) ほぽぽぽぽぽぽぽぽ(^~^) 公開下書き

アルファベータ探索(alpha-beta pruning)やろうぜ(^~^)?

20210124shogi2a2b1.png
「 アルファベータ探索 やろうぜ?」

kifuwarabe-futsu.png
「 カツ丼に影響されて……」

【将棋AI】電竜戦TSEC2 + 講演「将棋AI超入門」

ohkina-hiyoko-futsu.png
「 👆 この動画の 最初の30分が アルファベータ探索の説明になってるわよ」

ramen-tabero-futsu2.png
「 マンガでなければ わたしには分からないんで」

20210712shogi62.png

kifuwarabe-futsu.png
「 👆 アルファベータ探索は、よく こんな絵で 説明されるな」

ramen-tabero-futsu2.png
「 何だぜ それ?」

kifuwarabe-futsu.png
「 説明すると お父んが寝てしまうので 手順を進めながら やってみよう」

ミニマックス法(Minimax)

20210712shogi63a1.png  

kifuwarabe-futsu.png
「 👆 まず こっちの枝で 一番大きな数は 15 なんで、 わたしは 15 を選ぶぜ」

20210712shogi64a2.png

kifuwarabe-futsu.png
「 👆 別のところにも枝があるな」

20210712shogi65a2.png

kifuwarabe-futsu.png
「 👆 そっちの枝で 一番大きな数は 40 なんで、 わたしは 40 を選ぶぜ」

20210712shogi66.png

kifuwarabe-futsu.png
「 👆 すると 次は 相手プレイヤーの番だぜ」

20210712shogi67a1.png

kifuwarabe-futsu.png
「 👆 相手プレイヤーは いじわる をして、 一番小さな数 15 を選ぶぜ」

ohkina-hiyoko-futsu.png
「 嫌なやつよね」

20210712shogi68.png

kifuwarabe-futsu.png
「 👆 こうして わたしの枝の1つは 15点 だと分かったわけだぜ」

ramen-tabero-futsu2.png
「 どこが アルファ で、 どこが ベータ なんだぜ?」

kifuwarabe-futsu.png
「 これは ミニマックス法 の説明なんで。
アルファとか ベータとか まだなんで」

20210712shogi69.png

kifuwarabe-futsu.png
「 👆 一番 小さな数 を、できるかぎり 大きくしよう、 というのが ミニマックス だぜ」

ramen-tabero-futsu2.png
「 まわりくど」

ベーターカット(beta cutoff)

20210712shogi72a1.png

kifuwarabe-futsu.png
「 👆 ベーターカットは、よく こんな絵で 説明されるな」

ramen-tabero-futsu2.png
「 赤いハテナの箱は何だぜ?」

kifuwarabe-futsu.png
「 知る必要はないぜ」

ramen-tabero-futsu2.png
「 なぜだぜ?」

20210712shogi73a1.png

kifuwarabe-futsu.png
「 👆 ここに 5 があるだろ」

20210712shogi74a1.png

kifuwarabe-futsu.png
「 👆 そして ここに 6 があるな」

20210712shogi75.png

kifuwarabe-futsu.png
「 👆 赤い箱の中身を確認しなくても、 6以上 は確定しているぜ」

ramen-tabero-futsu2.png
「 やったぜ!」

20210712shogi76.png

kifuwarabe-futsu.png
「 👆 じゃあ 相手プレイヤーは 赤い箱の中身が何であろうと 5 を選ぶぜ」

ramen-tabero-futsu2.png
「 なんてこった!」

アルファーカット(alpha cutoff)

20210712shogi77.png

kifuwarabe-futsu.png
「 👆 アルファーカットは、よく こんな絵で 説明されるな」

ramen-tabero-futsu2.png
「 赤いハテナの箱は何だぜ?」

kifuwarabe-futsu.png
「 知る必要はないぜ」

ramen-tabero-futsu2.png
「 なぜだぜ?」

20210712shogi78a1.png

kifuwarabe-futsu.png
「 👆 ここに 6 があるだろ」

20210712shogi79.png

kifuwarabe-futsu.png
「 👆 そして ここに 5 があるな」

20210712shogi80.png

kifuwarabe-futsu.png
「 👆 赤い箱の中身を確認しなくても、 5以下 は確定しているぜ」

ramen-tabero-futsu2.png
「 なんてやつだぜ!」

20210712shogi81.png

kifuwarabe-futsu.png
「 👆 じゃあ わたしは 赤い箱の中身が何であろうと 6 を選ぶぜ」

ramen-tabero-futsu2.png
「 しょんぼり」

アルファーカットと、ベーターカットって何が違うんだぜ?

ramen-tabero-futsu2.png
「 あれっ?」

20210712shogi82a1.png

ramen-tabero-futsu2.png
「 👆 これが ベーターカットが起こるとき」

kifuwarabe-futsu.png
「 そうだぜ」

20210712shogi83a1.png

ramen-tabero-futsu2.png
「 👆 これが アルファーカットが起こるとき」

kifuwarabe-futsu.png
「 そうだぜ」

ramen-tabero-futsu2.png
「 何が違うんだぜ?」

kifuwarabe-futsu.png
「 違うだろ」

ramen-tabero-futsu2.png
「 手番と 大小関係が ひっくり返っているだけで 同じことでは?」

kifuwarabe-futsu.png
「 ひっくり返ってるのが違うだろ」

ohkina-hiyoko-futsu.png
「 こんな 細々したやつを プログラムで組めんの?」

どっちが アルファーカットで、どっちがベーターカット?

20210712shogi84a1.png

ramen-tabero-futsu2.png
「 👆 あれっ?
えっ??
どっちが アルファーカットで どっちが ベーターカット???」

kifuwarabe-futsu.png
「 お父んは 契約書とか 読んだことあるだろ」

ramen-tabero-futsu2.png
「 えっ、契約書??」

kifuwarabe-futsu.png
「 お父ん(以下 甲とする)、きふわらべ(以下 乙とする) みたいなやつだぜ」

ramen-tabero-futsu2.png
「 見たくもないぜ」

kifuwarabe-futsu.png
「 利益を増やそうとしている わたしは アルファー さん、
アルファーさんになるべく利益が出ないようにしている相手が ベーター さんだぜ」

ohkina-hiyoko-futsu.png
「 日本語では 甲乙(こうおつ)、 英語では AB(エービー)、 数式ではギリシャ文字を使うので αβ(アルファー、ベーター)よね」

ramen-tabero-futsu2.png
「 で、どっちが アルファー?」

kifuwarabe-futsu.png
「 わたしが アルファー、 相手がベーター」

20210712shogi85a1b1.png

ohkina-hiyoko-futsu.png
「 👆 ベーターさんにとって要らないものをカットするから ベーターカット、 アルファーさんにとって要らないものをカットするから アルファーカットよ」

ramen-tabero-futsu2.png
「 ただの カット なのでは?」

kifuwarabe-futsu.png
「 お父んには カット が 1つに見えるんだろ」

ramen-tabero-futsu2.png
「 見える」

kifuwarabe-futsu.png
「 カットは 2つある。
ベーターカットと アルファーカットは 違う所をカットしている」

ramen-tabero-futsu2.png
「 えっ!」

アルファ値とベータ値

20210713shogi91.png

kifuwarabe-futsu.png
「 👆 こういう 2人が ゲームしてるわけだぜ」

ramen-tabero-futsu2.png
「 仲悪いの わらう」

20210713shogi92.png

kifuwarabe-futsu.png
「 👆 アルファーカットしているのは 負の無限大に近い方、
ベーターカットしているのは 正の無限大に近い方だぜ」

ramen-tabero-futsu2.png
「 全部一気に アルファーカットと ベーターカットして 0 にしたったらどうだぜ?」

ohkina-hiyoko-futsu.png
「 全部カットしたら 投了しちゃうんじゃない?」

20210713shogi93.png

ramen-tabero-futsu2.png
「 👆 アルファー値とか、ベーター値とか、いろんなとこに いっぱいあるんじゃないのかだぜ?」

20210713shogi93a1.png

kifuwarabe-futsu.png
「 カットオフしようとしている わたしは、兄 だけ見ろだぜ。それが ベーター値だし、
カットオフしようとしている相手は 兄 だけ見ろだぜ。それが アルファ―値 だぜ」

シミュレーション

ramen-tabero-futsu2.png
「 じゃあ ちょっと、シミュレーションしようぜ?」

20210713shogi94.png

ramen-tabero-futsu2.png
「 👆 平手初期局面って こんなんだろ」

kifuwarabe-futsu.png
「 1三きりん」

20210713shogi95.png

ramen-tabero-futsu2.png
「 👆 こうかな」

ohkina-hiyoko-futsu.png
「 3二らいおん」

20210713shogi96a1.png

ramen-tabero-futsu2.png
「 👆 こうかな」

kifuwarabe-futsu.png
「 1四らいおん」

20210713shogi97.png

ramen-tabero-futsu2.png
「 👆 こうかな」

20210713shogi98.png

ramen-tabero-futsu2.png
「 👆 じゃあ 仮に 葉局面の盤面評価値(Value)が 10 だったとしようぜ。
きふわらべ、他の手も選んでくれだぜ」

20210713shogi99a1.png

ramen-tabero-futsu2.png
「 👆 おっと その前に アルファー値 も右にずらして 10 だな」

kifuwarabe-futsu.png
「 1二きりん」

20210713shogi100a1.png

ramen-tabero-futsu2.png
「 👆 こうかな」

20210713shogi101a1.png

ramen-tabero-futsu2.png
「 👆 じゃあ仮に 好手 だったとしようぜ。 評価値(Value)に 50点付けよう」

kifuwarabe-futsu.png
「 やったぜ!」

ramen-tabero-futsu2.png
「 きふわらべ、他の手も選んでくれだぜ」

20210713shogi102a1.png

ramen-tabero-futsu2.png
「 👆 おっと その前に アルファー値も 50 になるぜ」

ohkina-hiyoko-futsu.png
「 アルファー・アップデートね」

kifuwarabe-futsu.png
「 1一きりん」

20210713shogi103a1.png

ramen-tabero-futsu2.png
「 👆 こうかな」

20210713shogi104a1.png

ramen-tabero-futsu2.png
「 👆 じゃあ仮に これが あんまり良くない手で 3点 だったとしようぜ?」

kifuwarabe-futsu.png
「 なんてこった」

ramen-tabero-futsu2.png
「 アルファー値が 50点 なのに、 評価値(Value)が 3点 なんで、
アルファー値を 評価値が下回ったから、この指し手は不採用だぜ。
アルファー・アップデートなし だぜ」

ohkina-hiyoko-futsu.png
「 アルファー・アップデートなし なことに 何か名前はないの? 何とかカットとか」

ramen-tabero-futsu2.png
「 もう指しちゃった からな。 指したあとに この手は 低い点だな、と 不採用 を決めただろ。
そんなの ただの 選別 だぜ。 これは カット とは違う。
アルファー・カットや、ベーター・カットは 指す前 にやらないと、そう言わない。
こういうの 前向き枝刈り探索
根っこから 葉っぱに向かってるときにやるから 前向き という。
アルファー・アップデートなし は、葉っぱから根っこに向かってるときにやるから、 後ろ向き という」

kifuwarabe-futsu.png
「 名前 無いのか」

20210713shogi105.png

ramen-tabero-futsu2.png
「 👆 きふわらべは 1番大きな点数の 1二きりん を選ぶぜ」

20210713shogi106.png

ramen-tabero-futsu2.png
「 👆 すると アルファー値は 戻って……。
相手は この指し手が きふわらべから見て 50 点だと分かったんで、
50点より低い 評価値になる指し手を探したいな」

kifuwarabe-futsu.png
「 嫌なやつだぜ」

20210713shogi107a1.png

ramen-tabero-futsu2.png
「 ベーター値を 50点 にセットするぜ」

ohkina-hiyoko-futsu.png
「 ベーター・アップデートね」

20210713shogi108a1.png

ramen-tabero-futsu2.png
「 👆 相手は 別の手も指してみるが、まだ評価値は分かんないぜ。
他の枝と同じ深さまで指そうぜ。
きふわらべ、次の手を選んでくれだぜ」

kifuwarabe-futsu.png
「 2二ひよこ」

20210713shogi109.png

ramen-tabero-futsu2.png
「 👆 じゃあ 仮に 絶妙な手で 70点 だったとしようぜ?」

kifuwarabe-futsu.png
「 やったぜ!」

20210713shogi110a1.png

ramen-tabero-futsu2.png
「 👆 でも ここに 50点 がいるぜ?」

kifuwarabe-futsu.png
((((ワナワナワナワナ))))

ramen-tabero-futsu2.png
「 相手は 50点以下の手を探しているので、それ以上の 良い点 を見つけても 採用されないぜ。
ベーター値によってカットされるから、 これ、 ベーターカット

kifuwarabe-futsu.png
((((プンスカ ドォォォォン))))

20210713shogi111a1.png

kifuwarabe-futsu.png
「 👆 じゃあ こんな手 考えるの 止め止め! 探索を打ち切りだぜ!」

20210713shogi112.png

ramen-tabero-futsu2.png
「 それでも 相手さんは もっと ベーター値を下げれないかな、と別の手を探すぜ。
きふわらべ、次の手を選んでくれだぜ」

20210713shogi113.png

kifuwarabe-futsu.png
「 👆 40 点の手があったが、これは すでに見つけてある 50点の手より点数が低いんで 採用したくないんだが……」

ramen-tabero-futsu2.png
「 じゃあもっと 高い点数の手を探せだぜ」

20210713shogi113_5.png

ramen-tabero-futsu2.png
「 👆 その前に アルファー・アップデート だぜ」

20210713shogi114.png

kifuwarabe-futsu.png
「 👆 -20 点のダメな手があったぜ」

ramen-tabero-futsu2.png
「 アルファーアップデートしない ぜ」

ohkina-hiyoko-futsu.png
「 ああ、名前のないやつね」

kifuwarabe-futsu.png
「 2三きりん」

20210713shogi115.png

ramen-tabero-futsu2.png
「 43 点。
50点を下回っているから ベータカット されないし、
40点を上回ったから アルファー・アップデート だぜ」

kifuwarabe-futsu.png
「 結局 わたしが選べる枝になるときには 50点を下回る点になってるということだろ。
ベータカット されないと 嬉しくないな。
アルファー値で 底を上げてはいるけど。
これが ミニマックス なんだろうけど」

20210714shogi116.png

ohkina-hiyoko-futsu.png
「 👆 アルファー値以上の手にしたいし、ベータ値を超えると 採用されないし、
アルファー値と ベーター値の間で 手を探すことになるのねえ」

ramen-tabero-futsu2.png
「 分かったぜ!
これが コンピューター将棋プログラミングのお題の鉄板、 アルファーベーター探索 かだぜ!」

kifuwarabe-futsu.png
「 鉄板って何だぜ?」

ネガマックス(Negamax)

kifuwarabe-futsu.png
「 コンピューター将棋では、強いソフトが アルファーベーター探索を そのまま使うことは ほぼ無く、
もう一工夫している」

ramen-tabero-futsu2.png
「 フーン」

kifuwarabe-futsu.png
「 説明すると お父んが寝てしまうので 手順を進めながら やってみよう」

20210714shogi127.png

kifuwarabe-futsu.png
「 👆 ネガマックスは、絵で説明しにくいが、相手番も 自分の手番として考えようということだぜ」

ramen-tabero-futsu2.png
「 なんで そんなことをするんだぜ?」

kifuwarabe-futsu.png
「 コーディングが簡単になるから だぜ。
自分の番と 相手の番の2つを コーディングしなくてはいけないところを、
ネガマックス にすることで 自分の番 だけコーディングすれば よくなるんだぜ」

ohkina-hiyoko-futsu.png
「 2つやらなくちゃいけないことが 1つになったら 楽よねえ」

ramen-tabero-futsu2.png
「 なんで そんなことができるんだぜ?」

20210713shogi88.png

kifuwarabe-futsu.png
「 ネガマックスじゃなかったときは、 評価値は、わたしから見たものだぜ」

20210713shogi89.png

kifuwarabe-futsu.png
「 将棋は 二人零和ゲームなので、自分が良ければ相手が悪く、自分が悪ければ相手が良いぜ。
だから 手番が変わるときに 評価値の正負を入れ替えれば どちらの手番でも
自分から見た評価値(Value)になるぜ」

ramen-tabero-futsu2.png
「 フーン」

ohkina-hiyoko-futsu.png
「 プラス、マイナスを ひっくり返せばいいのは 評価値だけじゃないわよね。
あと 2つある」

ramen-tabero-futsu2.png
「 何があったっけ?」

20210714shogi118.png

ohkina-hiyoko-futsu.png
「 👆 アルファー値と、ベーター値よ」

ramen-tabero-futsu2.png
「 ありゃあ!」

20210714shogi119.png

ramen-tabero-futsu2.png
「 👆 わたしのとき ベーターさんに ベーター値より大きな値は ベーターカットされるが、
相手のとき わたしに アルファー値より小さな値は アルファーカットされるから、
うーん、
アルファー値と ベーター値は 交互になる……??」

kifuwarabe-futsu.png
「 お父ん、 アルファー値とベーター値が交互になる んだったら、ちゃんとそのような図を描けだぜ。
その図は 言葉通りに描けてないぜ」

ramen-tabero-futsu2.png
「 えっ!?」

20210714shogi120.png

ohkina-hiyoko-futsu.png
「 👆 交互に入れ替わるって、こうよね」

ramen-tabero-futsu2.png
「 フーム」

ohkina-hiyoko-futsu.png
「 それ以外のものも ひっくり返ってない?」

ramen-tabero-futsu2.png
「 どこがだぜ?」

20210714shogi121.png

ohkina-hiyoko-futsu.png
「 👆 この人が」

ramen-tabero-futsu2.png
「 その人は 誰と入れ替わるんだぜ??」

kifuwarabe-futsu.png
「 わたしじゃないのか?」

20210714shogi122a1.png

ramen-tabero-futsu2.png
「 👆 こんなとこ入れ替わって どうすんだぜ?
アルファー値と ベーター値を入れ替えたいのに、1段上の緑色のおっさんと入れ替わっていいのかだぜ?」

20210714shogi123a1.png

ohkina-hiyoko-futsu.png
「 👆 下にも おんなじ人が居んじゃないの?」

ramen-tabero-futsu2.png
「 そんな 無関係な人と 入れ替えていいのかだぜ?」

ohkina-hiyoko-futsu.png
「 おんなじ なんだから いいんじゃないの?」

kifuwarabe-futsu.png
「 お父んが苦手な、 シコーリョク というやつだな。
お父んは 頭の中で あれと これは 別の物だから 同じようにしてはいけないと考えるから シコー が停まるんだぜ。
別の物でも 同じように使えるなら 同じように使おうというのが シコー だぜ」

ohkina-hiyoko-futsu.png
「 合理性を受け入れられないのよね」

20210714shogi125a1.png

ramen-tabero-futsu2.png
「 👆 やったら!
あれっ、何も 入れ替わらね?」

kifuwarabe-futsu.png
「 何も入れ替わらないのなら、何もしなくていいのでは?」

ramen-tabero-futsu2.png
「 じゃあ 評価値(Value)のプラス・マイナスをひっくり返して、
アルファー値と ベーター値を 入れ替えたらいいのかだぜ?」

ohkina-hiyoko-futsu.png
「 シミュレーションしてみましょう!」

Negamaxのシミュレーション

20210714shogi128a2.png

ramen-tabero-futsu2.png
「 👆 初期配置は 変わんないだろ。
先手は最初から 10点 有利としようぜ。
あと 評価値バーのデザインを 一新したぜ」

kifuwarabe-futsu.png
「 1三きりん」

20210714shogi129a2.png

ramen-tabero-futsu2.png
「 👆 こうかだぜ?」

20210715shogi136.png

ramen-tabero-futsu2.png
「 👆 ここで知識だぜ。丸いとこを ノード(節;Node)、 線を エッジ(辺;Edge) と呼ぶぜ。
別の呼び方もあるが、この記事では これで行くぜ」

20210715shogi137.png

ramen-tabero-futsu2.png
「 👆 そして ネガマックス(Negamax)を理解するための 知識のパズルピースとして、
エッジに 箱を作ろう。 これが工夫」

kifuwarabe-futsu.png
「 お父んしか 使わないけどな」

20210714shogi130a2.png

ramen-tabero-futsu2.png
「 👆 そして 手番変更。
評価値バーの青いところを見てくれだぜ。
イラストを描き直すのが めんどくさいので バー自体を 180°回転するぜ」

ohkina-hiyoko-futsu.png
「 そんなこと 企んでいたのね」

kifuwarabe-futsu.png
「 検証しようぜ。 先手が +10点 なら、後手から見れば ー10点 だな。合ってるな」

ohkina-hiyoko-futsu.png
「 アルファー値と ベーター値の入れ替わりも確認したいのよ。これじゃ分かんないわよ」

ramen-tabero-futsu2.png
「 端っこの葉っぱまで、シミュレーションを続けようぜ?」

kifuwarabe-futsu.png
「 3二ライオン」

20210714shogi131a2.png

ramen-tabero-futsu2.png
「 👆 はい、手番変更。
評価値バーの青いところを見てくれだぜ」

kifuwarabe-futsu.png
「 先手から見た評価値(Value)に戻ってるな」

kifuwarabe-futsu.png
「 1四ライオン」

20210714shogi132a2.png

ramen-tabero-futsu2.png
「 👆 はい、手番変更。
局面評価値(Value)は 先手の得も込みで 20点 だったとしようぜ。
そして 後手から見た評価値だから、
評価値バーの青いところを見てくれだぜ。ひっくり返ってるな」

ohkina-hiyoko-futsu.png
「 -20点ね」

ramen-tabero-futsu2.png
「 ところで 説明のためにウソをついていたんだが」

kifuwarabe-futsu.png
「 ウソをつくなだぜ。やり直せ」

20210714shogi132a2_5.png

ramen-tabero-futsu2.png
「 👆 評価値(Value)というのは 先手番が有利だから最初から 10点 付いているというものではなく、
端っこの 葉の局面で計算されて 枝を戻っていく帰り道に付くものだぜ」

ohkina-hiyoko-futsu.png
「 プラス・マイナスをひっくり返して 箱に 20 を入れたのね」

20210714shogi133a2.png

ramen-tabero-futsu2.png
「 アルファー・アップデート は、エッジの箱の中の方の評価値を使うぜ」

kifuwarabe-futsu.png
「 1二きりん」

20210714shogi134a2.png

ramen-tabero-futsu2.png
「 👆 バー回転」

ohkina-hiyoko-futsu.png
「 ベータ値が -20 になってるけど、いいのかなあ?」

20210714shogi134a2_5.png

ramen-tabero-futsu2.png
「 👆 評価値(Value)は -60 点。
アルファー値 -∞ 以上、 ベーター値 -20 以下だから、いけるな」

kifuwarabe-futsu.png
「 それだと 悪い手、もっと悪い手 を探していかないかだぜ?
ネガマックスは 自分がいいと思っている手を探すんだろ」

ramen-tabero-futsu2.png
「 自分の手番のときは 自分にとって 良い手、良い手 を 探している し、
相手番のときは 自分にとって 悪い手、悪い手を 探している し、
物は言いようだな、
相手番のときは あとでプラス・マイナスがひっくり返るから いつでも自分にとって 良い手、良い手 を 探しているように説明できる んだぜ」

ohkina-hiyoko-futsu.png
「 ややこし!」

ramen-tabero-futsu2.png
「 もう少し シミュレーションを続けてみようぜ?」

20210714shogi134a2_75.png

ramen-tabero-futsu2.png
「 👆 1手 戻したら 評価値が +60 点に反転したぜ」

ohkina-hiyoko-futsu.png
「 プラス・マイナスが反転するのね。ややこし!」

kifuwarabe-futsu.png
「 相手番のとき 自分のアルファーが 相手のベーターになっていて、
自分のベーターが 相手のアルファーになってるな。
ベーターを右に動かすことがなくなって、アルファ―を左に動かしているだけ。
評価値(Value)が アルファーを下回るのは ただの アルファー・アップデートしない なので、
アルファーカットは無くなったな。
じゃあ、アルファーカットは無くなって、ベータカットだけが有るようになるのかだぜ?」

ramen-tabero-futsu2.png
「 そうなんじゃないか?」

20210714shogi135a2.png

ramen-tabero-futsu2.png
「 👆 アルファー・アップデート するぜ」

kifuwarabe-futsu.png
「 ノード(丸いところ)の評価値ではなく、エッジ(線のところ)の評価値を見て 比較するのか。
ややこし!」

ohkina-hiyoko-futsu.png
「 バーを180°回転させてるとこ、うまく コーディングできんの?」

雑なNegamaxのコーディングの説明

search(alpha, beta, depth):
    if depth == 0:
        # 葉ノード
        node_value = 局面評価値計算( )
        return  (node_value, _)

    bestmove = 投了
    move_list = 合法手生成( )

    for m in move_list:
        # バーが180°回転していることを実感しなさい(^~^)
        (node_value, _) = search(-beta, -alpha, depth-1)
        # エッジの箱を思い出しなさい(^~^)
        edge_value = -node_value

        if alpha <= edge_value:
            # アルファーアップデート
            bestmove = m
            alpha = edge_value

        if beta < alpha:
            # ベータカット
            break

    return (alpha, bestmove)

main( ):
    # 無限大とか使わず、十分大きな値で十分
    search(-30000, 30000, 4)

ramen-tabero-futsu2.png
「 👆 これが ネガマックスのアルファー・ベーター探索部 の雰囲気だぜ。
そのままコピー貼り付けしても動かないから、感じろ」

kifuwarabe-futsu.png
「 じゃあ お父ん、わたしに実装してくれだぜ」

<おわり>

何度でもクリック!→

むずでょ

光速のアカウント凍結されちゃったんで……。ゲームプログラムを独習中なんだぜ☆電王戦IIに出た棋士もコンピューターもみんな好きだぜ☆▲(パソコン将棋)WCSC29一次予選36位、SDT5予選42位▲(パソコン囲碁)AI竜星戦予選16位

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

むずでょ の最近の記事