/// <summary> /// 从指定路径读取文本文件,反序列化 /// </summary> /// <param name="path"></param> public AIPLayer(string path) { Records = Records.LoadFromText(File.ReadAllText((path))); }
/// <summary> /// 由1个 RandomPlayer 进行多次自我随机对弈训练 /// </summary> /// <param name="path">训练数据路径</param> /// <param name="trainNums">训练次数</param> public static void RandomTrain(string path = "randomData.txt", int trainNums = 1000) { Records records; if (File.Exists(path)) { records = Records.LoadFromText(File.ReadAllText(path)); } else { records = new Records(); } Logger.Clear(); Logger.IsEnabled = false; int maxStep = 120;//单次训练允许的最大回合,一般1000次训练中单词最大回合数小于100 Console.CursorVisible = false; for (int trainIndex = 0; trainIndex < trainNums; trainIndex++) { Console.SetCursorPosition(0, Console.CursorTop); Console.Write($"{trainIndex + 1}/{trainNums}"); GCase c = new GCase(); RandomPlayer player = new RandomPlayer(); List <string> cases = new List <string>(); List <int> methods = new List <int>(); for (int i = 0; i < maxStep; i++) { if (c.GState != GState.Playing) { //Console.WriteLine(i); break; } else { Logger.WriteLine("---"); Logger.WriteLine(c); cases.Add(c.ToString()); int method = player.GetAddMethod(c.Nums); Logger.WriteLine(method); c.RunMethod(method); methods.Add(method); Logger.WriteLine(c); c.Reserve(); Logger.WriteLine("Reserve"); Logger.WriteLine(c); } Logger.WriteLine("---"); Logger.WriteLine(); } Logger.WriteLine("GameOver"); Logger.WriteLine(""); for (int i = cases.Count - 1; i >= 0; i--)//倒序 { var state = c.GState; string gcase = cases[i]; int method = methods[i]; Logger.WriteLine(gcase + " " + method.ToString()); switch (state) { case GState.Playing: records.Add(gcase, method, CaseResult.Loop); break; case GState.AWin: throw new Exception("不对劲"); case GState.BWin: //倒数第一个胜利 //倒数第二个失败 //倒数第三个胜利 //.... int j = cases.Count - 1 - i; if (j % 2 == 0) { records.Add(gcase, method, CaseResult.Win); } else { records.Add(gcase, method, CaseResult.Fail); } break; } } Logger.WriteLine(); } Console.CursorVisible = true; Logger.IsEnabled = true; Logger.WriteLine(records, path); }
public AIPLayer(Records records) { Records = records ?? throw new ArgumentNullException(nameof(records)); }
/// <summary> /// 加载训练数据集,关闭日志输出 /// </summary> /// <param name="records"></param> public void LoadTrainRecords(Records records) { Records = records; IsEnabledGameLog = false; }