|
@@ -8,6 +8,15 @@ namespace Симлекс_метод
|
|
|
{
|
|
|
internal class Simplex
|
|
|
{
|
|
|
+ public double[,] main; // Расход сырья на единицу продуции
|
|
|
+ public double[] res; // Запасы сырья
|
|
|
+ public double[] dohod; // Доход от реализации единицы продукции
|
|
|
+ public int n; // Количество продукции
|
|
|
+ public int m ; // Количество ресурсов
|
|
|
+ public int temp; // Дополнительная переменная в СО
|
|
|
+ public int dop; // Дополнительная переменная для вывода в граничных условиях
|
|
|
+ public double[,] Table; // Массив симплекс-таблицы
|
|
|
+ public double[] x; // Значение x в симплекс таблицах
|
|
|
public void Vvod(ref double[] dohod) // Ввод прибыли от продукции
|
|
|
{
|
|
|
for (int i = 0; i < dohod.Length; i++)
|
|
@@ -39,7 +48,7 @@ namespace Симлекс_метод
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- public void MatModel(double[] dohod, double[,] main, double[] res) // Вывод математической модели
|
|
|
+ public void MatModel() // Вывод математической модели
|
|
|
{
|
|
|
Console.WriteLine("Математическая модель:");
|
|
|
Console.Write("\tF = ");
|
|
@@ -84,7 +93,7 @@ namespace Симлекс_метод
|
|
|
}
|
|
|
Console.WriteLine($" >= 0\n");
|
|
|
}
|
|
|
- public void KanModel(double[] dohod, double[,] main, double[] res, int temp, int dop) // Вывод кананической модели
|
|
|
+ public void KanModel() // Вывод кананической модели
|
|
|
{
|
|
|
Console.WriteLine("Каноническая задача минимизации, составленная по условию задачи:");
|
|
|
Console.Write("\tF' = -(");
|
|
@@ -142,33 +151,33 @@ namespace Симлекс_метод
|
|
|
}
|
|
|
Console.WriteLine(" - любое\n");
|
|
|
}
|
|
|
- public void finalResults(double r, double[] a, double[,] b) // Вывод оканчательных результатов
|
|
|
+ public void finalResults(double r) // Вывод оканчательных результатов
|
|
|
{
|
|
|
Console.WriteLine("\nОкончательные результаты:");
|
|
|
for (int i = 0; i < r; i++)
|
|
|
{
|
|
|
- Console.WriteLine($"x{i + 1} = {a[i]}");
|
|
|
+ Console.WriteLine($"x{i + 1} = {x[i]}");
|
|
|
}
|
|
|
- Console.WriteLine($"F = {Math.Round(Math.Abs(b[b.GetLength(0) - 1, b.GetLength(1) - 1]), 3)}");
|
|
|
+ Console.WriteLine($"F = {Math.Round(Math.Abs(Table[Table.GetLength(0) - 1, Table.GetLength(1) - 1]), 3)}");
|
|
|
}
|
|
|
- public void solve(ref double[,] a, int row, int col) // Преобразование столбца к единичному
|
|
|
+ public void solve(int r, int c) // Преобразование столбца к единичному
|
|
|
{
|
|
|
- double var = a[row, col]; // Разрешающий элемент
|
|
|
- for (int j = 0; j < a.GetLength(1); j++) // Разделение строки с разрешающим элементом на разрешающий элемент
|
|
|
+ double var = Table[r, c]; // Разрешающий элемент
|
|
|
+ for (int j = 0; j < Table.GetLength(1); j++) // Разделение строки с разрешающим элементом на разрешающий элемент
|
|
|
{
|
|
|
- a[row, j] = (double)(a[row, j] / var);
|
|
|
+ Table[r, j] = (double)(Table[r, j] / var);
|
|
|
}
|
|
|
double del; // Переменная для хранеия элемента в строке, которую юудем занулять
|
|
|
- for (int i = 0; i < a.GetLength(0); i++)
|
|
|
+ for (int i = 0; i < Table.GetLength(0); i++)
|
|
|
{
|
|
|
- del = a[i, col];
|
|
|
- for (int j = 0; j < a.GetLength(1); j++) // Зануляем эелемент на главном столбце
|
|
|
+ del = Table[i, c];
|
|
|
+ for (int j = 0; j < Table.GetLength(1); j++) // Зануляем эелемент на главном столбце
|
|
|
{
|
|
|
- if (i != row) // Если это не разрешающая строка
|
|
|
+ if (i != r) // Если это не разрешающая строка
|
|
|
{
|
|
|
- var = a[row, j];
|
|
|
+ var = Table[r, j];
|
|
|
var *= -del;
|
|
|
- a[i, j] += var;
|
|
|
+ Table[i, j] += var;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -218,7 +227,7 @@ namespace Симлекс_метод
|
|
|
return temp;
|
|
|
}
|
|
|
|
|
|
- public void FirstTable(double[,] main, ref double[,] Table, double[] res, double[] dohod, ref int temp) // Формирование первой симплекс таблицы
|
|
|
+ public void FirstTable() // Формирование первой симплекс таблицы
|
|
|
{
|
|
|
for (int i = 0; i < main.GetLength(0); i++)
|
|
|
{
|
|
@@ -244,7 +253,7 @@ namespace Симлекс_метод
|
|
|
Table[Table.GetLength(0) - 1, i] = dohod[i];
|
|
|
}
|
|
|
}
|
|
|
- public void intermediate(double[,] a, ref double[] b, int o) // Вывод симплекс-таблицы и промежуточных результатов
|
|
|
+ public void intermediate(ref double[] b, int o) // Вывод симплекс-таблицы и промежуточных результатов
|
|
|
{
|
|
|
Array.Resize(ref b, 0);
|
|
|
if (o == 0)
|
|
@@ -255,40 +264,37 @@ namespace Симлекс_метод
|
|
|
{
|
|
|
Console.WriteLine($"\n{o + 1}-я Симплекс-таблица:");
|
|
|
}
|
|
|
-
|
|
|
- for (int i = 0; i < a.GetLength(0); i++) // Вывод симлекс-таблицы
|
|
|
+ for (int i = 0; i < Table.GetLength(0); i++) // Вывод симлекс-таблицы
|
|
|
{
|
|
|
- for (int j = 0; j < a.GetLength(1); j++)
|
|
|
+ for (int j = 0; j < Table.GetLength(1); j++)
|
|
|
{
|
|
|
- Console.Write($"{a[i, j]:f3} ");
|
|
|
+ Console.Write($"{Table[i, j]:f3} ");
|
|
|
}
|
|
|
Console.WriteLine();
|
|
|
}
|
|
|
Console.WriteLine("\nРезультаты таблицы:");
|
|
|
- int temp = 0; // Количество 0 в столбце
|
|
|
- int temp2 = 0; // Количество 1 в столбце
|
|
|
- for (int j = 0; j < a.GetLength(1) - 1; j++) // Зполнение дополниетльной переменной значениями x
|
|
|
+ for (int j = 0; j < Table.GetLength(1) - 1; j++) // Зполнение дополниетельной переменной значениями x
|
|
|
{
|
|
|
- temp = 0;
|
|
|
- temp2 = 0;
|
|
|
- for (int i = 0; i < a.GetLength(0) - 1; i++) // Подсчёт количества 0 и 1 в столбце
|
|
|
+ int temp = 0; // Количество 0 в столбце
|
|
|
+ int temp1 = 0; // Количество 1 в столбце
|
|
|
+ for (int i = 0; i < Table.GetLength(0) - 1; i++) // Подсчёт количества 0 и 1 в столбце
|
|
|
{
|
|
|
- if (a[i, j] == 0)
|
|
|
+ if (Table[i, j] == 0)
|
|
|
temp++;
|
|
|
- if (a[i, j] == 1)
|
|
|
- temp2++;
|
|
|
+ if (Table[i, j] == 1)
|
|
|
+ temp1++;
|
|
|
}
|
|
|
- if (temp == a.GetLength(0) - 2 && temp2 == 1) // Если столбце единичный
|
|
|
+ if (temp == Table.GetLength(0) - 2 && temp1 == 1) // Если столбец единичный
|
|
|
{
|
|
|
- for (int i = 0; i < a.GetLength(0) - 1; i++)
|
|
|
+ for (int i = 0; i < Table.GetLength(0) - 1; i++)
|
|
|
{
|
|
|
- if (a[i, j] == 1)
|
|
|
+ if (Table[i, j] == 1)
|
|
|
{
|
|
|
temp = i;
|
|
|
}
|
|
|
}
|
|
|
Array.Resize(ref b, b.Length + 1);
|
|
|
- b[b.Length - 1] = Math.Round(a[temp, a.GetLength(1) - 1],3);
|
|
|
+ b[b.Length - 1] = Math.Round(Table[temp, Table.GetLength(1) - 1],3);
|
|
|
}
|
|
|
else // Если столбец не единичный
|
|
|
{
|
|
@@ -300,8 +306,36 @@ namespace Симлекс_метод
|
|
|
{
|
|
|
Console.WriteLine($"x{i + 1} = {b[i]}");
|
|
|
}
|
|
|
- Console.WriteLine($"F' = {Math.Round(a[a.GetLength(0) - 1, a.GetLength(1) - 1], 3)}");
|
|
|
- Console.WriteLine($"F = {Math.Round(Math.Abs(a[a.GetLength(0) - 1, a.GetLength(1) - 1]), 3)}");
|
|
|
+ Console.WriteLine($"F' = {Math.Round(Table[Table.GetLength(0) - 1, Table.GetLength(1) - 1], 3)}");
|
|
|
+ Console.WriteLine($"F = {Math.Round(Math.Abs(Table[Table.GetLength(0) - 1, Table.GetLength(1) - 1]), 3)}");
|
|
|
+ }
|
|
|
+ public void GetSolition()
|
|
|
+ {
|
|
|
+ int check = 0; // Переменная для проверки что все элементы в строке оценок < 0
|
|
|
+ int c, r; // Разрешающий столбец и строка
|
|
|
+ int o = 0;
|
|
|
+ while (true)
|
|
|
+ {
|
|
|
+ c = decisiveColumn(Table); // Нахождение разрешающего столбца
|
|
|
+ r = decisiveRow(Table, c); // Нахождение разрешающей строки
|
|
|
+ Console.WriteLine($"Разрешающий столбец: {c + 1}");
|
|
|
+ Console.WriteLine($"Разрешающая строка: {r + 1}");
|
|
|
+ solve(r, c); // Преобразование симплекс-таблицы
|
|
|
+ intermediate(ref x, o + 1); // Вывод промежуточных результатов
|
|
|
+ for (int j = 0; j < Table.GetLength(1) - 1; j++)
|
|
|
+ {
|
|
|
+ if (Table[Table.GetLength(0) - 1, j] <= 0)
|
|
|
+ {
|
|
|
+ check++; ;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (check == Table.GetLength(0) - 1)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ o++;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|