예제 #1
0
        private void Initialise(Func <TInput, Func <double, double, ROutput> > func, TInput input, Func <TInput, ROutput, double> error, IProgress <KeyValuePair <int, Result> > progress, CancellationToken token, int count)
        {
            //function to optimise
            Func <double, double, double> fc = (a, b) => error(input, func(input)(a, b));
            // wrap-up in class
            var of = new UserFunction2D(fc);
            // build default genetic algorithm class
            var w = AccordWrapFactory.BuildDefaultMinimisation(of);

            if (progress == null & token == default(CancellationToken))
            {
                w.RunMultipleEpochs(count);
            }
            else
            {
                w.RunMultipleEpochs(count, progress);
            }
        }
        //    public static BackgroundWorkerObservable<ChromosomeWrapper> Create<TInput, ROutput>(Func<double, double, ROutput> func, TInput input, Func<TInput, ROutput, double> error, int count = 10)
        //    {      //function to optimise
        //        Func<double, double, double> fc = (a, b) => error(input,func(a, b));
        //        // wrap-up in class
        //        var of = new UserFunction2D(fc);

        //        var main = BuildGeneticProgram(of);
        //        return new BackgroundWorkerObservable<ChromosomeWrapper>(main, Observable.Repeat((bool?)true, 1), Observable.Repeat(count, 1), Observable.Repeat(0, 1));

        //    }

        //    //public static BackgroundWorkerObservable<Accord.Genetic.IChromosome> Create2<TInput, ROutput>(Func<double, double, ROutput> func, TInput input, Func<TInput, ROutput, double> error, int count = 10)
        //    //{

        //    //    var main = BuildFunction2(func, input, error);
        //    //    return new BackgroundWorkerObservable<Accord.Genetic.IChromosome>(main, null, Observable.Repeat((bool?)true, 1), Observable.Repeat(count, 1), Observable.Repeat(0, 1));

        //    //}


        //    public static BackgroundWorkerObservableQueue<ChromosomeWrapper> Create<TInput, ROutput>(IObservable<Tuple<TInput, Func<double, double, ROutput>>> funcinput, Func<TInput, ROutput, double> error, int count = 10)
        //    {



        //        var fc2 = funcinput.Select(_ =>
        //        {
        //            //function to optimise
        //            Func<double, double, double> fc = (a, b) => error(_.Item1,_.Item2(a, b));
        //            // wrap-up in class
        //            var of = new UserFunction2D(fc);

        //            var main = BuildGeneticProgram(of);
        //            return main;
        //        });


        //        return new BackgroundWorkerObservableQueue<ChromosomeWrapper>(fc2, Observable.Repeat((bool?)true, 1), Observable.Repeat(count, 1), Observable.Repeat(0, 1), Observable.Repeat(1, 1));

        //    }



        //public static BackgroundWorkerObservableQueue<ChromosomeWrapper> Create2<TInput, ROutput>(IObservable<Tuple<TInput, Func<double, double, ROutput>>> funcinput, Func<TInput, ROutput, double> error, int count = 10)
        //{
        //    var fc2 = funcinput.Select(_ =>
        //    {
        //        //function to optimise
        //        //function to optimise
        //        Func<double, double, double> fc = (a, b) => error(_.Item1, _.Item2(a, b));
        //        // wrap-up in class
        //        var of = new UserFunction2D(fc);

        //        return BuildFunction2<TInput, ROutput>(of);
        //    });

        //    var c =new ChromosomeWrapper { Chromosome= new BinaryChromosome(64) };

        //    return new BackgroundWorkerObservableQueue<ChromosomeWrapper>(fc2, c,Observable.Repeat((bool?)true, 1), Observable.Repeat(count, 1), Observable.Repeat(0, 1), Observable.Repeat(1, 1));



        //}



        private static Func <int, ChromosomeWrapper> BuildGeneticProgram(OptimizationFunction2D of)
        {
            // build default genetic algorithm class to minimise output
            var w = AccordWrapFactory.BuildDefaultMinimisation(of);
            //cyclical method to run
            Func <int, ChromosomeWrapper> main = (i) =>
            {
                w.Population.RunEpoch();
                // var _ = w.Evaluate();
                //var score = _.Output[0, 1];
                //double[] xy = _.BestSolution.Split(' ').Select(d => double.Parse(d)).ToArray();
                w.Population.RunEpoch();
                var x = w.Evaluate();
                return(new ChromosomeWrapper {
                    Chromosome = w.Population.BestChromosome, Iteration = i, Score = x.Output[0, 1], Input = x.BestSolution.Split(' ').Select(d => double.Parse(d)).ToArray()
                });
            };

            return(main);
        }