public Tansaku_ArgsImpl( bool isHonshogi, int[] yomuLimitter, KaisetuBoards logF_moveKiki ) { this.isHonshogi = isHonshogi; this.yomuLimitter = yomuLimitter; this.logF_moveKiki = logF_moveKiki; }
public EvaluationArgsImpl( SennititeConfirmer sennititeConfirmer, FeatureVector featureVector, KyokumenPngEnvironment reportEnvironment #if DEBUG , KaisetuBoards kaisetuBoards_orNull #endif ) { this.sennititeConfirmer = sennititeConfirmer; this.featureVector = featureVector; this.reportEnvironment = reportEnvironment; #if DEBUG this.kaisetuBoards_orNull = kaisetuBoards_orNull; #endif }
/// <summary> /// 盤1個分のログ。 /// </summary> public static void Build_LogBoard( Node <IMove, KyokumenWrapper> node_forLog, string nodePath, KifuNode niniNode, //任意のノード //KifuTree kifu_forAssert, KyokumenPngEnvironment reportEnvironment, KaisetuBoards logF_kiki ) { // // HTMLログ // if (logF_kiki.boards.Count < 30)//出力件数制限 { KaisetuBoard logBrd_move1 = new KaisetuBoard(); List_OneAndMulti <Finger, SySet <SyElement> > komaBETUSusumeruMasus; Playerside pside = niniNode.Value.KyokumenConst.KaisiPside; Util_KyokumenMoves.LA_Split_KomaBETUSusumeruMasus( 2, //node_forLog, out komaBETUSusumeruMasus, true, //本将棋 niniNode.Value.KyokumenConst, //現在の局面 pside, false //#if DEBUG , new MmLogGenjoImpl( 0, //読み開始手目済み logBrd_move1, 0, //現在の手済み niniNode.Key ) //#endif ); logBrd_move1.moveOrNull = niniNode.Key; logBrd_move1.YomikaisiTemezumi = niniNode.Value.KyokumenConst.Temezumi;//読み開始手目済み // int.MinValue; logBrd_move1.Temezumi = int.MinValue; logBrd_move1.Score = (int)niniNode.Score; logF_kiki.boards.Add(logBrd_move1); } }
/// <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); }
public Tansaku_Genjo CreateGenjo( KifuTree kifu, bool isHonshogi, Mode_Tansaku mode_Tansaku ) { // TODO:ここではログを出力せずに、ツリーの先端で出力したい。 KaisetuBoards logF_moveKiki = new KaisetuBoards(); // TODO:「読む」と、ツリー構造が作成されます。 //int[] yomuLimitter = new int[]{ // 600, // 読みの1手目の横幅 // 王手回避漏れのために、合法手全読み(約600)は必要です。 // 100, // 読みの2手目の横幅 // 100, // 読みの3手目の横幅 // //2, // 読みの4手目の横幅 // //1 // 読みの5手目の横幅 //}; //// ↓これなら1手1秒で指せる☆ //int[] yomuLimitter = new int[]{ // 600, // 読みの1手目の横幅 // 王手回避漏れのために、合法手全読み(約600)は必要です。 // 150, // 読みの2手目の横幅 // 150, // 読みの3手目の横幅 // //2 // 読みの4手目の横幅 // //1 // 読みの5手目の横幅 //}; //int[] yomuLimitter = new int[]{ // 600, // 読みの1手目の横幅 // 王手回避漏れのために、合法手全読み(約600)は必要です。 // 600, // 読みの2手目の横幅 // 600, // 読みの3手目の横幅 //}; //ok //int[] yomuLimitter = new int[]{ // 0, // 現局面は無視します。 // 600, // 読みの1手目の横幅 // 王手回避漏れのために、合法手全読み(約600)は必要です。 // 600, // 読みの2手目の横幅 //}; int[] yomuLimitter; #if DEBUG if (mode_Tansaku == Mode_Tansaku.Learning) { // 学習モードでは、スピード優先で、2手の読みとします。 // 2手の読み。 yomuLimitter = new int[] { 0, // 現局面は無視します。 600, // 読みの1手目の横幅 // 王手回避漏れのために、1手目は、合法手全読み(約600)は必要です。 600, // 読みの2手目の横幅 }; } else { /* * // 2手の読み。 * yomuLimitter = new int[]{ * 0, // 現局面は無視します。 * 600, // 読みの1手目の横幅 // 王手回避漏れのために、1手目は、合法手全読み(約600)は必要です。 * 600, // 読みの2手目の横幅 * }; * // */ //* // 3手の読み。 yomuLimitter = new int[] { 0, // 現局面は無視します。 600, // 読みの1手目の横幅 // 王手回避漏れのために、1手目は、合法手全読み(約600)は必要です。 600, // 読みの2手目の横幅 600, // 読みの3手目の横幅 }; // */ } #else if (mode_Tansaku == Mode_Tansaku.Learning) { //System.Windows.Forms.MessageBox.Show("学習モード"); // 学習モードでは、スピード優先で、2手の読みとします。 //* // 2手の読み。 yomuLimitter = new int[] { 0, // 現局面は無視します。 600, // 読みの1手目の横幅 // 王手回避漏れのために、1手目は、合法手全読み(約600)は必要です。 600, // 読みの2手目の横幅 }; // */ /* // 3手の読み。 * yomuLimitter = new int[]{ * 0, // 現局面は無視します。 * 600, // 読みの1手目の横幅 // 王手回避漏れのために、1手目は、合法手全読み(約600)は必要です。 * 600, // 読みの2手目の横幅 * 600, // 読みの3手目の横幅 * }; * // */ } else { //System.Windows.Forms.MessageBox.Show("本番モード"); /* // 2手の読み。 * yomuLimitter = new int[]{ * 0, // 現局面は無視します。 * 600, // 読みの1手目の横幅 // 王手回避漏れのために、1手目は、合法手全読み(約600)は必要です。 * 600, // 読みの2手目の横幅 * }; * // */ //* // 3手の読み。 yomuLimitter = new int[] { 0, // 現局面は無視します。 600, // 読みの1手目の横幅 // 王手回避漏れのために、1手目は、合法手全読み(約600)は必要です。 600, // 読みの2手目の横幅 600, // 読みの3手目の横幅 }; // */ /* // 4手の読み。 * yomuLimitter = new int[]{ * 0, // 現局面は無視します。 * 600, // 読みの1手目の横幅 // 王手回避漏れのために、1手目は、合法手全読み(約600)は必要です。 * 600, // 読みの2手目の横幅 * 600, // 読みの3手目の横幅 * 600, // 読みの4手目の横幅 * }; * // */ } #endif Tansaku_Args args = new Tansaku_ArgsImpl(isHonshogi, yomuLimitter, logF_moveKiki); Tansaku_Genjo genjo = new Tansaku_GenjoImpl( ((KifuNode)kifu.CurNode).Value.KyokumenConst.Temezumi, args ); return(genjo); }