/// <summary> /// 合法手一覧を作成したい。 /// </summary> public void Aa_Yomi(IMove move) { //---------------------------------------- // 合法手のNextNodesを作成します。 //---------------------------------------- #if DEBUG KaisetuBoards logF_kiki_orNull = null;// デバッグ用。 Stopwatch sw2 = new Stopwatch(); sw2.Start(); logF_kiki_orNull = new KaisetuBoards(); #endif EvaluationArgs args; { args = new EvaluationArgsImpl( this.Kifu.GetSennititeCounter(), this.featureVector_ForYomi, LearningDataImpl.REPORT_ENVIRONMENT #if DEBUG , logF_kiki_orNull #endif ); } this.Aaa_CreateNextNodes_Gohosyu(args); #if DEBUG sw2.Stop(); Logger.Trace($"合法手作成 = {sw2.Elapsed}"); Logger.Trace("────────────────────────────────────────"); #endif //// //// 内部データ //// //{ // if (null != logTag.Dlgt_OnNaibuDataClear_or_Null) // { // logTag.Dlgt_OnNaibuDataClear_or_Null(); // logTag.Dlgt_OnNaibuDataAppend_or_Null(this.DumpToAllGohosyu(this.Kifu.CurNode.Value.ToKyokumenConst)); // } //} }
/// <summary> /// 棋譜ツリーをセットアップします。 /// </summary> public static void Setup_KifuTree( ref bool isRequest_ShowGohosyu, ref bool isRequest_ChangeKyokumenPng, Uc_Main uc_Main) { { KifuTree kifu_newHirate; Util_FvLoad.CreateKifuTree(out kifu_newHirate); uc_Main.LearningData.Kifu = kifu_newHirate; } EvaluationArgs args; { #if DEBUG KaisetuBoards logF_kiki = new KaisetuBoards();// デバッグ用だが、メソッドはこのオブジェクトを必要としてしまう。 #endif args = new EvaluationArgsImpl( uc_Main.LearningData.Kifu.GetSennititeCounter(), new FeatureVectorImpl(), Util_KifuTreeLogWriter.REPORT_ENVIRONMENT #if DEBUG , logF_kiki #endif ); } // 合法手を数えたい。 uc_Main.LearningData.Aaa_CreateNextNodes_Gohosyu(args); // 現局面の合法手表示の更新を要求 isRequest_ShowGohosyu = true; // 局面PNG画像更新を要求 isRequest_ChangeKyokumenPng = true; }
/// <summary> /// 指し手を決めます。 /// </summary> /// <param name="enableLog"></param> /// <param name="isHonshogi"></param> /// <param name="kifu"></param> /// <returns></returns> public KifuNode WA_Bestmove( bool isHonshogi, KifuTree kifu ) { #if DEBUG KaisetuBoards logF_kiki = new KaisetuBoards();// デバッグ用だが、メソッドはこのオブジェクトを必要としてしまう。 #endif EvaluationArgs args = new EvaluationArgsImpl( kifu.GetSennititeCounter(), this.FeatureVector, Util_KifuTreeLogWriter.REPORT_ENVIRONMENT #if DEBUG , logF_kiki #endif ); float alphabeta_otherBranchDecidedValue; switch (((KifuNode)kifu.CurNode).Value.KyokumenConst.KaisiPside) { case Playerside.P1: // 2プレイヤーはまだ、小さな数を見つけていないという設定。 alphabeta_otherBranchDecidedValue = float.MaxValue; break; case Playerside.P2: // 1プレイヤーはまだ、大きな数を見つけていないという設定。 alphabeta_otherBranchDecidedValue = float.MinValue; break; default: throw new Exception("探索直前、プレイヤーサイドのエラー"); } // // 指し手生成ルーチンで、棋譜ツリーを作ります。 // new Tansaku_FukasaYusen_Routine().WAA_Yomu_Start( kifu, isHonshogi, Mode_Tansaku.Shogi_ENgine, alphabeta_otherBranchDecidedValue, args); #if DEBUG // // 評価明細ログの書出し // Util_KifuTreeLogWriter.A_Write_KifuTreeLog( logF_kiki, kifu ); //Util_LogWriter500_HyokaMeisai.Log_Html5( // this, // logF_kiki, // kifu, // playerInfo, // logTag // ); #endif // 評価値の高いノードだけを残します。 this.EdagariEngine.EdaSibori_HighScore(kifu); // 評価値の同点があれば、同点決勝をして 1手に決めます。 KifuNode bestKifuNode = null; bestKifuNode = this.ChoiceNode_DoutenKessyou(kifu, isHonshogi); return(bestKifuNode); }