コード例 #1
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");
        }