2017-02-26(Sun)
ここ数日くらいあんまりやる気が出なくて、AI作りの作業は進んでないです。
それで暇つぶしに従前に作った四麻計算機を引っ張り出してストックしてあった何切る問題を解こうと思ってプログラムを実行させると、
「StackOverflowException」
なんじゃこりゃぁ。
調べてみると、再帰的に関数を呼び出す方式で、段数が深くなっていくと保存すべきデータが解放されずにどんどん溜まっていって、上限を超えた時に発生するエラーらしいです。
今回の牌姿だと5巡目2シャンテン、残り山52枚で、山1枚消費に対して再帰を1回かけるので、最大52段の再帰に耐えられずにエラーという構図です。
これは再帰を使ってる以上、避けられない根本にかかわるバグです。これは困った。
それで数日くらいいろいろ調べまわって応急処置的な感じだけども、ストックできるデータ量の上限を一時的に増やすことでなんとかこのエラーを回避することに成功しました。
ここを参考にさせてもらいました。
http://blog.livedoor.jp/tofjw/tag/.NET
http://www.atmarkit.co.jp/fdotnet/dotnettips/356buildevent2/buildevent2.html
ビルド後に実行するコマンドラインがC++でしか使えないらしかったので、中身は空のC++プロジェクトを1個作って既存のVB.NETプロジェクトとの依存関係がどうのこうのとかなりてこずりました。いやー大変だった。
で、もう一回動かしてみるとこんどはいつもの、配列に対するOutOfIndexエラー。
なんかシャンテン数を入れる変数が変なことになってて向聴を維持できる打牌が発見できないバグらしい。
AI作りで関数の組み直しのときにも似たようなバグが出て直したな…、どうやって直したか忘れたな…、と遠い目。
ちょっともう疲れたので、従前の四麻計算機を放棄して、今のAI用プログラムに統一することでなんとかしようかと思っています。
根幹にかかわる致命的なバグ(StackOverflowException)はがんばれば回避できそうなことが分かったので。
それで、牌譜検討ができる機能をAI用プログラムに入れる必要があるのですが、従前のようにいちいち手入力するのは手間なのでやめたいです。
理想形としてあるのは、
天鳳のログのURLと特定の局面(東2局1本場7巡目の南家の手牌、とか)を示すものを入力する→各打牌候補のAIの評価値が出る
なんですけど、
天鳳の書式がよくわからなくて難しそうだなぁと思っています。なんかバイナリデータがうにゅうにゅとか、ダウンロードと解凍がうみょうみょとか、HTMLとかXML形式がうみゃうみゃとか。
とりあえずよくわからんものには最初は触れない方向で、
いつもの使い慣れてるmjscore形式っぽいテキストファイルからデータを読み取る
→内部変数に入れて親の1巡目からゲームを動かす
→ゲームを動かしながら毎ツモごとに各途中情報とAIの評価値を全部テキストに書き出す
→後は見る人(主に自分)ががんばって排出されたテキストログを見ろ!
という超投げやりスタンスを取ろうかと思っています。
mjscore形式だと1局10~20行くらいだけど、
それが、AI計算で排出されるテキストだとツモ番が4×12巡まであったとして、その毎ツモごとに10~20行の計算結果がずらーっと並ぶので、1局500~1000行くらいとすごい量になりそうだなぁ。
まぁ、その辺はできてから考えよう。
それで暇つぶしに従前に作った四麻計算機を引っ張り出してストックしてあった何切る問題を解こうと思ってプログラムを実行させると、
「StackOverflowException」
なんじゃこりゃぁ。
調べてみると、再帰的に関数を呼び出す方式で、段数が深くなっていくと保存すべきデータが解放されずにどんどん溜まっていって、上限を超えた時に発生するエラーらしいです。
今回の牌姿だと5巡目2シャンテン、残り山52枚で、山1枚消費に対して再帰を1回かけるので、最大52段の再帰に耐えられずにエラーという構図です。
これは再帰を使ってる以上、避けられない根本にかかわるバグです。これは困った。
それで数日くらいいろいろ調べまわって応急処置的な感じだけども、ストックできるデータ量の上限を一時的に増やすことでなんとかこのエラーを回避することに成功しました。
ここを参考にさせてもらいました。
http://blog.livedoor.jp/tofjw/tag/.NET
http://www.atmarkit.co.jp/fdotnet/dotnettips/356buildevent2/buildevent2.html
ビルド後に実行するコマンドラインがC++でしか使えないらしかったので、中身は空のC++プロジェクトを1個作って既存のVB.NETプロジェクトとの依存関係がどうのこうのとかなりてこずりました。いやー大変だった。
で、もう一回動かしてみるとこんどはいつもの、配列に対するOutOfIndexエラー。
なんかシャンテン数を入れる変数が変なことになってて向聴を維持できる打牌が発見できないバグらしい。
AI作りで関数の組み直しのときにも似たようなバグが出て直したな…、どうやって直したか忘れたな…、と遠い目。
ちょっともう疲れたので、従前の四麻計算機を放棄して、今のAI用プログラムに統一することでなんとかしようかと思っています。
根幹にかかわる致命的なバグ(StackOverflowException)はがんばれば回避できそうなことが分かったので。
それで、牌譜検討ができる機能をAI用プログラムに入れる必要があるのですが、従前のようにいちいち手入力するのは手間なのでやめたいです。
理想形としてあるのは、
天鳳のログのURLと特定の局面(東2局1本場7巡目の南家の手牌、とか)を示すものを入力する→各打牌候補のAIの評価値が出る
なんですけど、
天鳳の書式がよくわからなくて難しそうだなぁと思っています。なんかバイナリデータがうにゅうにゅとか、ダウンロードと解凍がうみょうみょとか、HTMLとかXML形式がうみゃうみゃとか。
とりあえずよくわからんものには最初は触れない方向で、
いつもの使い慣れてるmjscore形式っぽいテキストファイルからデータを読み取る
→内部変数に入れて親の1巡目からゲームを動かす
→ゲームを動かしながら毎ツモごとに各途中情報とAIの評価値を全部テキストに書き出す
→後は見る人(主に自分)ががんばって排出されたテキストログを見ろ!
という超投げやりスタンスを取ろうかと思っています。
mjscore形式だと1局10~20行くらいだけど、
それが、AI計算で排出されるテキストだとツモ番が4×12巡まであったとして、その毎ツモごとに10~20行の計算結果がずらーっと並ぶので、1局500~1000行くらいとすごい量になりそうだなぁ。
まぁ、その辺はできてから考えよう。
スポンサーサイト