Example #1
0
 public Tansaku_ArgsImpl(
     bool isHonshogi,
     int[] yomuLimitter,
     KaisetuBoards logF_moveKiki
     )
 {
     this.isHonshogi    = isHonshogi;
     this.yomuLimitter  = yomuLimitter;
     this.logF_moveKiki = logF_moveKiki;
 }
Example #2
0
        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
        }
Example #3
0
        /// <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);
            }
        }
Example #4
0
        /// <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));
            //    }
            //}
        }
Example #5
0
        /// <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;
        }
Example #6
0
        /// <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);
        }
Example #7
0
        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);
        }