コード例 #1
0
        /// <summary>
        /// <see cref="IOOOptimizer{T}.Minimize(T, OOOptimizationProblem, CancellationToken)"/>
        /// </summary>
        /// <param name="Parameters">  Parameters for method. </param>
        /// <param name="Problem">     An optimization problem. </param>
        /// <param name="Reporter">
        /// Object which implement interface <see cref="IProgress{T}"/>, where T is
        /// <see cref="Progress"/>. <seealso cref="IOOOptimizer{T}.Minimize(T, OOOptimizationProblem, IProgress{Progress})"/>
        /// </param>
        /// <param name="CancelToken"> <see cref="CancellationToken"/> </param>
        /// <exception cref="InvalidOperationException"> If parameters do not set. </exception>
        /// <exception cref="ArgumentNullException">
        /// If <paramref name="Problem"/> or <paramref name="Reporter"/> is null.
        /// </exception>
        /// <exception cref="ArithmeticException">
        /// If the function has value is NaN, PositiveInfinity or NegativeInfinity.
        /// </exception>
        /// <exception cref="OperationCanceledException"></exception>
        public override void Minimize(FWParams Parameters, IOOOptProblem Problem, IProgress <Progress> Reporter, CancellationToken CancelToken)
        {
            if (Reporter == null)
            {
                throw new ArgumentNullException(nameof(Reporter));
            }

            Init(Parameters, Problem.LowerBounds.Count, 1);

            FirstStep(Problem);

            Progress progress = new Progress(this, 0, _parameters.Imax - 1, 0);

            Reporter.Report(progress);

            for (int i = 1; i < _parameters.Imax; i++)
            {
                CancelToken.ThrowIfCancellationRequested();

                NextStep(Problem);
                progress.Current = i;
                Reporter.Report(progress);
            }

            Clear();
        }
コード例 #2
0
        /// <summary>
        /// <see cref="IBaseOptimizer{TParams, TProblem}.Minimize(TParams, TProblem, IProgress{Progress}, CancellationToken)"/>
        /// </summary>
        /// <param name="Parameters">   General parameters.</param>
        /// <param name="Problem">Multiobjective problem</param>
        /// <param name="Reporter">
        /// Object which implement interface <see cref="IProgress{T}"/>, where T is
        /// <see cref="Progress"/>./>
        /// </param>
        /// <exception cref="InvalidOperationException"> If parameters do not set. </exception>
        /// <exception cref="ArgumentNullException">
        /// If <paramref name="GenParams"/> or <paramref name="Reporter"/> is null.
        /// </exception>
        /// <exception cref="ArithmeticException">
        /// If the function has value is NaN, PositiveInfinity or NegativeInfinity.
        /// </exception>
        public override void Minimize(FWParams Parameters, IMOOptProblem Problem, IProgress <Progress> Reporter)
        {
            if (Reporter == null)
            {
                throw new ArgumentNullException(nameof(Reporter));
            }

            if (Problem == null)
            {
                throw new ArgumentNullException(nameof(Problem));
            }

            Init(Parameters, Problem.LowerBounds.Count, Problem.CountObjs);

            FirstStep(Problem);

            Progress progress = new Progress(this, 0, this._parameters.Imax - 1, 0);

            Reporter.Report(progress);

            for (int i = 1; i < this._parameters.Imax; i++)
            {
                NextStep(Problem);
                progress.Current = i;
                Reporter.Report(progress);
            }

            Clear();
        }
コード例 #3
0
        protected override void Init(FWParams Parameters, int Dim, int DimObjs)
        {
            base.Init(Parameters, Dim, DimObjs);

            if (_chargesCopy == null)
            {
                _chargesCopy = new List <Agent>(Parameters.NP);

                for (int i = 0; i < Parameters.NP; i++)
                {
                    _chargesCopy.Add(_pool.GetAgent());
                }
            }
            else if (_chargesCopy.Count != Parameters.NP)
            {
                _chargesCopy.Clear();

                _chargesCopy.Capacity = Parameters.NP;

                for (int i = 0; i < Parameters.NP; i++)
                {
                    _chargesCopy.Add(_pool.GetAgent());
                }
            }

            _currentFronts = new int[Parameters.NP];
        }
コード例 #4
0
        public void FWOptimizerTestArithmeticException(InvalidFunc TypeFunc)
        {
            FWOptimizer fw = new FWOptimizer();

            FWParams param = new FWParams(10, 1000 * 1000, 3, 5, 10, 40);

            Assert.Throws <InvalidValueFunctionException>(() => GeneralOptimizerTests.TestInavlidFunction(fw, param, TypeFunc));
        }
コード例 #5
0
        public void FWOptimizerTestOptimization()
        {
            FWOptimizer fw = new FWOptimizer();

            FWParams param = new FWParams(10, GeneralOptimizerTests.ITER_MAX, 3, 1, 2, 4);

            bool error = GeneralOptimizerTests.TestOptimizer(fw, param);

            Assert.False(error);
        }
コード例 #6
0
        public void FWOptimizerTestCancel()
        {
            FWOptimizer fw = new FWOptimizer();

            // Distance is Manhattan distance.
            FWParams param = new FWParams(10, 1000 * 1000, 3, 5, 10, 40);

            bool error = GeneralOptimizerTests.TestCancel(fw, param);

            Assert.False(error);
        }
コード例 #7
0
        /// <summary>
        /// <see cref="IOOOptimizer{T}.Minimize(T, OOOptimizationProblem)"/>
        /// </summary>
        /// <param name="Parameters"> Parameters for method. </param>
        /// <param name="Problem">    An optimization problem. </param>
        /// <exception cref="InvalidOperationException"> If parameters do not set. </exception>
        /// <exception cref="ArgumentNullException"> If <paramref name="Problem"/> is null. </exception>
        /// <exception cref="ArithmeticException">
        /// If the function has value is NaN, PositiveInfinity or NegativeInfinity.
        /// </exception>
        public override void Minimize(FWParams Parameters, IOOOptProblem Problem)
        {
            Init(Parameters, Problem.LowerBounds.Count, 1);

            FirstStep(Problem);

            for (int i = 1; i < _parameters.Imax; i++)
            {
                NextStep(Problem);
            }

            Clear();
        }
コード例 #8
0
        protected override void Init(FWParams Parameters, int Dimension, int DimObjs)
        {
            base.Init(Parameters, Dimension, DimObjs);

            if (_solution == null)
            {
                _solution = new Agent(Dimension, DimObjs);
            }
            else if (_solution.Point.Count != Dimension)
            {
                _solution = new Agent(Dimension, DimObjs);
            }
        }
コード例 #9
0
        public void FWOptimizerTestReporter()
        {
            FWOptimizer fw = new FWOptimizer();

            FWParams param = new FWParams(10, GeneralOptimizerTests.ITER_MAX, 3, 1, 4, 5);

            var reporter = new TestReporter(typeof(FWOptimizer), 0, GeneralOptimizerTests.ITER_MAX - 1);

            // Optimization f(x,y)=x^2 + y^2 on [-10;10]x[-10;10].
            fw.Minimize(param, new OOOptimizationProblem(GeneralOptimizerTests.TargetFunction, GeneralOptimizerTests.LowerBounds, GeneralOptimizerTests.UpperBounds), reporter);

            Assert.False(reporter.Error);
        }
コード例 #10
0
        /// <summary>
        /// <see cref="IOOOptimizer{T}.Minimize(T, OOOptimizationProblem, CancellationToken)"/>
        /// </summary>
        /// <param name="Parameters">  Parameters for method. </param>
        /// <param name="Problem">     An optimization problem. </param>
        /// <param name="CancelToken"> <see cref="CancellationToken"/> </param>
        /// <exception cref="InvalidOperationException"> If parameters do not set. </exception>
        /// <exception cref="ArgumentNullException"> If <paramref name="Problem"/> is null. </exception>
        /// <exception cref="ArithmeticException">
        /// If the function has value is NaN, PositiveInfinity or NegativeInfinity.
        /// </exception>
        /// <exception cref="OperationCanceledException"></exception>
        public override void Minimize(FWParams Parameters, IOOOptProblem Problem, CancellationToken CancelToken)
        {
            Init(Parameters, Problem.LowerBounds.Count, 1);

            FirstStep(Problem);

            for (int i = 1; i < _parameters.Imax; i++)
            {
                CancelToken.ThrowIfCancellationRequested();
                NextStep(Problem);
            }

            Clear();
        }
コード例 #11
0
        public void MOFWOptimizerTest2()
        {
            MOFWOptimizer optimizer = new MOFWOptimizer();
            FWParams      param     = new FWParams(20, 5, 0.1, 2, 5, 0.2);

            MOOptimizationProblem problem = new MOOptimizationProblem(
                new List <Func <IReadOnlyList <double>, double> >()
            {
                Obj1,
                Obj2
            },
                Enumerable.Repeat(0.0, 5).ToArray(),
                Enumerable.Repeat(1.0, 5).ToArray()
                );

            optimizer.Minimize(param, problem);

            Assert.True(optimizer.ParetoFront.Count() == param.NP);
        }
コード例 #12
0
        /// <summary>
        /// <see cref="IBaseOptimizer{TParams, TProblem}.Minimize(TParams, TProblem, IProgress{Progress}, CancellationToken)"/>
        /// </summary>
        /// <param name="Parameters">   General parameters.</param>
        /// <param name="Problem">Multiobjective problem</param>
        /// <param name="CancelToken"> <see cref="CancellationToken"/> </param>
        /// <exception cref="InvalidOperationException"> If parameters do not set. </exception>
        /// <exception cref="ArgumentNullException"> If <paramref name="Problem"/> is null. </exception>
        /// <exception cref="ArithmeticException">
        /// If the function has value is NaN, PositiveInfinity or NegativeInfinity.
        /// </exception>
        /// <exception cref="OperationCanceledException"></exception>
        public override void Minimize(FWParams Parameters, IMOOptProblem Problem, CancellationToken CancelToken)
        {
            if (Problem == null)
            {
                throw new ArgumentNullException(nameof(Problem));
            }

            Init(Parameters, Problem.LowerBounds.Count, Problem.CountObjs);

            FirstStep(Problem);

            for (int i = 1; i < this._parameters.Imax; i++)
            {
                CancelToken.ThrowIfCancellationRequested();
                NextStep(Problem);
            }

            Clear();
        }
コード例 #13
0
        /// <summary>
        /// <see cref="IBaseOptimizer{TParams, TProblem}.Minimize(TParams, TProblem)"/>
        /// </summary>
        /// <param name="Parameters"> General parameters. <see cref="FWParams"/>. </param>
        /// <param name="Problem">Multiobjective problem</param>
        /// <exception cref="InvalidOperationException"> If parameters do not set. </exception>
        /// <exception cref="ArgumentNullException"> If <paramref name="Problem"/> is null. </exception>
        /// <exception cref="ArithmeticException">
        /// If the function has value is NaN, PositiveInfinity or NegativeInfinity.
        /// </exception>
        public override void Minimize(FWParams Parameters, IMOOptProblem Problem)
        {
            if (Problem == null)
            {
                throw new ArgumentNullException(nameof(Problem));
            }

            Init(Parameters, Problem.LowerBounds.Count, Problem.CountObjs);

            FirstStep(Problem);

            for (int i = 1; i < _parameters.Imax; i++)
            {
                _iter = i;
                NextStep(Problem);
            }

            Clear();
        }
コード例 #14
0
        private static void Main(string[] args)
        {
            IMOOptProblem problem = new ZDT1(Enumerable.Repeat(0.0, 10).ToArray(), Enumerable.Repeat(1.0, 10).ToArray());

            MOFWOptimizer optimizer = new MOFWOptimizer();

            FWParams parameters = new FWParams(50, 200, 20, 10, 30, 2);

            ProgressReporter reporter = new ProgressReporter();

            optimizer.Minimize(parameters, problem, reporter);

            foreach (Agent agent in optimizer.ParetoFront)
            {
                Console.WriteLine($"F1 = {agent.Objs[0]} F2 = {agent.Objs[1]}");
            }

            Console.ReadKey();
        }
コード例 #15
0
        private static void Main(string[] args)
        {
            IOOOptimizer <BBBCParams> bbbc = new BBBCOptimizer();
            IOOOptimizer <FWParams>   fw   = new FWOptimizer();
            IOOOptimizer <GEMParams>  gem  = new GEMOptimizer();

            BBBCParams param1 = new BBBCParams(20, 200, 0.4, 0.5);
            FWParams   param2 = new FWParams(20, 100, 20, 10, 20, 40);
            GEMParams  param3 = new GEMParams(1, 100, 50, 2 * Math.Sqrt(2), 100);

            IOOOptProblem param = new RastriginProblem();

            Console.WriteLine("Exact solution: f(x) = 0, x = (0, 0).");
            Console.WriteLine();

            Test(bbbc, param1, param, "BBBC");
            Test(fw, param2, param, "Fireworks");
            Test(gem, param3, param, "GEM");

            Console.WriteLine("Complete");
            Console.ReadKey();
        }
コード例 #16
0
ファイル: Program.cs プロジェクト: KernelA/control-task
        private static void SolveFW(INamedMOProblem Problem, string PathToOutDir, int MaxRun)
        {
            MappedDiagnosticsContext.Set("thread_id", $"_{Thread.CurrentThread.ManagedThreadId}_");

            Logger logger = LogManager.GetLogger("Main");

            const int numParams = 6;

            object[][] parameters =
            {
                //new object[numParams] {250, 600, 10, 20, 30, 1.1},
                new object[numParams] {
                    300, 700, 20, 8, 15, 0.025
                },
                new object[numParams] {
                    300, 1000, 25, 8, 17, 0.05
                },
                new object[numParams] {
                    400, 900, 15, 8, 12, 0.1
                },
                new object[numParams] {
                    350, 750, 20, 10, 19, 0.15
                }
            };

            string pathToXml = Path.Combine(PathToOutDir, $"{Problem.Name}_res.xml");

            logger.Info($"Open a xml file. '{pathToXml}'");

            var normalGen = new NormalGen();
            var contGen   = new ContGen();

            MOFWOptimizer opt = new MOFWOptimizer(contGen, normalGen);

            using (XmlWriter writer = XmlWriter.Create(pathToXml))
            {
                writer.WriteStartDocument();
                writer.WriteStartElement("Problem");

                Dictionary <string, string> problemDesc = new Dictionary <string, string>
                {
                    ["Name"]   = Problem.Name,
                    ["DimDec"] = Problem.LowerBounds.Count.ToString(),
                    ["DimObj"] = Problem.CountObjs.ToString(),
                };

                foreach (var name in problemDesc)
                {
                    writer.WriteAttributeString(name.Key, name.Value);
                }

                writer.WriteStartElement("Bounds");

                foreach (var bound in Problem.LowerBounds.Zip(Problem.UpperBounds, (low, upp) => (Lower: low, Upper: upp)))
                {
                    writer.WriteStartElement("Bound");
                    writer.WriteAttributeString("LowerB", bound.Lower.ToString());
                    writer.WriteAttributeString("UpperB", bound.Upper.ToString());
                    writer.WriteEndElement();
                }

                writer.WriteEndElement();

                logger.Info("Start solving with MOFW.");

                foreach (var par in Enumerable.Range(0, parameters.Length).Zip(parameters, (num, par) => (Num: num, Parameters: par)))
                {
                    logger.Info($"Try to find solution with {par.Num}th configuration of {parameters.Length}");

                    writer.WriteStartElement("Experiment");
                    writer.WriteStartElement("OptParams");

                    FWParams pars = CreateParams <FWParams>(par.Parameters);

                    var paramsType = pars.GetType();

                    foreach (var prop in paramsType.GetProperties())
                    {
                        if (prop.PropertyType == typeof(bool))
                        {
                            continue;
                        }

                        writer.WriteStartElement("Param");
                        writer.WriteAttributeString(prop.Name, prop.GetValue(pars).ToString());
                        writer.WriteEndElement();
                    }

                    writer.WriteEndElement();

                    writer.WriteStartElement("Runs");

                    for (int i = 0; i < MaxRun; i++)
                    {
                        logger.Info($"Run {i} of {MaxRun}");

                        writer.WriteStartElement("Run");

                        try
                        {
                            opt.Minimize(pars, Problem);

                            writer.WriteStartElement("Decisions");

                            foreach (var agent in opt.ParetoFront)
                            {
                                writer.WriteStartElement("Point");

                                for (int coordIndex = 0; coordIndex < agent.Point.Count; coordIndex++)
                                {
                                    writer.WriteAttributeString($"x{coordIndex + 1}", agent.Point[coordIndex].ToString());
                                }

                                writer.WriteEndElement();
                            }

                            writer.WriteEndElement();

                            writer.WriteStartElement("Targets");

                            foreach (var agent in opt.ParetoFront)
                            {
                                writer.WriteStartElement("Target");

                                for (int coordIndex = 0; coordIndex < agent.Objs.Count; coordIndex++)
                                {
                                    writer.WriteAttributeString($"F{coordIndex + 1}", agent.Objs[coordIndex].ToString());
                                }

                                writer.WriteEndElement();
                            }

                            writer.WriteEndElement();
                        }
                        catch (Exception exc)
                        {
                            logger.Error(exc, "Error was in optimization process.");
                            logger.Info("Recreate optimization method.");
                            opt = new MOFWOptimizer();
                            logger.Info($"Skip run {i}.");
                        }

                        writer.WriteEndElement();
                    }

                    writer.WriteEndElement();
                    writer.WriteEndElement();
                }
            }
            logger.Info("Close a xml file.");

            MappedDiagnosticsContext.Remove("thread_id");
        }