息抜き
院試の勉強つまらんので息抜きに将棋盤アプリ作り始めてみたら
息抜きのほうに力が入ってしまっていたのじぇ......
何やってんのよ....
なにやってんだろうなぁ~~~~~~~~~~~~~~~~
うちの教授陣は優しいのできっと....きっと私の解けなかった問題の配点を0点にしてくれるはずなのじぇ.....
....(;^_^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でも使えるようにしようじぇ??
なんかopen ai gym[atari]をwindows環境で
pip install gym[atari]
しようとしたらインストールできなかったので
ビルドする方法をいろいろ調べてやってみたのでここに書き記しておきのじぇ
ちなみにbash on windowsとか vcXsrv とか使うのはめんどくさいのでそれを使わない方法なのじぇ(MSYS2は使ってる)
まあこのQuitaの方法のそのまんまなのでこれ読めばわかるって人はこれ読んでくれだじぇ
qiita.com
github.com
このissueの
この投稿に注目なのじぇ
github.com
どうやらこれをつかえばいいらしいのじぇ?
pip install -U git+https://github.com/Kojoley/atari-py.git
まりちゃのPCにはすでにMSYS2環境はすでにあってそこにpathも通っていたので
Visualstudio 2015のC++ビルドツールさえ用意すれば うまくいったのじぇ
(このソースは
github.comより
)
うむ!ちゃんと動いてるみたいなのじぇ!
早く公式で対応して..(懇願)
open ai gym[atari]をwindowsでも使えるようにしようじぇ??
なんかopen ai gym[atari]をwindows環境で
pip install gym[atari]
しようとしたらインストールできなかったので
ビルドする方法をいろいろ調べてやってみたのでここに書き記しておきのじぇ
ちなみにbash on windowsとか vcXsrv とか使うのはめんどくさいのでそれを使わない方法なのじぇ(MSYS2は使ってる)
まあこのQuitaの方法のそのまんまなのでこれ読めばわかるって人はこれ読んでくれだじぇ
qiita.com
github.com
このissueの
この投稿に注目なのじぇ
github.com
どうやらこれをつかえばいいらしいのじぇ?
pip install -U git+https://github.com/Kojoley/atari-py.git
まりちゃのPCにはすでにMSYS2環境はすでにあってそこにpathも通っていたので
Visualstudio 2015のC++ビルドツールさえ用意すれば うまくいったのじぇ
(このソースは
github.comより
)
うむ!ちゃんと動いてるみたいなのじぇ!
早く公式で対応して..(懇願)
カオスについて
暇なのでカオスについてかたろうじぇ?
いきなりね
カオスの定義はいろいろあるけれどたぶん「初期値俊敏性を持っていて決定論的であるもののこと」なのじぇ
この図でいう
を持つものなのじぇ
予想しようとする努力を微塵も感じない。 pic.twitter.com/Gu1eWI301o
— 土田善紀 (@tsuchidasama) 2017年8月1日
昔流れてきたこのツイートも大まかに言ってカオスなのじぇ。
はぇ~~~
2次元調和振動子の場合を考えてみようじぇ。
これがハミルトニアンなのじぇ
見ての通りこの場合ハミルトニアンはx方向のものとy方向のものに分離できるのじぇ。
そしてこれら
xについて見てみるとこれは位相空間的に周期的なのじぇ。
そしてもちろんyについても周期的なのじぇ。
xについても周期的そしてyについても周期的ということはこれは位相空間上でトーラスになるのじぇ。
ここでさっきの方法をちょっとだけ変えてトーラスであることを示すのじぇ。
(1)のハミルトニアンの力学変数を作用変数
と角変数
に正準変換してみようじぇ。
まあ難しいことしなくてもここでは調和振動子なので作用変数は
縦軸
横軸
の楕円になるので
楕円の面積の公式
を用いれば
このように計算でき、ハミルトニアンは
このように書き直せるのじぇ。
ここで
であるので{Ji}は保存されるのじぇ。
これによってさっきの話と同じようにトーラスになることが分かったのじぇ。
今度はこれに非加積分摂動を与えた場合を考えようじぇ。
非加積分摂動はフーリエ展開の形で与えるのじぇ。
ここで母関数を
として 新しい作用、各変数
を導入した正準変換を考えると
なので(2)をJ'iの周辺でテーラー展開したものは,
になるのじぇ。
。もし摂動が小さく任意のm,nに対して
が成立するのであれば、
のようにgを選ぶことでテーラー展開のεの一次の項を消すことができるのじぇ。
もし
が有理数の場合は分母を発散させるm,nの選び方ができてしまうのでg関数は決まらないけれど、
有理数の数は無理数の数に比べてとても少ないのでそれは無視できると考えられるらしいのじぇ。
この手続きをεの高次の項に対しても繰り返すことで高次の項を消去でき、
ハミルトニアンは結局
となり、元のトーラスは変形して新しいトーラスができるのじぇ。
これを Kolmogorov-Arnold-Moser(KAM) トーラスというらしいのじぇ。
gをどう選ぶかの話のにいろいろ疑問を持つ人は多いと思うけれどそこはかなり難しい数学の議論でKolmogorov-Arnold-Moserの論文に詳しく書かれているらしいのじぇ。
。もし摂動が大きくなってくると、
となり、
となる母関数を得ることができず、εの一時の項を消せないためトーラスは崩壊するのじぇ。これがカオスの発生なのじぇ。
ところでなぜ母関数が
を満足しなければならないのかはまりちゃにはわからないのじぇ(詳しい人いたら教えてください。)
本の内容をブログに書いてみればよくわかるんじゃないかと思ったけれど
大事で気になるところがはしょられているのでいまいちよくわからんって感じなのじぇ
トーラスが崩壊してカオスがどのように作り出されるか
ポアンカレマップ、面積保存写像、孤立固定点についてkicked rotator modelの図を交えた話はまた今度気が向いたらなのじぇ
~~~~追記~~~~
KAMトーラスなんて現実世界に現れるのかと思うかもしれないけど
うちの教授によるとなんと土星の環がKAMトーラスらしいのじぇ
土星の太陽を回る周期と,土星の輪をなしている塵が土星の周りを回る周期でトーラスを形成しほかの惑星によって及ぼされる引力が微小な摂動となり
周期比が有理数比から遠いところだけが輪として残っているということらしいのじぇ
写真はここから
solarsystem.nasa.gov
■
ちょっとまりちゃ。最近全然将棋プログラム書いてないじゃない!
次の電王トーナメントのために何かしなさいよ!
一応電王トーナメントに関係することはしているのじぇ。
え?何してるの?
ゲーム作ってるのじぇ。
は?
Tower of DenOuなのじぇ。
えぇ....
せかいの まんなかにたつ とうは
でんおうに つうじている という
はるかな でんおうを ゆめみて
おおくの ものたちが
このとうの ひみつに いどんでいった
だが かれらの うんめいを
しるものはない
そして いま またひとり‥‥
魔界塔士かよ!
あの鳥はcoduck,あのうさぎはlesserpyonなのじぇ
ゲームとしてはロックマン的な感じにしたいのじぇ。
これが最初のボスうさぴょんなのじぇ。
ジャンプしながら攻撃を仕掛けてくるのじぇ
これはBonanza。3駒連携攻撃をしてくるのじぇ。
これは技巧。
いまいち仕様が決まってないのじぇ。
ゲーム開発は楽しいのじぇ。
ちなみにちょっと遊べるぐらいのクオリティになってきたので友達にテストプレイとして公開してみたけどだれも遊んでくれなかったのじぇ
この「遊んでくれてありがとう」画面を作った意味がなくなってしまったのじぇ
ざんねんね。
今の課題としては難易度調整がダメダメで技巧よりもうさぴょんのほうが強くなってしまっていること、ボリュームが足りていないこと、音楽を自作しようとしているが全然作曲ができていないことなのじぇ。
あとこういうサガフロみたいな感じのゲームつくるのも面白そうだじぇ
Boing~ #gamedev pic.twitter.com/RT8U1Ha80M
— Paper Bug Dev (@PaperBugDev) 2017年7月12日
備忘録
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などの影響で簡単にはわからない この辺がネック)