コード例 #1
0
        /// <summary>
        /// 棋譜ツリーに、ノードを追加していきます。再帰します。
        /// </summary>
        /// <param name="genjo"></param>
        /// <param name="alphabeta_otherBranchDecidedValue"></param>
        /// <param name="args"></param>
        /// <returns>子の中で最善の点</returns>
        private static float WAAA_Yomu_Loop(
            Tansaku_Genjo genjo,
            float a_parentsiblingDecidedValue,
            KifuNode node_yomi,
            int moveBetuEntry_count,
            EvaluationArgs args
            )
        {
            float a_childrenBest;

            //
            // まず前提として、
            // 現手番の「被王手の局面」だけがピックアップされます。
            // これはつまり、次の局面がないときは、その枝は投了ということです。
            //

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

            Tansaku_FukasaYusen_Routine.CreateEntries_BeforeLoop(
                genjo,
                node_yomi,
                out moveBetuEntry2,
                out yomiDeep2,
                out a_childrenBest
                );

            int wideCount1 = 0;

            foreach (KeyValuePair <string, SasuEntry> entry in moveBetuEntry2)
            {
                if (Tansaku_FukasaYusen_Routine.CanNotNextLoop(
                        yomiDeep2,
                        wideCount1,
                        moveBetuEntry2.Count,
                        genjo
                        ))
                {
                    //----------------------------------------
                    // もう深くよまないなら
                    //----------------------------------------
                    Tansaku_FukasaYusen_Routine.Do_Leaf(
                        genjo,
                        node_yomi,
                        args,
                        out a_childrenBest
                        );

                    wideCount1++;
                    break;
                }
                else
                {
                    //----------------------------------------
                    // 《9》まだ深く読むなら
                    //----------------------------------------
                    // 《8》カウンターを次局面へ


                    // このノードは、途中節か葉か未確定。

                    //
                    // (2)指し手を、ノードに変換し、現在の局面に継ぎ足します。
                    //
                    KifuNode childNode1;

                    if (node_yomi.ContainsKey_ChildNodes(entry.Key))
                    {
                        childNode1 = (KifuNode)node_yomi.GetChildNode(entry.Key);
                    }
                    else
                    {
                        // 既存でなければ、作成・追加
                        childNode1 = Conv_SasuEntry.ToKifuNode(entry.Value, node_yomi.Value.KyokumenConst);
                        node_yomi.PutAdd_ChildNode(entry.Key, childNode1);
                    }

                    // これを呼び出す回数を減らすのが、アルファ法。
                    // 枝か、葉か、確定させにいきます。
                    float a_myScore = Tansaku_FukasaYusen_Routine.WAAA_Yomu_Loop(
                        genjo,
                        a_childrenBest,
                        childNode1,
                        moveBetuEntry2.Count,
                        args);
                    Util_Scoreing.Update_Branch(
                        a_myScore, //a_childrenBest,
                        node_yomi  //mutable
                        );

                    //----------------------------------------
                    // 子要素の検索が終わった時点
                    //----------------------------------------
                    bool alpha_cut;
                    Util_Scoreing.Update_BestScore_And_Check_AlphaCut(
                        yomiDeep2,// yomiDeep0,
                        node_yomi,
                        a_parentsiblingDecidedValue,
                        a_myScore,
                        ref a_childrenBest,
                        out alpha_cut
                        );

                    wideCount1++;

#if DEBUG_ALPHA_METHOD
                    Logger.Trace($"3. 手({node_yomi.Value.ToKyokumenConst.Temezumi})読({yomiDeep}) 兄弟最善=[{a_siblingDecidedValue}] 子ベスト=[{a_childrenBest}] 自点=[{a_myScore}]");
#endif
                    if (alpha_cut)
                    {
#if DEBUG_ALPHA_METHOD
                        Logger.Trace("アルファ・カット☆!");
#endif
                        //----------------------------------------
                        // 次の「子の弟」要素はもう読みません。
                        //----------------------------------------

                        //*TODO:
                        break;
                        //toBreak1 = true;
                        // */
                    }
                }


                // gt_NextLoop:
                //    ;
            }

            return(a_childrenBest);
        }
コード例 #2
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
        }