static bool CreateDatabase(string fileDB, out LottoListResults dbl) { dbl = new LottoListResults(); using (var reader = File.OpenText(fileDB)) { var line = string.Empty; while ((line = reader.ReadLine()) != null) { var values = line.Split(' ', '\t')[2].Split(','); var res = new LottoResult(values.Select(s => double.Parse(s)).ToArray()); dbl.Add(res); } } dbl.Reverse(); return(true); }
static void Main(string[] args) { var app = new CommandLineApplication(); app.Name = "LotteryPredictor"; app.Description = "ML/Encog C# Lotto (MegaSena) Predictor"; app.HelpOption("-? | -h | --help"); var dataOption = app.Option("-d | --data", "training data (tsv file)", CommandOptionType.SingleValue); app.OnExecute(() => { if (!dataOption.HasValue()) { app.ShowHint(); return(1); } var fileDB = dataOption.Value(); try { var deep = 20; LottoListResults dbl = null; if (CreateDatabase(fileDB, out dbl)) { var network = CreateNetwork(deep); var learningInput = BuildLearningInput(dbl, deep); var learningOutput = BuildLearningOutput(dbl, deep); var trainingSet = new BasicMLDataSet(learningInput, learningOutput); var train = new ResilientPropagation(network, trainingSet); train.NumThreads = Environment.ProcessorCount; START: network.Reset(); RETRY: // train step... var step = 0; do { train.Iteration(); Console.WriteLine("Train Error: {0}", train.Error); ++step; } while (train.Error > 0.001 && step < 20); // validate... var passedCount = 0; for (var i = 0; i < deep; ++i) { var should = new LottoResult(learningOutput[i]); var inputn = new BasicMLData(6 * deep); Array.Copy(learningInput[i], inputn.Data, inputn.Data.Length); var comput = new LottoResult(((BasicMLData)network.Compute(inputn)).Data); var passed = should.ToString() == comput.ToString(); if (passed) { Console.ForegroundColor = ConsoleColor.Green; ++passedCount; } else { Console.ForegroundColor = ConsoleColor.Red; } Console.WriteLine("{0} {1} {2} {3}", should.ToString().PadLeft(17, ' '), passed ? "==" : "!=", comput.ToString().PadRight(17, ' '), passed ? "PASS" : "FAIL"); Console.ResetColor(); } // predict! var input = new BasicMLData(6 * deep); for (int i = 0, k = 0; i < deep; ++i) { var idx = deep - 1 - i; var data = dbl[idx]; input.Data[k++] = (double)data.V1; input.Data[k++] = (double)data.V2; input.Data[k++] = (double)data.V3; input.Data[k++] = (double)data.V4; input.Data[k++] = (double)data.V5; input.Data[k++] = (double)data.V6; } var perfect = dbl[0]; var predict = new LottoResult(((BasicMLData)network.Compute(input)).Data); Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine("Predict: {0}", predict); Console.ResetColor(); // restart if values out of range (pass test) if (predict.IsOut()) { goto START; } // retry if evaluation is less than 90% and predicted is invalid! if ((double)passedCount < (deep * (double)9 / (double)10) || !predict.IsValid()) { goto RETRY; } } } catch (Exception exception) { Console.WriteLine(exception.ToString()); } return(0); }); app.Execute(args); }