/// <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)); }