Example #1
0
        /// <summary>
        /// Контроллер вывода результатов расчетов
        /// </summary>
        /// <returns>Результаты расчета</returns>
        public IActionResult Results(InputValues data)
        {
            double FullMassComponents = data.FullMassComponents;

            data.FullMassComponents = 100;
            double Cof = FullMassComponents / 100; // Коофицент для интерполяции массы от 100
            ////////////////// Поиск решений
            SolverContext problem = SolverContext.GetContext();
            Model         model   = problem.CreateModel();

            Decision[] component = new Decision[8];

            for (int i = 0; i < 7; i++)
            {
                // Задаем данные модели
                component[i] = new Decision(Domain.Real, $"Num{i}");
            }

            // Общая стоимость
            component[7] = new Decision(Domain.Real, $"Cost");

            // Связываем модель и данные
            model.AddDecisions(component);

            // Ограничения
            for (int i = 0; i < 7; i++)
            {
                // Ограничение диапазон значений компонента
                model.AddConstraint($"DiaOgrEl1{i}", component[i] / (data.FullMassComponents / 100) > data.ComponentInputValues[i].MinPercent & component[i] / (data.FullMassComponents / 100) < data.ComponentInputValues[i].MaxPercent);
            }

            // Чему равна общая стоимость всех компонентов
            model.AddConstraint($"DiaOgrCost", component[7] ==
                                (
                                    component[0] * data.ComponentInputValues[0].Cost +
                                    component[1] * data.ComponentInputValues[1].Cost +
                                    component[2] * data.ComponentInputValues[2].Cost +
                                    component[3] * data.ComponentInputValues[3].Cost +
                                    component[4] * data.ComponentInputValues[4].Cost +
                                    component[5] * data.ComponentInputValues[5].Cost +
                                    component[6] * data.ComponentInputValues[6].Cost
                                ));
            // Ограничение суммы компонентов
            model.AddConstraint($"DiaOgrSumm", (component[0] + component[1] + component[2] + component[3] + component[4] + component[5] + component[6]) == data.FullMassComponents);

            // Общие Содержание Si
            model.AddConstraint($"DiaOgrSi",
                                (
                                    (component[0] * data.ComponentInputValues[0].PercentSi / 100)
                                    + (component[1] * data.ComponentInputValues[1].PercentSi / 100)
                                    + (component[2] * data.ComponentInputValues[2].PercentSi / 100)
                                    + (component[3] * data.ComponentInputValues[3].PercentSi / 100)
                                    + (component[4] * data.ComponentInputValues[4].PercentSi / 100)
                                    + (component[5] * data.ComponentInputValues[5].PercentSi / 100)
                                    + (component[6] * data.ComponentInputValues[6].PercentSi / 100)
                                ) / (data.FullMassComponents / 100)
                                > data.MinPercentSi &
                                (
                                    (component[0] * data.ComponentInputValues[0].PercentSi / 100)
                                    + (component[1] * data.ComponentInputValues[1].PercentSi / 100)
                                    + (component[2] * data.ComponentInputValues[2].PercentSi / 100)
                                    + (component[3] * data.ComponentInputValues[3].PercentSi / 100)
                                    + (component[4] * data.ComponentInputValues[4].PercentSi / 100)
                                    + (component[5] * data.ComponentInputValues[5].PercentSi / 100)
                                    + (component[6] * data.ComponentInputValues[6].PercentSi / 100)
                                )
                                < data.MaxPercentSi);

            // Общие Содержание Mn
            model.AddConstraint($"DiaOgrMn",
                                (
                                    (component[0] * data.ComponentInputValues[0].PercentMn / 100)
                                    + (component[1] * data.ComponentInputValues[1].PercentMn / 100)
                                    + (component[2] * data.ComponentInputValues[2].PercentMn / 100)
                                    + (component[3] * data.ComponentInputValues[3].PercentMn / 100)
                                    + (component[4] * data.ComponentInputValues[4].PercentMn / 100)
                                    + (component[5] * data.ComponentInputValues[5].PercentMn / 100)
                                    + (component[6] * data.ComponentInputValues[6].PercentMn / 100)
                                ) / (data.FullMassComponents / 100)
                                > data.MinPercentMn &
                                (
                                    (component[0] * data.ComponentInputValues[0].PercentMn / 100)
                                    + (component[1] * data.ComponentInputValues[1].PercentMn / 100)
                                    + (component[2] * data.ComponentInputValues[2].PercentMn / 100)
                                    + (component[3] * data.ComponentInputValues[3].PercentMn / 100)
                                    + (component[4] * data.ComponentInputValues[4].PercentMn / 100)
                                    + (component[5] * data.ComponentInputValues[5].PercentMn / 100)
                                    + (component[6] * data.ComponentInputValues[6].PercentMn / 100)
                                )
                                < data.MaxPercentMn);

            // Найти минимальную цену
            model.AddGoal("goal", GoalKind.Minimize, component[7]);

            // Расчет
            Solution solution = problem.Solve();
            //////////////////// Конец поиска решений

            // Начало теста
            Results results = new Results();

            for (int i = 0; i < 7; i++)
            {
                results.ComponentResults.Add(new ComponentResult()
                {
                    Name = data.ComponentInputValues[i].Name, Cost = component[i].ToDouble() * Cof * data.ComponentInputValues[i].Cost, PercentMass = component[i].ToDouble() * Cof / (data.FullMassComponents / 100), FullMass = component[i].ToDouble() * Cof, MnMass = (component[i].ToDouble() * Cof * data.ComponentInputValues[i].PercentMn / 100) / (data.FullMassComponents / 100), SiMass = (component[i].ToDouble() * Cof * data.ComponentInputValues[i].PercentSi / 100) / (data.FullMassComponents / 100)
                });
            }
            results.AllComponentResult = results.AllResult();
            // Конец теста

            return(View(results));
        }