コード例 #1
0
ファイル: MainForm.cs プロジェクト: tsimafei-markhel/opt
        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();
        }
コード例 #2
0
ファイル: BionicSolver.cs プロジェクト: tsimafei-markhel/opt
        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];
                }
            }
        }
コード例 #3
0
        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);
            }
        }
コード例 #4
0
        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();
        }
コード例 #5
0
        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());
        }
コード例 #6
0
ファイル: Form35.cs プロジェクト: tsimafei-markhel/opt
        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();
            }
        }
コード例 #7
0
ファイル: NsgaSolver.cs プロジェクト: tsimafei-markhel/opt
        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();
        }
コード例 #8
0
        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();
        }