Пример #1
0
        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);
        }
Пример #2
0
        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);
        }