rewritemath's blog

読者です 読者をやめる 読者になる 読者になる

将棋ソフトってどんな高速化の工夫がされているの?

近年の将棋ソフトは高速化のための命令がたくさんあって、選ぶのが面倒ですね。説明しておかなければ混乱する人も多いでしょうから、説明しておきます。


高速化とはなんだ

高速化とは、将棋ソフトの世界では基本的に、探索の速度の高速化のことをいいます。

 

探索とはなんです?

将棋ソフトはまず、その局面で可能となる指し手を生成します。そして、その局面を評価関数に当てはめて

(評価関数は名前の通り、関数です。だから変数として現在の局面の情報を取り込んで、返り値が評価値となるわけです。)

評価値をその局面につけます。


その局面についた評価値をもとに評価を出します。

 

でも、検討とかを長い時間続けると、評価値が変わっていくよ?

 そうです。それは何故かと言うと、実際に返しているのはその局面の評価値ではないからです。

 

将棋所とかで出る評価値は何なのか

先程、探索すると言いました。探索する時、生成した合法手(指し手)を羅列していきます。
そして、羅列が終わると、その局面を評価関数に投げて、値が帰ってくるとそれを保管します。

 つまり、たくさん生成した指し手があって、探索してそれが増えていくと、その先の指し手を探索するようになっていくのです。
先の指し手をどんどん生成して、未来の局面の評価値を返しているから、評価値がどんどん変わるんだ。


じゃあ、高速化ってなんなの?

 それが今日の本題だ。ここまでの話を聞けばこれからの話がスムーズに進められるようになっているはずだから、よく聞いてくれ。

 

用語の解説をするよ

わからなかったらググってください


OS

オペレーションシステム

WindowsMac,Linuxとかのこと。パソコンを動かす基本のソフトだ。それ自体がGUIだね。コンピュータの動作は内部では2進数しか使っていないけれど、それを変換して見えるようにしてくれている。デスクトップとかを表示したり、ファイルをドラックで移動したりするのもこれのお陰でできることなんだ。


x86,x64

32bit,64bitのことだ。詳しくは面倒だから言わないけど、そのパソコンに入っているOSのよって、32bitだったり64bitだったりする。それによって動かないものもある。詳しくはぐぐってくれ。x86と書いてあったら32bit用、x64と書いてあったら64bit用だ。

 

AVX,SSE

これだよ今回話したかったのは。これに混乱する人が多かったんじゃないかと思ってこれを作ったわけです。

どちらも、高速化のためにプログラマの方が使うCPU拡張命令です。え?日本語を使えって?ググってくれれば日本語だってよく分かるはずですよ。

AVXはインテル社の4世代以降のCPUに与えられた拡張命令です。開発コードhaswell以降です。え?わからない?

貴方のパソコンのCPUを調べて下さい。とりあえず2013年くらいに買ったものは怪しいから。対応してないかもだから。調べて。

SSEは多くのCPUが対応しているから、そう書いてあるのだったら大体大丈夫だよ。AVXより古い命令だから。一応、

AVX-SSE4.2-SSE4-SSE2

みたいな順番に、左から新しいよ。

AMDのCPU?対応しているのもあるから調べて。

調べるのが面倒な人は古いのを選んでおけば大体動くから安心して。人間がソフトと将棋を指して気がつく程には差がないから。

 

高速化のためにプログラマは拡張命令を使います。でも、CPUによっては、古いとその命令が使えないので動かない場合があるのです。

 

 

注意

スマホだとCPU(演算装置)がべつものだから動かないよ。SSEなしのやつを選べばいいんだよ。

 

 

 

将棋ソフトの使い方、ファイル名編

将棋ソフトのファイルは大きく分けて、


book

eval

engine

gui

 

の4つに分けることができます

 

bookファイル

定跡のファイルです。これがないと、定跡を使えません。拡張子は、.bin,.dbが主流だと思います。他にもあったかもしれないけど忘れた。

 

eval

評価関数です。これがないと、指し手の評価が全部おなじになってランダムだったり順番に生成された手を指したり、そもそもソフトを認識してくれなかったりします。

 

engine

本体です。拡張子は.exe以外ないと思います。こいつは他に、バイナリと呼ばれたりします。この本体は、指してを生成したり探索したりメモリを確保したりします。評価関数を読み込むのはこいつです。

 

gui

グラフィック・ユーザー・インターフェースの略です。shogiguiは、将棋のそれという意味ですね。shogidokoro(将棋所)もそれに当たります。プログラムは文字や2進数で値を持っていますから、それをグラフィックにする(可視化して見やすくする)ものです。

将棋ソフト、詰むのに詰まさない時、バグとは限りませんよ

  • このソフト、詰みチェックしたらきちんと詰んでるのに、詰まさないやん!弱いの?
  • とか、このソフトは詰みが読みきれない時があるから弱いでござる(笑)
  • とか、これくらいの詰み、詰みチェックにかければ一瞬で詰むのに、なんで詰まさないんや?バグ?

 

とか思ったことがある人へ。

 

バグだと騒ぎ立てるのはちょっと待って!バグじゃないかもしれませんよ!

 

 

原因1:256手ルール

256手で引き分けになるルールがあるんです。そのルールによって引き分けになるのを回避するために開発者の方が工夫をされている場合があります。

 

例えば、王手ラッシュを食らうと手数が長くなって引き分けに持ち込まれかもしれません。それを回避する手順があるかも。

他にも、詰ますより必至をかける方が手数が短くなる場合は、そちらを選択するかもしれません。王手のかからない玉型であれば尚更ですね。

詰ます手順は短い方を選択するというソフトはあると思います。

王手の連続で詰まさなくても勝ちが決まっている場合は、短い方を選ぶかもしれません。

原因2:枝刈りしちゃった(*ノω・*)テヘ

枝刈り、つまり、一定以上先の局面で詰みが見つかるような場合ですね。

それまでの手順に、駒を大量に捨てる手順がある時

途中で評価値の低い局面を経由する時

 

枝刈りしちったのかもしれません

 

原因3:詰まさないようにした方が強いもん

Aperyさんとかそうですね。今はどうか分かりませんけど。

@HiraokaTakuyaさん

https://twitter.com/HiraokaTakuya/status/708682048441942016?s=09

詰むかどうかを計算する時間があったら、他の手を読んだ方が勝率があがるんじゃ〜!

ということもあるみたいなんです。

 

原因4:詰みルーチンない、搭載面倒

そのまんまです。詰みを確認するルーチンをくっつけると詰みに強くなりますが、それをしないがために読み抜けるというパターンです。

 

終わりに

どうだったでしょうか。コンピュータにとっては、全体としての勝率が大事ですし、ルールによっては最適な戦略が異なります。

開発者の考え方も反映されているでしょう。

ソフトの癖なのかもしれません。

詰みが発見できないのは、バグだけが原因とは限らないんです。

そう思うと、開発者さんの苦労に思いを馳せて、詰ます事のできない時にも、優しくソフトを見守ってあげられるんじゃないでしょうか。

それでは〜

エヴェレットの多世界解釈の解説

量子力学の観測についての解釈の一つ。
人は、物体をを観測する時、主に光の反射でそこにものがあることを知ることができる。これは、機械にとっても同じだ。
もっと細かく見れば、光子という光の粒をぶつけて、それが帰ってくればそこに物があることになる。
何をぶつけても物があることは分かるのだが、帰ってこなければ仕方がない。ぶつかってくるまでの時間が早ければ、ものは近いことになる。遅ければ、遠いことになる。
大きい物をぶつけてしまうと、ぶつけた先のものがそれより小さい場合にそれを弾き飛ばしてしまって、帰ってこないかもしれない。
だから、ぶつける物は小さいものがいい。
ぶつける物の中で一番小さく、軽いものが光子である。
だから、光子は基本的に物の中での一番ちっさいから、帰ってくるものである。
つまり、帰ってきやすいから、そこにものがあることを知るためにぶつける物は、光子が最適ってこと。

さて、光子をぶつけてそこに物があることがわかるのは、ぶつかることによって光子が帰ってくる時間と方向が決まるからである。

じゃあ、帰っこなかったらどうだろう。何もわからないね。
光子よりちっさいものがあったら、それがそこにあるかどうかは、わからない訳だ。
光子と同じ大きさのものがあったら?弾き飛ばしてしまうね。
弾き飛ばしてしまったら、光子が帰ってきたとしても、もともとあった場所は分かっても、今どこにあるかは分からないんだ。

他にも、物があるかどうかを音等の波で確認する方法もあるが、その方法でも同じだ。弾き飛ばしてしまったり、そもそもそんな小さいものが相手じゃ波=振動は帰ってこない。


量子を扱う学問では、これが問題なんだ。
そこに物=量子があるかどうか確かめたいとする。
でも、光子をぶつけて、帰ってきたら、そこにあったことは分かるけど、今どこにあるのかは全く分からない。そもそも、吹き飛ばして光子が帰ってこない場合だってある。

だから、今、何処に、量子があるかは観測できないんだ。


これが量子の観測問題


代表的な量子には、光子や、電子なんかがある。

原子の周りを回っている電子も、同じようにどこにあるかは分からない。

 

どこにあるかが分からない物だけど、例えば原子の周りを回っているわけだから、その辺の何処かにあるってことは分かるわけだ。
だから、量子を扱うときは、その曖昧な状態を、確率で示すことになっている。

この辺に、このくらいの確率である。

そんな感じで示すんだ。


放射性元素について、その崩壊がいつ起こるかという問題がある。
放射性元素は、状態が不安定だから、いつか壊れて、そのままの状態を保てなくなる。
その時に飛び出す破片が、放射線になる訳。

放射線元素がそこにたくさんあったとして、それを、旗を挙げる人で例えよう。

旗を上げてって言った時に、皆が50%の確率で手を上げるとする。
一人の人が、その時旗を挙げるかどうかは中々分からないね。
でも、その人が1万人居て、何人が旗を上げるかっ考えたら、大体半分の5千人だ。

確率が分かると、多くの母体がある場合の大体の結果がわかる。


その人が2回に1回の確率で旗を上げる人だと分かっていて、その人が次に旗を挙げる人かどうかを考えたいとしよう。

こういう時、その人をどう見るのかというのが、量子力学観測問題の課題になる。

量子力学の時この課題は、物体が粒子か波かという様な話になる。

この人が旗を上げる人かどうかっ考えよう。
答えの1つは、
この人は半分は旗を挙げる人、半分は旗を挙げない人っていう、両方の性質を持った人だ!
って答え。

答えの2つ目こそが今回言う、多世界解釈
この人と同じ人は別の平行世界(パラレルワールド)にも居て、この世界の人が旗を挙げる人なら、他の世界のこの人は旗を挙げない人なのさ!

という解釈の仕方。

旗を挙げる人を見た時の反応は、

1だと、この人は旗を挙げる人だったんだ。
2だと、別の世界のこの人は旗を挙げない人。この世界の人は旗を挙げる人だったのね。

という解釈になる訳。

多世界解釈による、『君の名は』の考察、解釈

今後連載として書いていくことになるので、更新をちょくちょく待っていて欲しい。

以下にて、更新情報を残すのでお待ち下さい。

https://twitter.com/ritomath01_05?s=09

第一回は、エヴェレットの多世界解釈の解説である。ということで次の記事がそれになる。

エコキャップとかレジ袋削減とかに潜む悪

皆様、エコとか、資源のムダの削減とか聞いて、何を思いますか?

善意が産んだ悪ほどに悲しいものはないのです。

 

 

  • エコキャップでワクチンを買って子供を助ける
  • プルタブを集めてリサイクルすれば車椅子が作れる
  • 袋忘れたから(レジ袋買いたくないし)車で家に取りに戻らなきゃ

あぁ…

 

もしこれらのどれかに同調するのであれば、もう少し貴方は物事を考えて下さい。

 

例えばエコキャップ運動

 

私、学校でキャップを洗ったり、分別したりする手伝いをさせられたことがあります。

三時間くらい掛けて、数百のエコキャップを洗ったでしょうか(キャプの形状はかなり凹凸があるので、洗うのは大変です)

たった数百です。三時間くらい掛けて、まぁそこそこの労働です。

 

さて。数は覚えていませんけれども、仮に800個だったとして話を進めさせていただきます。(実際は当然もっと少ない)

 

HELLO FIVE eco エコキャップ運動

このページによれば、

ポリオワクチン(小児麻痺)は一人20円で、約800個のキャップが必要になるのだそうです。

幾つかの情報源から調べましたが、500~900まで、幅広い数が見られました。800強と考えるのが良さそうです。

 

今、どう思ったでしょうか。え?どうとも思わない?

もう一度いいます。一回20円、必要なキャップは800個(漢数字と算用数字の表記ゆれは気にしないでください。)

さて、配送料はいくらになるんでしょうね。人件費はいくらになるんでしょうね。

 

ボランティアが人権費なんて言うなとお思いの方は、この画像もみてくださいな。

NPO法人エコキャップ推進協会 – 「キャップを捨てるのはもったいない」-これがキャップを集め始めた”きっかけ”です

から持ってきました。

 

f:id:rewritemath:20170228122654p:plain

雇用創出とは一体…

賃金が発生しているんでしょうか。800個仕分けて20円になるんですが、それでも、賃金は発生しているのでしょうか。

賃金がその中から発生しているとすれば、どれだけ低賃金で働いているんだ…労働者はひどい搾取を受けているとしか考えられないんだが…。

 

他にも黒い噂は絶えませんが…

www.itmedia.co.jp

この問題では、同日付けの朝日新聞が、同協会がキャップの売却益があるにもかかわわらず、ワクチン代を寄付していないことが分かったと報道。記事によると、同協会の矢部信司理事長は事実関係を認め、「(キャップを集めている協力者を)裏切り申し訳ない」と話したという。

 

どうあれ、回収効率が以上に悪いのは確かです。他のバイトをして、一時間働いて900円とします。それを寄付すると、900÷20×800=36000個分のキャップを寄付したことになります。

ジュース一本150円と仮定して、ジュース換算で540万円分になりますね。ジュース一本我慢して、それを寄付すると、キャップ800×7.5=6000個分の寄付になります。

これをどう考えるかは自由ですが、どう考えたって資源の無駄遣い(輸送用の石油とか)をしてしまっているのはエコキャップ運動側なんですよね。

どういった切り口で見ても、明らかに無駄なことしてんなって思うわけです。

 

 

 

ここまで言えば、プルタブとかレジ袋とかについても、あれ…おかしい…と思えるでしょう。

 

 

実は、CO2の排出削減だって、もっと効果的な方法があるんです

 

f:id:rewritemath:20170228124848p:plain

 

こんな(先ほどと同じサイト)無駄なことしなくても。

 

例えば、今ではもっと全然安いですけれど、最高価格でも、1トンの排出枠が4000円です。

カーボン・オフセットというんですが誰かが削減したCO2を、自分が削減したことにする権利が買えます。CO2が1トンで、現在は1000円を切っているはずです。

 

日本人は、年間で一人あたり10トン排出している事になっています。(工場とかの排出も割り振られているので個人としてはもっと少ないが)1万円分です

4-7 一人当たりの二酸化炭素排出量(2014年度) - JCCCA 全国地球温暖化防止活動推進センター

ここによれば、一人あたり2200kgの排出だそうです。

 

つまり、(一般家庭平均、工場とかは除く)一人200円ほどでCO2を排出していないことにできる計算ですね。

 

ちなみに今日(2017/02/28、午後1時42分)の排出量先物価格は、1トンあたり5.20ユーロで、日本円にすると620円でした。

ここから家庭あたり2200kgの排出として排出権を仮に購入しますと、年間136円であなたのCO2排出量はなかったことにできます。安い。安すぎる。

 

 

要するに、効率のいいところで削減するのが一番いいってことです。それだけじゃあ罪悪感があるって人は、ほんの少しだけ出資して、例えば排出権を買ってみてもいいかもしれませんね。

エコキャップ運動に参加しないことに罪悪感があるなら、少しだけ寄付してみるのもいいんじゃないでしょうか。

 

 

殆ど貢献していないのにいいことした気になっている人より、全然いいことしたことになりますよ。

 

正義は必ず勝つについての新しい解釈

正義は必ず勝つ、というのは、昔から言われている定型句のように思います。

この言葉についての一般的な解釈としては、正義が勝つのは、そうやって製作者が作品を作るのが一般的だからというのが有力と見られているのではないでしょうか。

 

無論、この言葉の解釈について、正しい解釈などあるはずもありません。

 

例えば、この言葉を記録上最も言ったのが古い人、又はこの言葉が使われてそれが有名になった最初の場面、等々を調べて、その言葉の真意を尋ねれば、それらしい正しい解釈とかいうものが得られるかもしれませんが。

 

そもそも、とここから話が少し脱線するのでご容赦下さい。

そもそも、汎用的に使われるようになる言葉や、流行る言葉といいものは、概して多様な解釈を許す程には抽象化されています。

最初に言い出した人の真意はともかく、それが間違った解釈を伴おうとも、多くの場面で使われるようになる言葉というのは常に、それぞれの場面でそれぞれの場面に適した解釈の余地を残す言葉だということになります。

 

故に、特に言った人が分からない言葉なんかは、解釈や、使う場面は自由だとも言えます。

しかし、誰かの言葉として使う場合は、言い出した本人の真意とは違う用法で使われるようでは、本人も本意ではないでしょうから、一度は調べてみるのもいいと思いますよ。

 

あと少しだけ雑談を続けさせていただきますので御了承下さい。

汎用性の高い言葉が流行る、言い方を変えると、汎用性の高い言葉でなければ流行ることなど出来ない訳であります。

 

ここでその例として、一時期流行ったお笑い芸人のネタを一例に上げます。知らない方は温かい目で無視していただいて結構です。

 

  • そんなの関係ねえ
  • グー

 

…あれ、案外思いつかないものですね。思いつく方はきっとまだまだ思いつくだろうと思います。コメントして下さってもいいんですよ?

 

 

 

さて、正義は必ず勝つ、の話、本題に戻ります。

こういった解釈は如何でしょう。

 

正義は負けを認めない、正義の意思は死なない

 

 

例えばアンパンマン。一度痛い目を見て(敗北して)その後で勝つパターンになります。

というか、アンパンマンに限らず、正義の味方というものが活躍するものは大抵、悪が正義や正義の仲間に勝った後に正義に負けるというパターンです。

 

正義の勝利条件が悪を成敗することなら、悪の勝利条件は成敗されないこととなってしまいますが、これは悪があまりに不利ですね。

 

正義に対して、成敗される前に悪事をどれだけ働けるかで悪のスコアが決まり、ハイスコアである程正義は負けの度合いが高く、悪事を働く前に正義がそれを止めたら正義の勝ちだと仮定したなら、今度は殆どの悪は勝利していることになります。

 

 

そもそも、大衆にとっての、客観的な、社会的な悪とは、多数から嫌われる存在のことです。

嫌われる存在が大衆から排除されるとしたら、多勢に無勢、いつも少数派の悪は不利なのです。

ただでさえ不利なのに、正義に対する勝利条件はなく、敗北条件は厳しい。

 

悪が蔓延る世が中々作られない訳です。悪に共感する者はそもそも少ないというのも、戦力調達にマイナスですね。

 

それだけ条件の厳しい戦いでありながら、悪が一時世に蔓延ったとしても、敗北時にはこの戦いは正義が勝ったということにされてしまうのですから、そもそも悪と定義された時点で負けはほぼ決まったようなもんです。

 

悪がこれだけ不利な条件なら、正義は必ず勝てるわけですね。

 

 

最後に、言葉の妙、そして、それが終わった途端に敗北だということをよく示している言葉を送りましょう。

 

 

禁煙なんて簡単だよ。何せ僕は、もう何回もやっているからね。

マーク・トウェイン

 

 

(一応解説など必要ないとは知りつつ、老婆心で解説致します。二度目の禁煙が出来るということは、禁煙の後またタバコを吸い始めているということです。それはつまり、一度目の禁煙に失敗したということ。禁煙など簡単だよと言いながら、繰り返し失敗を繰り返しているというジョークです。)