public IntegralResultsForm( Form prevForm, Model model, Dictionary <TId, UtilityFunction> utilityFunctions, IntegralCriterionMethods method) { InitializeComponent(); // Подстройка интерфейса this.Left = prevForm.Left; this.Top = prevForm.Top; if (this.FormBorderStyle != FormBorderStyle.FixedSingle) { this.WindowState = prevForm.WindowState; } if (this.WindowState == FormWindowState.Normal) { this.Width = prevForm.Width; this.Height = prevForm.Height; } this._prevForm = prevForm; this._model = model; this._utilityFunctions = utilityFunctions; this._showNormalizedCriterionValues = false; this._showUtilityFunctionValues = false; IIntegralCriterionMethodSolver solver = new AdditiveCriterionSolver(); switch (method) { case IntegralCriterionMethods.AdditiveCriterion: case IntegralCriterionMethods.AdditiveCriterionWithUtilityFunction: solver = new AdditiveCriterionSolver(); break; case IntegralCriterionMethods.MultiplicativeCriterion: case IntegralCriterionMethods.MultiplicativeCriterionWithUtilityFunction: solver = new MultiplicativeCriterionSolver(); break; case IntegralCriterionMethods.MinimaxMethod: solver = new MinimaxSolver(); // Уберем возможность показывать значения функции полезности this.mnuShowUtilityFunctionValues.Enabled = false; break; } switch (method) { case IntegralCriterionMethods.AdditiveCriterion: case IntegralCriterionMethods.MultiplicativeCriterion: case IntegralCriterionMethods.MinimaxMethod: this.mnuShowUtilityFunctionValues.Enabled = false; this.mnuShowNormalizedCriterionValues.Enabled = true; this._result = solver.FindDecision(this._model); IntegralCriterionResultDataGridFiller.FillDataGrid( this._model, this._result, this.dgvData, this._showNormalizedCriterionValues); break; case IntegralCriterionMethods.AdditiveCriterionWithUtilityFunction: case IntegralCriterionMethods.MultiplicativeCriterionWithUtilityFunction: this.mnuShowUtilityFunctionValues.Enabled = true; this.mnuShowNormalizedCriterionValues.Enabled = false; this._result = solver.FindDecisionWithUtilityFunction(this._model, this._utilityFunctions); IntegralCriterionResultDataGridFiller.FillDataGridWithUtilityFunction( this._model, this._utilityFunctions, this._result, this.dgvData, this._showUtilityFunctionValues); break; } // Запустим сборщик мусора, чтобы убить // предыдущие ветки System.GC.Collect(); }
private static void CalcUnitsFitness( ref Model initModel, ref AdditivePopulation population, string externalAppPath) { // У нас есть модель. Рассчитаем для нее с помощью внешней // программы значения критериев оптимальности и Ф.О. #if DUMMY // Запустим внешнюю программу и дождемся, пока она отработает if (!AdditiveSolver.UseDummyExternalApplication(initModel, externalAppPath)) { throw new Exception("Can not calculate fitness values using external program"); } #else // Файл для обмена данными между opt и расчетной программой string dataFilePath = System.IO.Path.GetDirectoryName(externalAppPath) + "\\_ga_temp_file.xml"; // Запустим внешнюю программу и дождемся, пока она отработает if (!AdditiveSolver.UseExternalApplication( initModel, externalAppPath, dataFilePath)) { throw new Exception("Can not calculate fitness values using external program"); } // Раз программа отработала, прочтем результаты из файла initModel = modelProvider.Load(dataFilePath); // Удалим файл с данными if (System.IO.File.Exists(dataFilePath)) { System.IO.File.Delete(dataFilePath); } #endif // Применим решатель для аддитивного критерия, чтобы получить его значения. // Они послужат нам эквивалентом функции приспособленности AdditiveCriterionSolver solver = new AdditiveCriterionSolver(); IntegralCriterionMethodResult result = solver.FindDecision(initModel); // Из результатов аддитивного критерия выдерем его значения foreach (TId expId in result.SortedPoints) { int unitNumber = initModel.Experiments[expId].Number; population[unitNumber].FitnessValue = result.AdditionalData[expId]; } // Применим Ф.О. к модели initModel.ApplyFunctionalConstraints(); // Пометим на удаление в популяции особи, соответсвующие экспериментам, // ставшим неактивными после применения Ф.О. foreach (Experiment exp in initModel.Experiments.Values) { if (!exp.IsActive) { population.MarkForRemoval(exp.Number); } } // И удалим помеченные population.RemoveMarked(); }