コード例 #1
0
ファイル: AIPLayer.cs プロジェクト: 117503445/OnePlusOne
 /// <summary>
 /// 从指定路径读取文本文件,反序列化
 /// </summary>
 /// <param name="path"></param>
 public AIPLayer(string path)
 {
     Records = Records.LoadFromText(File.ReadAllText((path)));
 }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
ファイル: AIPLayer.cs プロジェクト: 117503445/OnePlusOne
 public AIPLayer(Records records)
 {
     Records = records ?? throw new ArgumentNullException(nameof(records));
 }
コード例 #4
0
ファイル: Game.cs プロジェクト: 117503445/OnePlusOne
 /// <summary>
 /// 加载训练数据集,关闭日志输出
 /// </summary>
 /// <param name="records"></param>
 public void LoadTrainRecords(Records records)
 {
     Records          = records;
     IsEnabledGameLog = false;
 }