Esempio n. 1
0
 /// <summary>
 /// 読む。
 ///
 /// 棋譜ツリーを作成します。
 /// </summary>
 /// <param name="kifu">この棋譜ツリーの現局面に、次局面をぶら下げて行きます。</param>
 /// <param name="enableLog"></param>
 /// <param name="isHonshogi"></param>
 /// <param name="logTag"></param>
 /// <returns></returns>
 public void WAA_Yomu_Start(
     KifuTree kifu,
     bool isHonshogi,
     Mode_Tansaku mode_Tansaku,
     float alphabeta_otherBranchDecidedValue,
     EvaluationArgs args
     )
 {
 }
Esempio n. 2
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);
        }
Esempio n. 3
0
        /// <summary>
        /// 読む。
        ///
        /// 棋譜ツリーを作成します。
        /// </summary>
        /// <param name="kifu">この棋譜ツリーの現局面に、次局面をぶら下げて行きます。</param>
        /// <param name="enableLog"></param>
        /// <param name="isHonshogi"></param>
        /// <returns></returns>
        public void WAA_Yomu_Start(
            KifuTree kifu,
            bool isHonshogi,
            Mode_Tansaku mode_Tansaku,
            float alphabeta_otherBranchDecidedValue,
            EvaluationArgs args
            )
        {
            Tansaku_Genjo genjo      = this.CreateGenjo(kifu, isHonshogi, mode_Tansaku);
            KifuNode      node_yomi  = (KifuNode)kifu.CurNode;
            int           wideCount2 = 0;

            //
            // (1)合法手に一対一対応した子ノードを作成し、ハブ・ノードにぶら下げます。
            //
            Dictionary <string, SasuEntry> moveBetuEntry;
            int   yomiDeep;
            float a_childrenBest;

            Tansaku_FukasaYusen_Routine.CreateEntries_BeforeLoop(
                genjo,
                node_yomi,
                out moveBetuEntry,
                out yomiDeep,
                out a_childrenBest
                );
            int moveBetuEntry_count = moveBetuEntry.Count;

            if (Tansaku_FukasaYusen_Routine.CanNotNextLoop(yomiDeep, wideCount2, moveBetuEntry_count, genjo))
            {
                // 1手も読まないのなら。
                // FIXME: エラー?
                //----------------------------------------
                // もう深くよまないなら
                //----------------------------------------
                Tansaku_FukasaYusen_Routine.Do_Leaf(
                    genjo,
                    node_yomi,
                    args,
                    out a_childrenBest
                    );
            }
            else
            {
            }



            float child_bestScore = Tansaku_FukasaYusen_Routine.WAAA_Yomu_Loop(
                genjo,
                alphabeta_otherBranchDecidedValue,
                node_yomi,
                moveBetuEntry.Count,
                args
                );

#if DEBUG
            if (0 < genjo.Args.LogF_moveKiki.boards.Count)//ログが残っているなら
            {
                ////
                //// ログの書き出し
                ////
                //Util_GraphicalLog.WriteHtml5(
                //    true,//enableLog,
                //    "MoveRoutine#Yomi_NextNodes(00)新ログ",
                //    $"[{Util_GraphicalLog.BoardFileLog_ToJsonStr(genjo.Args.LogF_moveKiki)}]"
                //);

                // 書き出した分はクリアーします。
                genjo.Args.LogF_moveKiki.boards.Clear();
            }
#endif
        }