コード例 #1
0
 //Знаходження ідентичних функції та її рішення в списку
 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);
 }
コード例 #2
0
        //Додавання функцій та їх технічних рішень
        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);
        }
コード例 #3
0
        //Метод для зберігання у словник оцінок рішень по кожній функції
        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;
                }
            }
        }
コード例 #4
0
        //Збереження оцінок з 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);
        }