Beispiel #1
0
        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();
        }
Beispiel #2
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();
        }