public static void FillDataGridWithUtilityFunction( Model model, Dictionary <TId, UtilityFunction> utFuncs, IntegralCriterionMethodResult result, DataGridView table, bool showUtilityFunctionValues) { table.SuspendLayout(); table.Rows.Clear(); table.Columns.Clear(); // Колонки для параметров foreach (KeyValuePair <TId, Parameter> kvp in model.Parameters) { var paramCol = new DataGridViewColumn(); paramCol.CellTemplate = new DataGridViewTextBoxCell(); paramCol.SortMode = DataGridViewColumnSortMode.NotSortable; paramCol.HeaderText = kvp.Value.Name; paramCol.Name = "param_" + kvp.Key; paramCol.HeaderCell.ToolTipText = kvp.Value.GetDescription(); table.Columns.Add(paramCol); } // Колонки для критериев foreach (KeyValuePair <TId, Criterion> kvp in model.Criteria) { var critCol = new DataGridViewColumn(); critCol.CellTemplate = new DataGridViewTextBoxCell(); critCol.SortMode = DataGridViewColumnSortMode.NotSortable; critCol.HeaderText = kvp.Value.Name; critCol.Name = "crit_" + kvp.Key; critCol.HeaderCell.ToolTipText = kvp.Value.GetDescription(); table.Columns.Add(critCol); if (showUtilityFunctionValues) { var utFuncCol = new DataGridViewColumn(); utFuncCol.CellTemplate = new DataGridViewTextBoxCell(); utFuncCol.SortMode = DataGridViewColumnSortMode.NotSortable; utFuncCol.CellTemplate.Style.BackColor = Color.PowderBlue; utFuncCol.HeaderText = kvp.Value.Name + " (Значение Ф.П.)"; utFuncCol.Name = "ut_func_" + kvp.Key; table.Columns.Add(utFuncCol); } } // Колонки для функциональных ограничения foreach (KeyValuePair <TId, Constraint> kvp in model.FunctionalConstraints) { var constrCol = new DataGridViewColumn(); constrCol.CellTemplate = new DataGridViewTextBoxCell(); constrCol.SortMode = DataGridViewColumnSortMode.NotSortable; constrCol.HeaderText = kvp.Value.Name; constrCol.Name = "constr_" + kvp.Key; constrCol.HeaderCell.ToolTipText = kvp.Value.GetDescription(); table.Columns.Add(constrCol); } // Колонка для дополнительных данных var additionalCol = new DataGridViewColumn(); additionalCol.CellTemplate = new DataGridViewTextBoxCell(); additionalCol.SortMode = DataGridViewColumnSortMode.NotSortable; additionalCol.HeaderText = result.AdditionalDataDescription; additionalCol.Name = "additional_col"; table.Columns.Add(additionalCol); foreach (TId expId in result.SortedPoints) { // Добавим рядок int rowInd = table.Rows.Add(); // Запишем в хедер номер эксперимента table.Rows[rowInd].HeaderCell.Value = model.Experiments[expId].Number.ToString(); // Запишем в ячейки значения оптимизируемых параметров foreach (KeyValuePair <TId, double> pvs in model.Experiments[expId].ParameterValues) { int colInd = 0; try { colInd = table.Columns["param_" + pvs.Key].Index; } catch (Exception ex) { MessageBoxHelper.ShowError(ex.Message); return; } table[colInd, rowInd].Value = pvs.Value.ToString(SettingsManager.Instance.DoubleStringFormat); } // Запишем в ячейки значения критериев оптимальности foreach (KeyValuePair <TId, double> pvs in model.Experiments[expId].CriterionValues) { int colInd = 0; try { colInd = table.Columns["crit_" + pvs.Key].Index; } catch (Exception ex) { MessageBoxHelper.ShowError(ex.Message); return; } table[colInd, rowInd].Value = pvs.Value.ToString(SettingsManager.Instance.DoubleStringFormat); } // Запишем в ячейки значения нормализованных критериев, если надо if (showUtilityFunctionValues) { foreach (Criterion crit in model.Criteria.Values) { int colInd = 0; try { colInd = table.Columns["ut_func_" + crit.Id].Index; } catch (Exception ex) { MessageBoxHelper.ShowError(ex.Message); return; } table[colInd, rowInd].Value = result.GetUtilityFunction(crit.Id)[expId].ToString(SettingsManager.Instance.DoubleStringFormat); } } // Запишем в ячейки значения ФО foreach (KeyValuePair <TId, double> pvs in model.Experiments[expId].ConstraintValues) { int colInd = 0; if (table.Columns["constr_" + pvs.Key] != null) { colInd = table.Columns["constr_" + pvs.Key].Index; table[colInd, rowInd].Value = pvs.Value.ToString(SettingsManager.Instance.DoubleStringFormat); } } // Запишем в ячейки дополнительные данные int colId = 0; colId = table.Columns["additional_col"].Index; table[colId, rowInd].Style.BackColor = Color.LightGray; table[colId, rowInd].Value = result.AdditionalData[expId].ToString(SettingsManager.Instance.DoubleStringFormat); } table.ResumeLayout(); }
public IntegralCriterionMethodResult FindDecisionWithUtilityFunction( Model model, Dictionary <TId, UtilityFunction> uFunctions) { var result = new IntegralCriterionMethodResult("Аддитивный критерий с учетом функции полезности", "Значение аддитивного критерия с учетом функции полезности"); // Найдем значения функций полезности для каждого эксперимента // по каждому из критериев foreach (Criterion crit in model.Criteria.Values) { var utilityFunctionValues = new Dictionary <TId, double>(); foreach (Experiment exp in model.Experiments.Values) { UtilityFunction utFunc = uFunctions[crit.Id]; double criterionValue = exp.CriterionValues[crit.Id]; double utilityFunctionValue = utFunc.GetUtilityFunctionValue(criterionValue); utilityFunctionValues.Add(exp.Id, utilityFunctionValue); } result.AddUtilityFunction(utilityFunctionValues, crit.Id); } // Вычислим значения аддитивного критерия для каждого из // экспериментов var additiveCriterion = new Dictionary <TId, double>(); foreach (Experiment exp in model.Experiments.Values) { if (exp.IsActive) { double additiveCriterionValue = 0; foreach (Criterion crit in model.Criteria.Values) { double utilityFunctionValue = result.GetUtilityFunction(crit.Id)[exp.Id]; utilityFunctionValue *= crit.Weight; additiveCriterionValue += utilityFunctionValue; } additiveCriterion.Add(exp.Id, additiveCriterionValue); } } // Отсортируем результаты по убыванию по значению // аддитивного критерия (больше - лучше) List <SortableDouble> sortedAdditiveCriterionValues = additiveCriterion.Select <KeyValuePair <TId, double>, SortableDouble>( kvp => new SortableDouble() { Direction = SortDirection.Descending, Id = kvp.Key, Value = kvp.Value } ).ToList(); sortedAdditiveCriterionValues.Sort(); // Заполним результаты foreach (SortableDouble sortedAdditiveCriterionValue in sortedAdditiveCriterionValues) { result.SortedPoints.Add(sortedAdditiveCriterionValue.Id); result.AdditionalData.Add(sortedAdditiveCriterionValue.Id, sortedAdditiveCriterionValue.Value); } return(result); }