Здравствуйте.
Я нашел для реализации симплекс-метода такой вот код:
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