@fanat_96

Как переделать симплекс-метод на минимизацию?

Здравствуйте.
Я нашел для реализации симплекс-метода такой вот код: https://vscode.ru/prog-lessons/simpleks-metod-real...
Но здесь только на Max, а мне, по условию, нужно на min.
Там предлагают два решения проблемы:
1) Самый простой: привести задачу минимизации (сами исходные данные) к задаче максимизации
2) Изменить приведённый алгоритм конкретно под задачу минимизации. При минимизации целевой функции ведущий столбец определяется по наибольшему значению в строке индексов.

Со вторым случаем у функции findMainCol недостаточно поменять "<" на ">", дабы все заработало.
А в первом случае, как я понял, нужно сделать следующее:
т.к. в моих ограничения все условия ">=", я меняю знаки у данных на противоположные, попутно вводя доп. переменные (но эти доп. переменные в коде не указываются, если я правильно понял из комментариев на сайте). Знаки у значений целевой функции тоже меняются на противоположные.
Однако это не помогло. Если все значения в массиве отрицательные, то расчет вообще не идет. Если все, кроме целевой функции отрицательные, а она положительная, то искомые x1,x2,x3 равны нулю. Хотя они должны быть 1.764, 0.209 и 0.0013 - результаты "поиска решения" из Excel.

Код с моими данными:
static void Main(string[] args)
        {
            double[,] table = { {-1600, -800,  -900, -600},
                                {-200,  -80,   -280, -240 },
                                {-0.01, -0.3,  -0.4, -0.5},
                                {0, 0.3, 0.4, 0.5 }};

            double[] result = new double[3];
            double[,] table_result;
            Simplex S = new Simplex(table);
            table_result = S.Calculate(result);

            Console.WriteLine("Решенная симплекс-таблица:");
            for (int i = 0; i < table_result.GetLength(0); i++)
            {
                for (int j = 0; j < table_result.GetLength(1); j++)
                    Console.Write(table_result[i, j] + " ");
                Console.WriteLine();
            }

            Console.WriteLine();
            Console.WriteLine("Решение:");
            Console.WriteLine("X[1] = " + result[0]);
            Console.WriteLine("X[2] = " + result[1]);
            Console.WriteLine("X[3] = " + result[2]);
            Console.ReadLine();
        }


Ограничения (по заданию, не канонические):
800x1+900x2+600x3 >= 1600
80x1+280x2+240x3 >= 200
0,005x1+0,005x2+0,1x3 >= 0,01

Целевая функция:
0.3x1+0.4x2+0.5x3 -> min
  • Вопрос задан
  • 1232 просмотра
Решения вопроса 1
sprmax
@sprmax
Но здесь только на Max, а мне, по условию, нужно на min.


В приведенном Вами коде решается задача на максимум, чтобы решить вашу задачу тем же кодом, нужно изменить знак Вашей целевой функции на противоположный.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы