//Знаходження ідентичних функції та її рішення в списку private bool FindSimiliarSolutionOfFunction(List <SolutionsOfFunction> list, SolutionsOfFunction solOfFunc) { foreach (SolutionsOfFunction item in list) { if ((item.Solution.name == solOfFunc.Solution.name && item.Function.name == solOfFunc.Function.name) || (item.Solution.id_solution == solOfFunc.Solution.id_solution && item.Function.id_function == solOfFunc.Function.id_function) ) { return(true); } } return(false); }
//Додавання функцій та їх технічних рішень private void buttonAddSolutionsOfFunctionsToList_Click(object sender, EventArgs e) { if (dataGridView1.CurrentRow == null) { return; } Solution sol = dataGridView1.CurrentRow.DataBoundItem as Solution; if (sol == null) { MessageBox.Show("Рішення для функції не обрано!", "Помилка"); return; } //Знаходимо функцію, яку вибрав користувач в базі даних. для зв'язки string selectedFuncName = comboBox1.SelectedItem.ToString(); Function selectedFunc = funcList.FirstOrDefault(f => f.name == selectedFuncName); if (selectedFunc == null) { MessageBox.Show("Обраної функції не існує в базі даних! \n Оберіть існуючу функцію!", "Помилка вибору функції"); return; } //Створюємо об'єкт де функція має своє рішення SolutionsOfFunction solOfFunc = new SolutionsOfFunction() { Solution = sol, Function = selectedFunc }; //Зберегти в локальне сховище if (solOfFuncCacheData.AddElement <SolutionsOfFunction>(solOfFunc)) { MessageBox.Show("Рішення: " + solOfFunc.Solution.name + " для функції: " + solOfFunc.Function.name + " додано для оцінювання!", "Підтверджено"); } else { MessageBox.Show("Рішення: " + solOfFunc.Solution.name + " для функції: " + solOfFunc.Function.name + " вже занесено для оцінювання!", "Відхилено"); } //Зберегти до бази даних //db.SolutionsOfFunctions.AddOrUpdate(solOfFunc); }
//Метод для зберігання у словник оцінок рішень по кожній функції private void SaveValueSolByFuncForDictionaryGA(Dictionary <int, Dictionary <int, decimal> > dict, Dictionary <int, decimal> funcDict, SolutionsOfFunction solOfFunc) { int idSol = solOfFunc.Solution.id_solution; decimal newAvgEstimate = 0.0m; //якщо немає такого рішення то додаємо його до словника if (!dict.ContainsKey(idSol)) { dict.Add(idSol, funcDict); } //якщо таке рішення вже є в словнику розраховуємо йому середню оцінку по функції в стовбцю else { decimal oldEstimate = 0.0m, newEstimate = 0.0m; foreach (var col in funcDict) { oldEstimate = dict[idSol][col.Key]; newEstimate = col.Value; newAvgEstimate = (oldEstimate + newEstimate) / 2.0m; dict[idSol][col.Key] = newAvgEstimate; } } }
//Збереження оцінок з DGV для кожного рішення функції //Структурна формула розрахунку виконання //функцій технічним рішенням private void buttonSaveRating_Click(object sender, EventArgs e) { //Зберігаємо дані для генетичного алгоритму //Словник містить в собі id рішення по ключу та по значенню вкладений словник з id функцією та оцінкою рішення за цією функцією //якщо id рішення по ключу збігаються то розраховується середнє значення рішення Dictionary <int, Dictionary <int, decimal> > dictForGA = new Dictionary <int, Dictionary <int, decimal> >(); //int firstIndex = dataGridView1.Columns.GetFirstColumn(DataGridViewElementStates.Visible, DataGridViewElementStates.None).Index; //Передвигаємося по строкам таблиці for (int i = 0; i < dataGridView1.Rows.Count; i++) { GetFirstColumnNameSolutionFunction(i, ref solutionNameInTable, ref functionNameInTable); //Знайдемо рішення функції, яка зараз оцінюється відносно функцій SolutionsOfFunction selectedSolOfFunc = solOfFuncList.FirstOrDefault(s => (s.Solution.name == solutionNameInTable) && (s.Function.name == functionNameInTable)); if (selectedSolOfFunc is null) { return; } decimal estimateSol = 1; //якщо враховувати математичну модель с вагою технічних рішень if (useWeightSolution) { estimateSol = selectedSolOfFunc.Solution.weight ?? 0; } int index = 0; decimal sum = 0; Dictionary <int, decimal> solOfFuncEstimateDict = new Dictionary <int, decimal>(); //Отримаємо оцінки по стовбцям foreach (Function func in funcList) { decimal estimateFunc = func.weight ?? 0; decimal estimateSolOnFunc = 0; if (!(decimal.TryParse(dataGridView1[++index, i].Value.ToString(), out estimateSolOnFunc))) { MessageBox.Show("Неможливо конвертувати значення комірки в тип decimal", "Помилка"); return; } sum += (estimateFunc * (estimateSolOnFunc / 100.0m)); //Накопичуємо для даного рядку ітерації (рішення) його оцінки по функціям solOfFuncEstimateDict.Add(func.id_function, estimateSolOnFunc / 100.0m); } //Зберігаємо оцінки рішення по кожній функції (для генетичного алгоритму) SaveValueSolByFuncForDictionaryGA(dictForGA, solOfFuncEstimateDict, selectedSolOfFunc); decimal finalEstimate = estimateSol * sum; //з урахуванням ваги мат. моделі finalEstimate *= SetWeightMathModel; selectedSolOfFunc.rating = finalEstimate; dataGridView1[dataGridView1.Columns.Count - 1, i].Value = finalEstimate; //ratings.Add(finalEstimate); } dataGridView1.Columns[dataGridView1.Columns.Count - 1].Visible = true; MessageBox.Show("Оцінки збережено", "Пітверджено"); //Передача даних для генетичного алгоритму AddDataToGA(//dataGridView1.Rows.Count, solOfFuncList, funcList, dictForGA); }
//Збереження оцінок з DGV для кожного рішення параметру цілі //Параметрична формула розрахунку виконання //технічними рішеннями згідно параметрам цілей private void buttonSaveRating_Click(object sender, EventArgs e) { Dictionary <int, decimal> solEstimateByParametersDict = new Dictionary <int, decimal>(); //int firstIndex = dataGridView1.Columns.GetFirstColumn(DataGridViewElementStates.Visible, DataGridViewElementStates.None).Index; for (int i = 0; i < dataGridView1.Rows.Count; i++) { GetFirstColumnNameSolutionFunction(i, ref solutionNameInTable, ref functionNameInTable); //Знайдемо рішення і функцію, яке зараз оцінюється відносно параметру цілей SolutionsOfFunction selectedSolOfFunc = solOfFuncList.FirstOrDefault(s => (s.Solution.name == solutionNameInTable) && (s.Function.name == functionNameInTable)); if (selectedSolOfFunc is null) { return; } //decimal estimateSol = selectedSolOfFunc.Solution.weight ?? 0; int index = 0; decimal sum = 0; //Отримаємо оцінки по стовбцям foreach (ParametersGoal paramGoal in parametersGoalsList) { decimal estimateParamGoal = paramGoal.Goal.weight ?? 0; decimal estimateSolOnParam = 0; if (!(decimal.TryParse(dataGridView1[++index, i].Value.ToString(), out estimateSolOnParam))) { MessageBox.Show("Неможливо конвертувати значення комірки в тип decimal", "Помилка"); return; } //Питання відкрите щодо використання середнього значення в формулі sum += (estimateParamGoal * (estimateSolOnParam / 100.0m)); } //Створюємо новий об'єкт, який закріплює за кожною цілью рішення і кінцеву оцінку рішення foreach (ParametersGoal paramGoal in parametersGoalsList) { ParametersGoalsForSolution parameterGoalForSolution = new ParametersGoalsForSolution(); //Присваюємо рішення об'єкту parameterGoalForSolution.Solution = selectedSolOfFunc.Solution; //Присвоємо параметричну ціль об'єкту parameterGoalForSolution.ParametersGoal = paramGoal; //Присваюємо загальну оцінку щодо parameterGoalForSolution.rating = sum; //Додамо до списку //cacheData.AddParamGoalForSolToList(parameterGoalForSolution); cacheData.AddElement <ParametersGoalsForSolution>(parameterGoalForSolution); } //з урахуванням ваги мат. моделі sum *= SetWeightMathModel; dataGridView1[dataGridView1.Columns.Count - 1, i].Value = sum; //Зберігаємо оцінку рішення по параметрам в словник //Для генетичного алгоритму AddSolToDict(solEstimateByParametersDict, selectedSolOfFunc.Solution.id_solution, sum); } dataGridView1.Columns[dataGridView1.Columns.Count - 1].Visible = true; MessageBox.Show("Оцінки збережено", "Пітверджено"); //Передеча даних для генетичного алгоритму //List<ParametersGoalsForSolution> list = cacheData.GetListElements<ParametersGoalsForSolution>(); GeneticAlgorithm.ManagerGA manager = GeneticAlgorithm.ManagerGA.GetInstance(); manager.SetDataForTableParametersGoalsSolutions(solEstimateByParametersDict);//list); }