public Uc_Main() { EngineConf = new EngineConf(); this.LearningData = new LearningDataImpl(EngineConf); this.stopLearning = new StopLearningImpl(EngineConf.GetResourceFullPath("StopLearningFlag")); this.tyoseiryoSettings = new TyoseiryoSettingsImpl(); // // イベントハンドラー登録 // // (2020-12-18 fri)この機能むずかしいからいったん廃止☆(^~^) //Logger.Learner.OnAppendLog = (string log) => //{ // this.txtIttesasuLog.Text += log; //}; // (2020-12-18 fri)この機能むずかしいからいったん廃止☆(^~^) //Logger.Learner.OnClearLog = () => //{ // this.txtIttesasuLog.Text = ""; //}; //Logger.LEARNER.Dlgt_OnNaibuDataAppend_or_Null = (string log) => //{ // this.txtNaibuData.Text += log; //}; //Logger.LEARNER.Dlgt_OnNaibuDataClear_or_Null = () => //{ // this.txtNaibuData.Text = ""; //}; // // 調整量 // Util_Tyoseiryo.Init(this.tyoseiryoSettings, UtilAutoMoveRush.RENZOKU_KAISU); InitializeComponent(); }
/// <summary> /// 指定した局面の評価を、加点(減点)します。 /// </summary> public static void UpdateKyokumenHyoka( N54List n54List, SkyConst src_Sky, FeatureVector fv_mutable, float tyoseiryo, out float out_real_tyoseiryo//実際に調整した量。 ) { // // 盤上の駒数と、持駒の先後の種類数 // //int banjoKomaKazu_motiSyuruiKazu = 0; // 増 or 減 { // 調整量を刻みます。 float kizami_up = Util_Tyoseiryo.Average_54x54Parameters(tyoseiryo, n54List); int changedCells; Util_FvScoreing.Fill54x54_Add(out changedCells, kizami_up, src_Sky, fv_mutable, n54List); out_real_tyoseiryo = changedCells * kizami_up; } // 持ち駒の BAD値を矯正 FIXME: 持ち駒を打つのが悪手なのは、だいたい合っているのでは? //if(false) //{ // float sum_bad = Util_FvScoreing.Spoil_MotiBad(src_Sky.KaisiPside, fv_mutable, n54List); // // 盤上の三駒関係に、均等に BAD値 を配分。 // Util_FvScoreing.Fill54x54_Add_ToBanjo( // sum_bad / (float)n54List.P40Next,//平均にする // src_Sky, // fv_mutable, // n54List, // logTag // ); //} }
public const int RENZOKU_KAISU = 3; // 100の前提で作ってあるが、やるほど弱くなるので数回にしておく。 // 60だと 34 ぐらいで終わる。 // 150 だと 400 はすぐカンスト。 // 256意味ない /// <summary> /// 繰り返し、指し手を進めます。 /// </summary> public static void DoMoveRush( out bool out_isEndKifuread, ref bool isRequest_ShowGohosyu, ref bool isRequest_ChangeKyokumenPng, int renzokuTe, Uc_Main uc_Main ) { out_isEndKifuread = false; bool isRequestDoEvents = false; bool isSaved = false; // // N手を連続で自動実行。 // 本譜の手が残っている間。 // for (int pushedButton = 0; pushedButton < renzokuTe && 0 < uc_Main.LstMove.Items.Count; pushedButton++) { // 指し手ループ isSaved = false; //リセット float tyoseiryo; float.TryParse(uc_Main.TxtTyoseiryo.Text, out tyoseiryo); HonpuMoveListItemImpl moveItem = (HonpuMoveListItemImpl)uc_Main.LstMove.Items[0]; string sfenMoveStr = moveItem.Sfen; if (sfenMoveStr == "") { goto gt_EndMoveList; } if (uc_Main.ChkIgnoreThink.Checked) { // 最初の20手は学習しない。 int tesu; if (!int.TryParse(uc_Main.TxtIgnoreLearn.Text, out tesu)) { goto gt_EndTesu; } if (uc_Main.LearningData.Kifu.CurNode.Value.KyokumenConst.Temezumi < tesu + 1) { goto gt_EndLearn; } gt_EndTesu: ; } //---------------------------------------- // FIXME: 暫定:ボタン連打は可能に。 //---------------------------------------- //this.btnUpdateKyokumenHyoka.Enabled = false;//ボタン連打防止。 //---------------------------------------- // 指し手の順位を変える回数 //---------------------------------------- int loopLimit = 1; // 通常1回 if (uc_Main.ChkHyakuretuken.Checked) { loopLimit = UtilAutoMoveRush.RENZOKU_KAISU; } //---------------------------------------- // 指し手の順位を変えるループです。 //---------------------------------------- int pushCount; bool isEndAutoLearn; Util_AutoSortingRush.DoSortMoveRush( out pushCount, out isEndAutoLearn, ref isRequest_ShowGohosyu, ref isRequest_ChangeKyokumenPng, ref isRequestDoEvents, loopLimit, ref tyoseiryo, sfenMoveStr, uc_Main ); if (isEndAutoLearn) { //棋譜の自動読取の終了 out_isEndKifuread = true; goto gt_EndMethod; } // 調整量の自動調整 if (uc_Main.ChkTyoseiryoAuto.Checked) { Util_Tyoseiryo.Up_Bairitu_AtEnd(ref isRequestDoEvents, uc_Main, pushCount, ref tyoseiryo); } if (uc_Main.ChkStartZero.Checked)// 自動で、平手初期局面の点数を 0 点に近づけるよう調整します。 { Util_StartZero.Adjust_HirateSyokiKyokumen_0ten_AndFvParamRange(ref isRequestDoEvents, uc_Main.LearningData.Fv); } if (uc_Main.ChkAutoParamRange.Checked) { //// 自動で -999~999 に矯正。 Util_LearnFunctions.FvParamRange_PP(uc_Main.LearningData.Fv);// 自動で -999~999(*bairitu) に矯正。 // 合法手表示の更新を要求 isRequest_ShowGohosyu = true; } gt_EndLearn: ; //---------------------------------------- // 投了図まで自動実行 //---------------------------------------- if (uc_Main.ChkRenzokuAutoRun.Checked) { // [一手指す]ボタン押下 Util_LearningView.IttesasuByBtnClick( ref isRequest_ShowGohosyu, ref isRequest_ChangeKyokumenPng, uc_Main.LearningData, uc_Main); // 局面PNG画像の更新を要求 //isRequest_ChangeKyokumenPng = true; } else { // 自動ループしないなら、終了。 break; } if (isRequest_ShowGohosyu) { // 合法手一覧を更新 Util_LearningView.Aa_ShowGohosyu2(uc_Main.LearningData, uc_Main); isRequest_ShowGohosyu = false; // 重い処理のあとは。 isRequestDoEvents = true; } if (isRequest_ChangeKyokumenPng) { uc_Main.LearningData.ChangeKyokumenPng(uc_Main); isRequest_ChangeKyokumenPng = false; // 重い処理のあとは。 isRequestDoEvents = true; } //---------------------------------------- // N手で学習終了 //---------------------------------------- if (uc_Main.ChkEndLearnTesu.Checked) { // N手で学習を終了します。 int tesu; if (!int.TryParse(uc_Main.TxtEndLearnTesu.Text, out tesu)) { goto gt_EndTesu; } if (tesu <= uc_Main.LearningData.Kifu.CurNode.Value.KyokumenConst.Temezumi) { // 自動ループしないなら、終了。 break; } gt_EndTesu: ; } // オートセーブ // // 20手間隔で。 // if ( uc_Main.ChkAutosave.Checked && uc_Main.LearningData.Kifu.CurNode.Value.KyokumenConst.Temezumi % 20 == 0 ) { Util_LearnFunctions.Do_Save(uc_Main); isSaved = true; } if (isRequestDoEvents) { Application.DoEvents(); isRequestDoEvents = false; } }//指し手ループ gt_EndMoveList: ; // 終局時は、オートセーブ // ※20手で終局した場合は、20手で保存されたあと、2連続で終局時として保存されることになる。 if (uc_Main.ChkAutosave.Checked) { if (!isSaved) { Util_LearnFunctions.Do_Save(uc_Main); isSaved = true; } } if (isRequestDoEvents) { Application.DoEvents(); isRequestDoEvents = false; } if (uc_Main.ChkAutoKifuNext.Checked) { //---------------------------------------- // 棋譜がなくなるまで、繰り返すなら //---------------------------------------- // 今読んだ棋譜を移す先(成功時) uc_Main.SeikoIdo(); bool isEmptyKifu; uc_Main.Do_NextKifuSet(out isEmptyKifu, ref isRequest_ShowGohosyu, ref isRequest_ChangeKyokumenPng); if (isEmptyKifu) { //棋譜の自動読取の終了 out_isEndKifuread = true; goto gt_EndMethod; } if (isRequest_ShowGohosyu) { // 合法手一覧を更新 Util_LearnFunctions.FvParamRange_PP(uc_Main.LearningData.Fv);// 自動で -999~999(*bairitu) に矯正。 Util_LearningView.Aa_ShowGohosyu2(uc_Main.LearningData, uc_Main); isRequest_ShowGohosyu = false; } if (isRequest_ChangeKyokumenPng) { uc_Main.LearningData.ChangeKyokumenPng(uc_Main); isRequest_ChangeKyokumenPng = false; } } else { //棋譜の自動読取の終了 out_isEndKifuread = true; goto gt_EndMethod; } gt_EndMethod: ; }
/// <summary> /// 指し手の順位を変えるループです。 /// </summary> /// <param name="out_pushCount"></param> /// <param name="out_isEndAutoLearn"></param> /// <param name="ref_isRequest_ShowGohosyu"></param> /// <param name="ref_isRequest_ChangeKyokumenPng"></param> /// <param name="ref_isRequestDoEvents"></param> /// <param name="loopLimit"></param> /// <param name="ref_tyoseiryo"></param> /// <param name="sfenMoveStr"></param> /// <param name="uc_Main"></param> /// <param name="logTag"></param> public static void DoSortMoveRush( out int out_pushCount, out bool out_isEndAutoLearn, ref bool ref_isRequest_ShowGohosyu, ref bool ref_isRequest_ChangeKyokumenPng, ref bool ref_isRequestDoEvents, int loopLimit, ref float ref_tyoseiryo, string sfenMoveStr, Uc_Main uc_Main ) { out_isEndAutoLearn = false; out_pushCount = 0; for (; out_pushCount < loopLimit; out_pushCount++) { //指し手順位更新ループ //---------------------------------------- // 強制中断(ループの最初のうちに) //---------------------------------------- // // 「Stop_learning.txt」という名前のファイルが .exe と同じフォルダーに置いてあると // 学習を終了することにします。 // if (uc_Main.StopLearning.IsStop()) { out_isEndAutoLearn = true; goto gt_EndMethod; } // 順位確認 if (0 < uc_Main.LstGohosyu.Items.Count) { GohosyuListItem gohosyuItem = (GohosyuListItem)uc_Main.LstGohosyu.Items[0]; if (sfenMoveStr == gohosyuItem.Sfen) { // 1位なら終了 Logger.Trace($"items.Count=[{uc_Main.LstGohosyu.Items.Count}] sfenMoveStr=[{sfenMoveStr}] gohosyuItem.Sfen=[{gohosyuItem.Sfen}]"); break; } } // 1位ではないのでランクアップ。 Util_LearnFunctions.Do_RankUpHonpu(ref ref_isRequest_ShowGohosyu, uc_Main, sfenMoveStr, ref_tyoseiryo); // 調整量の自動調整 if (uc_Main.ChkTyoseiryoAuto.Checked) { Util_Tyoseiryo.Up_Bairitu_AtStep(ref ref_isRequestDoEvents, uc_Main, out_pushCount, ref ref_tyoseiryo); } if (uc_Main.ChkStartZero.Checked)// 自動で、平手初期局面の点数を 0 点に近づけるよう調整します。 { Util_StartZero.Adjust_HirateSyokiKyokumen_0ten_AndFvParamRange(ref ref_isRequestDoEvents, uc_Main.LearningData.Fv); } // 局面の表示を更新します。 if (ref_isRequest_ShowGohosyu) { // 合法手一覧を更新 Util_LearningView.Aa_ShowGohosyu2(uc_Main.LearningData, uc_Main); // 局面PNG画像の更新は、ここでは行いません。 ref_isRequest_ShowGohosyu = false; ref_isRequestDoEvents = true; } if (ref_isRequestDoEvents) { Application.DoEvents(); ref_isRequestDoEvents = false; } }// 指し手順位更新ループ //---------------------------------------- // 連打終わり //---------------------------------------- gt_EndMethod: ; }