예제 #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();
        }
예제 #2
0
        private void btnNext_Click(object sender, EventArgs e)
        {
            IntegralCriterionMethods method = IntegralCriterionMethods.AdditiveCriterion;

            if (this.rbnAdditiveCriterion.Checked)
            {
                if (this.chbUtilityFunction.Checked)
                {
                    method = IntegralCriterionMethods.AdditiveCriterionWithUtilityFunction;
                }
                else
                {
                    method = IntegralCriterionMethods.AdditiveCriterion;
                }
            }
            if (this.rbnMultiplicativeCriterion.Checked)
            {
                if (this.chbUtilityFunction.Checked)
                {
                    //method = IntegralCriterionMethods.MultiplicativeCriterionWithUtilityFunction;
                    throw new NotImplementedException();
                }
                else
                {
                    // Проверим, все ли критерии имеют одинаковый тип
                    if (MultiplicativeCriterionSolver.CriteriaHaveSimilarType(this._model))
                    {
                        method = IntegralCriterionMethods.MultiplicativeCriterion;
                    }
                    else
                    {
                        // Критерии имеют разный тип. Скажем пользователю,
                        // что нельзя ПОКА ЧТО использовать этот метод для
                        // поиска окончательного решения
                        MessageBoxHelper.ShowStop("Критерии в модели имеют разный тип: некоторые максимизируются, а некоторые минимизируются\nК сожалению, выбранный метод поиска окончательного решения работает только для моделей,\nв которых все критерии имеют одинаковый тип");
                        return;
                    }
                }
            }
            if (this.rbnMiniMax.Checked)
            {
                method = IntegralCriterionMethods.MinimaxMethod;
            }

            if (this.rbnGeneticAlgorithm.Checked)
            {
                this._nextForm = new AdditiveGaParamsForm(this, this._model);
            }
            else
            {
                if (this.chbUtilityFunction.Checked)
                {
                    this._nextForm = new UtilityFunctionForm(this, this._model, method);
                }
                else if (!this.chbUtilityFunction.Checked)
                {
                    this._nextForm = new IntegralResultsForm(this, this._model, null, method);
                }
            }


            this._nextForm.Show();
            this.Hide();
        }