예제 #1
0
        /// <summary>
        /// 指定の指し手の順位調整を行います。
        ///
        /// 全体が調整されてしまうような☆?
        /// </summary>
        /// <param name="uc_Main"></param>
        /// <param name="tyoseiryo"></param>
        public static void ARankUpSelectedMove(Uc_Main uc_Main, float tyoseiryo)
        {
            //----------------------------------------
            // 選択したノードを参考に、減点を行う。
            //----------------------------------------
            foreach (GohosyuListItem item in uc_Main.LstGohosyu.SelectedItems)
            {
                string sfenMoveStr = item.Sfen;
                Logger.Trace($"sfenMoveStr={sfenMoveStr}");

                if (uc_Main.LearningData.Kifu.CurNode.HasChildNode(sfenMoveStr))
                {
                    Logger.Trace("----------------------------------------");
                    Logger.Trace("FV 総合点(読込前)1");
                    Logger.Trace($"      PP ={Util_FeatureVectorEdit.GetTotal_PP(uc_Main.LearningData.Fv)}");
                    Logger.Trace("----------------------------------------");
                    Node <IMove, KyokumenWrapper> nextNode = uc_Main.LearningData.Kifu.CurNode.GetChildNode(sfenMoveStr);

                    // 盤上の駒、持駒を数えます。
                    N54List nextNode_n54List = Util_54List.Calc_54List(nextNode.Value.KyokumenConst);

                    float real_tyoseiryo; //実際に調整した量。
                    Util_FvScoreing.UpdateKyokumenHyoka(
                        nextNode_n54List,
                        nextNode.Value.KyokumenConst,
                        uc_Main.LearningData.Fv,
                        tyoseiryo,
                        out real_tyoseiryo
                        );//相手が有利になる点
                    Logger.Trace("----------------------------------------");
                    Logger.Trace("FV 総合点(読込後)6");
                    Logger.Trace($"      PP ={Util_FeatureVectorEdit.GetTotal_PP(uc_Main.LearningData.Fv)}");
                    Logger.Trace("----------------------------------------");
                }
            }

            //----------------------------------------
            // 点数を付け直すために、ノードを一旦、全削除
            //----------------------------------------
            uc_Main.LearningData.Kifu.CurNode.Clear_ChildNodes();

            //----------------------------------------
            // ネクスト・ノードを再作成
            //----------------------------------------
            // TODO:本譜のネクスト・ノードは?
            uc_Main.LearningData.Aa_Yomi(uc_Main.LearningData.Kifu.CurNode.Key);
        }
예제 #2
0
        /// <summary>
        /// 本譜の手をランクアップ。
        /// </summary>
        public static void Do_RankUpHonpu(ref bool ref_isRequestShowGohosyu, Uc_Main uc_Main, string sfenMoveStr, float tyoseiryo)
        {
            //----------------------------------------
            // 1P は正の数がグッド、2P は負の数がグッド。
            //----------------------------------------
            float tyoseiryo_bad  = -tyoseiryo; //減点に使われる数字です。[局面評価更新]ボタンの場合。
            float tyoseiryo_good = 0.0f;       //加点に使われる数字です。

            float badScore_temp = tyoseiryo_bad;

            if (uc_Main.LearningData.Kifu.CurNode.Value.KyokumenConst.KaisiPside == Playerside.P2)
            {
                tyoseiryo_bad *= -1.0f;//2Pは、負数の方が高得点です。
            }

            //
            // 合法手一覧
            //
            uc_Main.LearningData.Kifu.CurNode.Foreach_ChildNodes((string key, Node <IMove, KyokumenWrapper> node, ref bool toBreak) =>
            {
                // 本譜手はまだ計算しない。
                if (key == sfenMoveStr)
                {
                    goto gt_NextLoop1;
                }

                // 盤上の駒、持駒を数えます。
                N54List childNode_n54List = Util_54List.Calc_54List(node.Value.KyokumenConst);

                float real_tyoseiryo; //実際に調整した量。
                Util_FvScoreing.UpdateKyokumenHyoka(
                    childNode_n54List,
                    node.Value.KyokumenConst,
                    uc_Main.LearningData.Fv,
                    tyoseiryo_bad,
                    out real_tyoseiryo
                    );//相手が有利になる点
                tyoseiryo_good += -real_tyoseiryo;
                gt_NextLoop1:
                ;
            });

            //
            // 本譜手
            //
            if (uc_Main.LearningData.Kifu.CurNode.HasChildNode(sfenMoveStr))
            {
                // 盤上の駒、持駒を数えます。
                N54List currentNode_n54List = Util_54List.Calc_54List(uc_Main.LearningData.Kifu.CurNode.Value.KyokumenConst);

                float real_tyoseiryo; //実際に調整した量。
                Util_FvScoreing.UpdateKyokumenHyoka(
                    currentNode_n54List,
                    uc_Main.LearningData.Kifu.CurNode.GetChildNode(sfenMoveStr).Value.KyokumenConst,
                    uc_Main.LearningData.Fv,
                    tyoseiryo_good,
                    out real_tyoseiryo
                    );//自分が有利になる点
            }
            else
            {
                Debug.Fail($"指し手[{sfenMoveStr}]に対応する次ノードは作成されていませんでした。\n" +
                           uc_Main.LearningData.DumpToAllGohosyu(
                               uc_Main.LearningData.Kifu.CurNode.Value.KyokumenConst));
            }

            ////----------------------------------------
            //// 合法手一覧を作成したい。
            ////----------------------------------------
            //uc_Main.LearningData.Aa_Yomi(uc_Main.LearningData.Kifu.CurNode.Key);

            // 局面の合法手表示の更新を要求します。
            ref_isRequestShowGohosyu = true;
        }