private void buttonLoad_Click(object sender, EventArgs e) { string optFilePath = textOptFile.Text.Trim(); if (string.IsNullOrEmpty(optFilePath)) { // TODO: Handle this properly return; } ClearAll(); // Restore OPT model file path textOptFile.Text = optFilePath; try { optModel = modelProvider.Load(optFilePath); } catch (Exception ex) { // TODO: Move application name to settings MessageBox.Show(ex.Message, "opt.Bionic", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (optModel == null) { // TODO: Handle this properly return; } ListCriteria(); }
private void CalculateFitness(BionicModel model, Population targetPopulation, BionicSolverSettings settings) { if (model == null) { throw new ArgumentNullException("model"); } if (targetPopulation == null) { throw new ArgumentNullException("targetPopulation"); } BionicModel tempModel = InitTempBionicModel(model, targetPopulation); Model optModel = ModelsConverter.BionicModelToModel(tempModel); string exchangeFilePath = CreateExchangeFile(optModel, settings); // This call will wait for external application to exit RunCalculationApplication(exchangeFilePath, settings); optModel = modelProvider.Load(exchangeFilePath); foreach (Experiment experiment in optModel.Experiments.Values) { targetPopulation[experiment.Id].FitnessValue = experiment.CriterionValues[model.FitnessCriterion.Id]; foreach (TId constraintId in optModel.FunctionalConstraints.Keys) { targetPopulation[experiment.Id].ConstraintValues[constraintId] = experiment.ConstraintValues[constraintId]; } } }
public static void Main(string[] args) { Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; CommandLineOptions options = CommandLineOptions.Parse(args); if (options != null) { Model model = modelProvider.Load(options.ModelFilePath); ExcelPackage excel = new ExcelPackage(new FileInfo(options.ExcelFilePath)); ExcelWorksheet dataSheet = excel.Workbook.Worksheets["Single-objective points"]; for (int i = 1; i <= 60; i++) { Experiment e = new Experiment(model.Experiments.GetFreeConsequentId(), i + 100); for (int col = 1; col <= 11; col++) { e.ParameterValues.Add(col - 1, Convert.ToDouble(dataSheet.Cells[i, col].Value)); } model.Experiments.Add(e.Id, e); } modelProvider.Save(model, options.ModelFilePath); } }
private void btnNext_Click(object sender, EventArgs e) { if (this.rbnCreateNewModel.Checked) { // Создадим новую модель this._nextForm = new Form10(this, this._model); } else { // Откроем модель из файла string fileName = this.txtFileName.Text.Trim(); if (string.IsNullOrEmpty(fileName)) { MessageBoxHelper.ShowExclamation("Пожалуйста выберите файл с матрицей решений"); return; } else { if (!System.IO.File.Exists(fileName)) { MessageBoxHelper.ShowError("Выбранного файла с матрицей решений не существует!"); return; } else { try { this._model = modelProvider.Load(fileName); } catch (Exception ex) { MessageBoxHelper.ShowError("Не удалось загрузить матрицу из выбранного файла\nОригинальное сообщение: " + ex.Message); return; } // Если пользователь хочет изменить модель, то // сразу покажем ему форму с параметрами if (this.chbRedefineModel.Checked) { // Очистим матрицу решений (если есть что очищать) if (this._model != null) { this._model.Experiments.Clear(); } // Назначим следующую форму this._nextForm = new Form10(this, this._model); } else { this._nextForm = this.SelectNextForm(); } } } } this._nextForm.Show(); this.Hide(); }
public void ProcessModel(object data) { CancellationToken cancellationToken; if (data == null) { cancellationToken = new CancellationToken(false); } else { cancellationToken = (CancellationToken)data; } if (cancellationToken.IsCancellationRequested) { OnProcessingComplete(new EventArgs()); return; } model = modelProvider.Load(optFile); if (cancellationToken.IsCancellationRequested) { OnProcessingComplete(new EventArgs()); return; } int maxProgress = model.Experiments.Count; OnProgressChanged(new ProgressChangedEventArgs(0, maxProgress, 0, "Initialized")); int exp = 0; foreach (Experiment experiment in model.Experiments.Values) { if (cancellationToken.IsCancellationRequested) { break; } ProcessExperiment(experiment); OnProgressChanged(new ProgressChangedEventArgs(0, maxProgress, ++exp, "Processed experiment #" + experiment.Number.ToString())); } if (cancellationToken.IsCancellationRequested) { OnProcessingComplete(new EventArgs()); return; } modelProvider.Save(model, optFile); OnProcessingComplete(new EventArgs()); }
public void ExternalAppFinished() { // Вернем обратно юзера this.DisableUser(false); #if DUMMY // Распарсим текстовик, который осилили дурачки this.ParseTextResults(); #else // Возьмем модель из файла if (System.IO.File.Exists(this.txtDataFileName.Text.Trim())) { this._model = modelProvider.Load(this.txtDataFileName.Text.Trim()); } #endif // Проверим, что там программа насчитала if (this.CheckCritVals() && this.CheckConstrVals()) { // Если все хорошо - покажем окно отображения/ввода значений // критериев оптимальности и ФО this._nextForm = new Form45(this, this._model); this._nextForm.Show(); this.Hide(); } }
private static void CalcUnitsFitness( ref Model initModel, ref Population <NsgaIndividual> population, string externalAppPath) { // У нас есть модель. Рассчитаем для нее с помощью внешней // программы значения критериев оптимальности и Ф.О. #if DUMMY // Запустим внешнюю программу и дождемся, пока она отработает if (!UseDummyExternalApplication(initModel, externalAppPath)) { throw new Exception("Cannot calculate fitness values using external program"); } #else // Файл для обмена данными между opt и расчетной программой string dataFilePath = System.IO.Path.GetDirectoryName(externalAppPath) + "\\_ga_temp_file.xml"; // Запустим внешнюю программу и дождемся, пока она отработает if (!UseExternalApplication( initModel, externalAppPath, dataFilePath)) { throw new Exception("Can not calculate fitness values using external program"); } // Раз программа отработала, прочтем результаты из файла initModel = modelProvider.Load(dataFilePath); // Удалим файл с данными if (File.Exists(dataFilePath)) { File.Delete(dataFilePath); } #endif var experiments = PrepareCriteria(initModel); // Из модели выберем значения критериев оптимальности foreach (Experiment exp in experiments.Values) { int unitNumber = initModel.Experiments[exp.Id].Number; var individual = population[unitNumber]; foreach (Criterion crit in initModel.Criteria.Values) { if (individual.Criteria.ContainsKey(crit.Id)) { individual.Criteria[crit.Id] = exp.CriterionValues[crit.Id]; } else { individual.Criteria.Add(crit.Id, exp.CriterionValues[crit.Id]); } } } // Применим Ф.О. к модели initModel.ApplyFunctionalConstraints(); // Пометим на удаление в популяции особи, соответсвующие экспериментам, // ставшим неактивными после применения Ф.О. foreach (Experiment exp in initModel.Experiments.Values) { if (!exp.IsActive) { population.MarkForRemoval(exp.Number); } } // И удалим помеченные population.RemoveMarked(); }
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(); }