/// <summary> /// FVを、-999.0~999.0(*bairitu)に矯正。 /// </summary> public static void FvParamRange_PP(FeatureVector fv) { //-------------------------------------------------------------------------------- // 変換前のデータを確認。 //-------------------------------------------------------------------------------- Util_Inspection.Inspection1(fv); //-------------------------------------------------------------------------------- // 点数を、順位に変換します。 //-------------------------------------------------------------------------------- Util_Ranking.Perform_Ranking(fv); //-------------------------------------------------------------------------------- // トポロジー的に加工したあとのデータを確認。 //-------------------------------------------------------------------------------- Util_Zooming.ZoomTo_FvParamRange(fv); }
/// <summary> /// 平手初期局面が -100点~+100点 に収まるように調整します。 /// /// 7回だけ調整します。 /// /// [0]回目: 順位を 64 ずらす。 /// [1]回目: 順位を 32 ずらす。 /// [2]回目: 順位を 16 ずらす。 /// [3]回目: 順位を 8 ずらす。 /// [4]回目: 順位を 4 ずらす。 /// [5]回目: 順位を 2 ずらす。 /// [6]回目: 順位を 1 ずらす。 /// /// これで、1方向に最長で(順位換算で) 130 ほどずれます。 /// /// </summary> public static void Adjust_HirateSyokiKyokumen_0ten_AndFvParamRange( ref bool ref_isRequestDoEvents, FeatureVector fv) { if (null == Util_StartZero.src_Sky_hirateSyokikyokumen) { // 平手初期局面 Util_StartZero.src_Sky_hirateSyokikyokumen = SkyConst.NewInstance( Util_SkyWriter.New_Hirate(Playerside.P1), 0 // 初期局面は 0手目済み ); } if (null == Util_StartZero.n54List_hirateSyokikyokumen) { //---------------------------------------- // 40枚の駒、または14種類の持駒。多くても54要素。 //---------------------------------------- Util_StartZero.n54List_hirateSyokikyokumen = Util_54List.Calc_54List(Util_StartZero.src_Sky_hirateSyokikyokumen); } Hyokakansu_NikomaKankeiPp kansu = new Hyokakansu_NikomaKankeiPp(); //-------------------------------------------------------------------------------- // Check //-------------------------------------------------------------------------------- // // 平手初期局面の点数を調べます。 // float score; #if DEBUG || LEARN KyHyokaMeisai_Koumoku meisaiKoumoku_orNull; #endif kansu.Evaluate( out score, #if DEBUG || LEARN out meisaiKoumoku_orNull, #endif Util_StartZero.src_Sky_hirateSyokikyokumen, fv ); if (-100 <= score && score <= 100) { // 目標達成。 goto gt_Goal; } for (int iCount = 0; iCount < 7; iCount++)//最大で7回調整します。 { // 初期局面の評価値が、-100~100 よりも振れていれば、0 になるように調整します。 //-------------------------------------------------------------------------------- // 点数を、順位に変換します。 //-------------------------------------------------------------------------------- Util_Ranking.Perform_Ranking(fv); // // 調整量 // int chosei_offset = Util_StartZero.tyoseiryo[iCount];// 調整量を、調整します。どんどん幅が広くなっていきます。 if (-100 <= score && score <= 100) { // 目標達成。 goto gt_Goal; } else if (100 < score)// ±0か、マイナスに転じさせたい。 { chosei_offset *= -1; } int changedCells; Util_FvScoreing.Fill54x54_Add(out changedCells, chosei_offset, src_Sky_hirateSyokikyokumen, fv, Util_StartZero.n54List_hirateSyokikyokumen); // 順位を、点数に変換します。 Util_Zooming.ZoomTo_FvParamRange(fv); // フォームの更新を要求します。 ref_isRequestDoEvents = true; //-------------------------------------------------------------------------------- // Check //-------------------------------------------------------------------------------- // // 平手初期局面の点数を調べます。 // kansu.Evaluate( out score, #if DEBUG || LEARN out meisaiKoumoku_orNull, #endif Util_StartZero.src_Sky_hirateSyokikyokumen, fv ); if (-100 <= score && score <= 100) { // 目標達成。 goto gt_Goal; } // 目標を達成していないなら、ループを繰り返します。 } gt_Goal: ; }