daruma3940の日記

理解や文章に間違い等あればどんなことでもご指摘お願いします

息抜き

f:id:daruma3940:20160520223745p:plain
院試の勉強つまらんので息抜きに将棋盤アプリ作り始めてみたら
息抜きのほうに力が入ってしまっていたのじぇ......

f:id:daruma3940:20170816224032p:plain

f:id:daruma3940:20160521003616p:plain
何やってんのよ....
f:id:daruma3940:20160520223745p:plain
なにやってんだろうなぁ~~~~~~~~~~~~~~~~
f:id:daruma3940:20160520223745p:plain
うちの教授陣は優しいのできっと....きっと私の解けなかった問題の配点を0点にしてくれるはずなのじぇ.....
f:id:daruma3940:20160709192554j:plain
....(;^_^A

Rotated Bitboardなのじぇ


Rotated Bitboardについての解説をしようじぇ?

Bitboardについての解説は以前の記事を見てくれだじぇ。
daruma3940.hatenablog.com




SquirrelはRotated Bitboardを使って効きのある升を計算しているよ!


最近はPEXTbitboardとかもあるらしいじゃない?どうしてRotated Bitboardを使うの?

https://twitter.com/search?q=Rotated%20from%3Amerom686&src=typdtwitter.com
mermoさん曰くPEXTよりも早いそうなのじぇ。
そしてまりちゃのPCはアルバイトして買った学習用i7-4770K以外のPCはAVX2に対応していなくてPEXTは使えないのでRotatedにせざるを得なかったのじぇ。


Bitboardによる効きの表現は効きのあるマスに対応するbitを1にすることである駒がどこに効きを作っているのかを表現するというものなのじぇ。
しかし長い効きを持つ駒の場合効きを遮る駒がどこにあるのかによってどこまで効きを伸ばすことができるかが変わってくるのじぇ。
そこで、(とびゴマの位置、邪魔ゴマの位置)全通りに対してどこに効きを発生させることができるかのTable集を作成し、どこに邪魔ゴマがあるかをindexにしてそのテーブルを引っ張ってくることで効きを表現しようという方法なのじぇ。


例えば
青いマスを邪魔ゴマがいるマス、赤いマスを効きを発生させている駒の升だとすると

この図で4の場所にいる飛車の縦方向のききを求めたければ
TateKikiTable[4(効きを発生させる駒の場所)][(bitboard>>1)&(7)] のようになるのじぇ
今のbitboardをシフトして必要なところだけマスクして取り出すことによって Tableのindexを作成できるのじぇ


この場合は
TateKikiTable[31(効きを発生させる駒の場所)][(bitboard>>28)&(7)]になるのじぇ


しかし横の効きを求めるためにはこのマスの番号のつけ方では

シフトとマスクではindexを作れないのじぇ。

そこでこのbitboardを90度回転させたboard(bitboard90とする)を作成すれば

これはさっきと同じようにシフトとマスクでindex作成できるのじぇ。


実際のbitboardは64bit整数2つ(ここではint64_t bb[2]とする)で作られるためbb[0]かbb[1]かどちらを参照するべきかも指定しないといけないためもうちっとふくざつになるのじぇ
斜め+45度斜め-45度についても似たような感じなのじぇ。

もし将棋の駒がすべて近接駒ならRotated Bitboardなんて技術は必要ないのじぇ。
Rotated Bitboardは長い効きを持つ駒の効きを考慮するために必要なのじぇ

ちなみにこれがSquirrelにおけるRotated Bitboardの設計図なのじぇ



あと駒のいる位置を表しているbitboard(occupied bitboad)は
回転無し,90度回転+45度回転,-45度回転の4つ保持しないといけないのだけれど

縦方向の効きは1段目9段目に邪魔ゴマがあっても1段目9段目に効きを作ることができるので縦方向occupiedbitboardは1段目9段目を表すbitを除いて7*9=63bitあればよく
横方向も1筋目9筋目のbitはいらないので7*9=63bit
斜めはそれぞれ7*7=49bitあればよいので
実はoccupiedbitboardはすべて256bitに収めることができ
これによって駒が動いた時のoccupiedbitboardのこうしんの処理はSIMD演算を使えば一気に処理できるのじぇ。
これを用いれば結構高速化できた記憶があるのじぇ

open ai gym[atari]をwindowsでも使えるようにしようじぇ??

f:id:daruma3940:20160520223745p:plain
なんかopen ai gym[atari]をwindows環境で

 pip install gym[atari] 

しようとしたらインストールできなかったので
ビルドする方法をいろいろ調べてやってみたのでここに書き記しておきのじぇ
ちなみにbash on windowsとか vcXsrv とか使うのはめんどくさいのでそれを使わない方法なのじぇ(MSYS2は使ってる)
f:id:daruma3940:20160520223745p:plain
まあこのQuitaの方法のそのまんまなのでこれ読めばわかるって人はこれ読んでくれだじぇ
qiita.com

f:id:daruma3940:20160520223745p:plain
github.com
このissueの
f:id:daruma3940:20170813025408p:plain
この投稿に注目なのじぇ

github.com
どうやらこれをつかえばいいらしいのじぇ?

pip install -U git+https://github.com/Kojoley/atari-py.git

f:id:daruma3940:20160520223745p:plain
まりちゃのPCにはすでにMSYS2環境はすでにあってそこにpathも通っていたので
Visualstudio 2015のC++ビルドツールさえ用意すれば うまくいったのじぇ

f:id:daruma3940:20170813025746p:plain
(このソースは
github.comより

)
f:id:daruma3940:20160520223745p:plain
うむ!ちゃんと動いてるみたいなのじぇ!



f:id:daruma3940:20170813025834p:plain

f:id:daruma3940:20160520223745p:plain

早く公式で対応して..(懇願)

open ai gym[atari]をwindowsでも使えるようにしようじぇ??

f:id:daruma3940:20160520223745p:plain
なんかopen ai gym[atari]をwindows環境で

 pip install gym[atari] 

しようとしたらインストールできなかったので
ビルドする方法をいろいろ調べてやってみたのでここに書き記しておきのじぇ
ちなみにbash on windowsとか vcXsrv とか使うのはめんどくさいのでそれを使わない方法なのじぇ(MSYS2は使ってる)
f:id:daruma3940:20160520223745p:plain
まあこのQuitaの方法のそのまんまなのでこれ読めばわかるって人はこれ読んでくれだじぇ
qiita.com

f:id:daruma3940:20160520223745p:plain
github.com
このissueの
f:id:daruma3940:20170813025408p:plain
この投稿に注目なのじぇ

github.com
どうやらこれをつかえばいいらしいのじぇ?

pip install -U git+https://github.com/Kojoley/atari-py.git

f:id:daruma3940:20160520223745p:plain
まりちゃのPCにはすでにMSYS2環境はすでにあってそこにpathも通っていたので
Visualstudio 2015のC++ビルドツールさえ用意すれば うまくいったのじぇ

f:id:daruma3940:20170813025746p:plain
(このソースは
github.comより

)
f:id:daruma3940:20160520223745p:plain
うむ!ちゃんと動いてるみたいなのじぇ!



f:id:daruma3940:20170813025834p:plain

f:id:daruma3940:20160520223745p:plain

早く公式で対応して..(懇願)

カオスについて

f:id:daruma3940:20160520223745p:plain
暇なのでカオスについてかたろうじぇ?
f:id:daruma3940:20160521003616p:plain
いきなりね

f:id:daruma3940:20160520223745p:plain
カオスの定義はいろいろあるけれどたぶん「初期値俊敏性を持っていて決定論的であるもののこと」なのじぇ
f:id:daruma3940:20170803230209p:plain

この図でいう
{ \displaystyle
\lambda > 0 
}
を持つものなのじぇ



f:id:daruma3940:20160520223745p:plain
昔流れてきたこのツイートも大まかに言ってカオスなのじぇ。

f:id:daruma3940:20160521003616p:plain
はぇ~~~

f:id:daruma3940:20160520223745p:plain
2次元調和振動子の場合を考えてみようじぇ。
これがハミルトニアンなのじぇ
{ \displaystyle
H_0 = \sum_{i=1,2} (p_i^2+\omega_i^2q_i^2)/2 
}

f:id:daruma3940:20160520223745p:plain

f:id:daruma3940:20160520223745p:plain
見ての通りこの場合ハミルトニアンはx方向のものとy方向のものに分離できるのじぇ。
{ \displaystyle
H_0 = \sum_{i=1,2} (p_i^2+\omega_i^2q_i^2)/2 ≡  H_{0x}+H_{0y}
}
そしてこれら
{ \displaystyle
H_{0x}  と H_{0y} は保存されるのじぇ。 
}
{ \displaystyle
\{H_x,H\}_{classical} =dH_x/dt=0     ---(1)
}

f:id:daruma3940:20160520223745p:plain
xについて見てみるとこれは位相空間的に周期的なのじぇ。

f:id:daruma3940:20170804214947p:plain

そしてもちろんyについても周期的なのじぇ。
xについても周期的そしてyについても周期的ということはこれは位相空間上でトーラスになるのじぇ。

f:id:daruma3940:20170804215634p:plain

f:id:daruma3940:20160520223745p:plain

ここでさっきの方法をちょっとだけ変えてトーラスであることを示すのじぇ。
(1)のハミルトニアンの力学変数を作用変数
{ \displaystyle
 J_i=(2\pi)^{-1} \oint p_i dq_i  
}
と角変数
{ \displaystyle
 \phi_i = \omega_i t  
}
に正準変換してみようじぇ。
まあ難しいことしなくてもここでは調和振動子なので作用変数は
縦軸
{ \displaystyle
\sqrt{2E}
}
横軸
{ \displaystyle
\sqrt{2E}/\omega
}
の楕円になるので
f:id:daruma3940:20170805124806p:plain

楕円の面積の公式
{ \displaystyle
 S=\pi ab
}
を用いれば
{ \displaystyle
 S=2 \pi E / \omega \\
より \\
J=E/ \omega
}
このように計算でき、ハミルトニアン
{ \displaystyle
H_0 = \sum_{i=1,2} \omega_i J_i ≡  H_0(J_1,J_2)
}
このように書き直せるのじぇ。
ここで
{ \displaystyle
 dJ_i/dt=-\partial H_0  /\partial \phi_i =0 
}

であるので{Ji}は保存されるのじぇ。
これによってさっきの話と同じようにトーラスになることが分かったのじぇ。



f:id:daruma3940:20160520223745p:plain
今度はこれに非加積分摂動を与えた場合を考えようじぇ。
{ \displaystyle
H_0 =   H_0(J_1,J_2)  + \epsilon \sum_{m,n} f_{m,n}(J_1,J_2)cos(m \phi_1 + n \phi_2)  ---(2)
}
非加積分摂動はフーリエ展開の形で与えるのじぇ。

ここで母関数を
{ \displaystyle
W= J'_1 \phi_1 + J'_2 \phi_2 +\epsilon \sum_{m,n} g_{m,n}(J'_1,J'_2)cos(m \phi_1 + n \phi_2)
}

として 新しい作用、各変数
{ \displaystyle
  \{  J'_i , \phi '_i   \}
}
を導入した正準変換を考えると
{ \displaystyle
 J_i= \partial W/\partial \phi_i= J'_1 +\epsilon \sum_{m,n}  (m\delta_{i 1}+n\delta_{i 2}) g_{m,n}(J'_1,J'_2)cos(m \phi_1 + n \phi_2)
}

なので(2)をJ'iの周辺でテーラー展開したものは,
{ \displaystyle
H =   H_0(J'_1,J'_2)  + \sum_{i=1,2} ( \partial H_0/\partial J_i ) (  J_i -J'_i )+ ... \\
=  H_0(J'_1,J'_2)  + \epsilon \sum_{m,n}  [ f_{m,n}+  (m\omega_1+n\omega_2)g_{m,n} ] cos(m \phi_1 + n \phi_2) +O(\epsilon^2)
}

になるのじぇ。

。もし摂動が小さく任意のm,nに対して
{ \displaystyle
 | f_{m,n} | << | m\omega_1+n\omega_2 |
}
が成立するのであれば、
{ \displaystyle
g_{m,n}=-f_{m,n}/(m\omega_1+n\omega_2)    (<<1)
}
のようにgを選ぶことでテーラー展開のεの一次の項を消すことができるのじぇ。
もし
{ \displaystyle
\gamma=\omega_1/\omega_2
}
有理数の場合は分母を発散させるm,nの選び方ができてしまうのでg関数は決まらないけれど、
有理数の数は無理数の数に比べてとても少ないのでそれは無視できると考えられるらしいのじぇ。

この手続きをεの高次の項に対しても繰り返すことで高次の項を消去でき、
ハミルトニアンは結局
{ \displaystyle
H=H_0(J^{(∞)}_1,J^{(∞)}_2)
}


となり、元のトーラスは変形して新しいトーラスができるのじぇ。
これを Kolmogorov-Arnold-Moser(KAM) トーラスというらしいのじぇ。
f:id:daruma3940:20160520223745p:plain
gをどう選ぶかの話のにいろいろ疑問を持つ人は多いと思うけれどそこはかなり難しい数学の議論でKolmogorov-Arnold-Moserの論文に詳しく書かれているらしいのじぇ。



。もし摂動が大きくなってくると、
{ \displaystyle
 | f_{m,n} | >> | m\omega_1+n\omega_2 |
}
となり、
{ \displaystyle
 | g_{m,n} |<< 1
}
となる母関数を得ることができず、εの一時の項を消せないためトーラスは崩壊するのじぇ。これがカオスの発生なのじぇ。


ところでなぜ母関数が
{ \displaystyle
 | g_{m,n} | << 1
}
を満足しなければならないのかはまりちゃにはわからないのじぇ(詳しい人いたら教えてください。)


f:id:daruma3940:20160520223745p:plain
本の内容をブログに書いてみればよくわかるんじゃないかと思ったけれど
大事で気になるところがはしょられているのでいまいちよくわからんって感じなのじぇ
f:id:daruma3940:20160520223745p:plain
トーラスが崩壊してカオスがどのように作り出されるか
ポアンカレマップ、面積保存写像、孤立固定点についてkicked rotator modelの図を交えた話はまた今度気が向いたらなのじぇ


~~~~追記~~~~
f:id:daruma3940:20160520223745p:plain
KAMトーラスなんて現実世界に現れるのかと思うかもしれないけど
うちの教授によるとなんと土星の環がKAMトーラスらしいのじぇ
土星の太陽を回る周期と,土星の輪をなしている塵が土星の周りを回る周期でトーラスを形成しほかの惑星によって及ぼされる引力が微小な摂動となり
周期比が有理数比から遠いところだけが輪として残っているということらしいのじぇ
f:id:daruma3940:20171116212310j:plain
写真はここから
solarsystem.nasa.gov

f:id:daruma3940:20160521003616p:plain

ちょっとまりちゃ。最近全然将棋プログラム書いてないじゃない!

次の電王トーナメントのために何かしなさいよ!

f:id:daruma3940:20160520223745p:plain

一応電王トーナメントに関係することはしているのじぇ。

f:id:daruma3940:20160521003616p:plain

え?何してるの?

f:id:daruma3940:20160520223745p:plain

ゲーム作ってるのじぇ。

f:id:daruma3940:20160521003043p:plain

は?

f:id:daruma3940:20170716150153p:plain

 

f:id:daruma3940:20160520223745p:plain

Tower of DenOuなのじぇ。

f:id:daruma3940:20160521003616p:plain

えぇ....

f:id:daruma3940:20160520223745p:plain

せかいの まんなかにたつ とうは

でんおうに つうじている という


はるかな でんおうを ゆめみて
おおくの ものたちが
このとうの ひみつに いどんでいった 
だが かれらの うんめいを
しるものはない

そして いま またひとり‥‥

f:id:daruma3940:20160521003616p:plain

魔界塔士かよ!

 

f:id:daruma3940:20170716150538p:plain

f:id:daruma3940:20160520223745p:plain

あの鳥はcoduck,あのうさぎはlesserpyonなのじぇ

ゲームとしてはロックマン的な感じにしたいのじぇ。

f:id:daruma3940:20170716150900p:plain

f:id:daruma3940:20160520223745p:plain

これが最初のボスうさぴょんなのじぇ。

ジャンプしながら攻撃を仕掛けてくるのじぇ

 

f:id:daruma3940:20170716151018p:plain

f:id:daruma3940:20160520223745p:plain

これはBonanza。3駒連携攻撃をしてくるのじぇ。

 

f:id:daruma3940:20170716151143p:plain

f:id:daruma3940:20160520223745p:plain

これは技巧。

いまいち仕様が決まってないのじぇ。

f:id:daruma3940:20170716151340p:plain

f:id:daruma3940:20170716151436p:plain

f:id:daruma3940:20170716151636p:plain

f:id:daruma3940:20160520223745p:plain

ゲーム開発は楽しいのじぇ。

 

f:id:daruma3940:20160520223745p:plain

ちなみにちょっと遊べるぐらいのクオリティになってきたので友達にテストプレイとして公開してみたけどだれも遊んでくれなかったのじぇ
この「遊んでくれてありがとう」画面を作った意味がなくなってしまったのじぇ

f:id:daruma3940:20170716151942p:plain

f:id:daruma3940:20160521003616p:plain

ざんねんね。

f:id:daruma3940:20160520223745p:plain

今の課題としては難易度調整がダメダメで技巧よりもうさぴょんのほうが強くなってしまっていること、ボリュームが足りていないこと、音楽を自作しようとしているが全然作曲ができていないことなのじぇ。

 あとこういうサガフロみたいな感じのゲームつくるのも面白そうだじぇ

 

 

備忘録

http://www2.computer-shogi.org/wcsc27/appeal/Apery/appeal_wcsc27.html
なんで強いソフト深い探索の評価値に今の局面の評価値を近づける学習方法使う時に静止探索の末端局面の特徴に対して更新しているのか?


静的な局面でないとあまり正確な局面評価ができない
つまり今の評価関数は静止探索をする前提である
今の評価関数では静止探索を表現できない?(手番があればある程度はできるような気がするのだけれど。しかしまあ最新の強いソフトがまだ静止探索をしてるってことはまあそういうことか。DNNほどの特徴があれば静止探索も表現できるだろうが静止探索するより遅いので論外)
静止探索を前提としているということはつまり今の評価関数には静止探索も含まれているということ?


Stockfish探索では静止探索はleaf nodeでしか呼び出されない。すべてのゲーム木内のノードで静止探索が呼び出されるわけではない。つまりleaf以外では完全な評価はできていないので前向き枝切りの精度が悪い?

この点ソースコードを見直してみると多くの前向き枝切りで静止探索をした点数を用いていたため大丈夫そう。
唯一使ってなかったのがfutility prunning。
これも静止探索した方がいいと思うがそれだとrazoringとかぶるよなとも思う。
この辺よくわからん

そして静止探索の末端局面の評価値を深い探索の値に近づけている都合上、ノードの評価値が深い探索の値に近づいているかといわれると直接的に近づいているわけではない
(しかし反復進化の考えによると一度はleaf nodeであったことがあるはずで静止探索の値がTTに格納されているはずなのでそこまで気にする必要はないのか?しかしnullwindowsearchとか枝切りとかが起こると読まれないし...)

RootStrapで静止探索をせずにRootの局面に対して値を更新する?
通常探索用の評価関数(手番付き)(rootにそのまま深い探索の値を近づける)と静止探索用の評価関数を用意する?(取り合いを読ませた後なら手番がなくても表現できるはず)(しかし取り合いがいつ終わるのかということはStandPatなどの影響で簡単にはわからない この辺がネック)