EgorPigalev 2 лет назад
Родитель
Сommit
af410e5f61

BIN
Симлекс_метод/.vs/Симлекс_метод/v17/.suo


+ 77 - 0
Симлекс_метод/Симлекс_метод/FileWork.cs

@@ -4,6 +4,7 @@ using System.IO;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using System.Windows.Forms;
 
 namespace Симлекс_метод
 {
@@ -11,6 +12,80 @@ namespace Симлекс_метод
     {
         public string pathStart; // Путь к исходному файлу
         public string pathEnd; // Путь к конечному файлу
+        public void VvodNameFile()
+        {
+            char otv; // Переменная для диалога
+            while (true)
+            {
+                Console.WriteLine("После нажатия Enter, Вам необходимо указать csv файл где хранятся входные данные");
+                Console.ReadKey();
+                OpenFileDialog OD = new OpenFileDialog();
+                OD.DefaultExt = ".csv";
+                OD.Filter = "Text documents (.csv)|*.csv";
+                if (OD.ShowDialog() == DialogResult.OK)
+                {
+                    pathStart = OD.FileName;
+                    break;
+                }
+                else
+                {
+                    while (true)
+                    {
+                        try
+                        {
+                            Console.Write("\nЖелаете повторить выбор входных данных?\nДа(Y)/Нет(N)\nОтвет: ");
+                            otv = Convert.ToChar(Console.ReadLine());
+                            break;
+                        }
+                        catch
+                        {
+                            Console.WriteLine("Введены некорректные данные!");
+                        }
+                    }
+                    if ((otv.Equals('N') || otv.Equals('N') || otv.Equals('Т') || otv.Equals('т')))
+                    {
+                        return;
+                    }
+                }
+            }
+        }
+        public void SaveNameFile() // Определение файла для вывода результатов
+        {
+            char otv; // Переменная для диалога с пользователем
+            while (true)
+            {
+                Console.WriteLine("После нажатия Enter, Вам необходимо указать csv файл куда будет сохранён результат");
+                Console.ReadKey();
+                SaveFileDialog OD = new SaveFileDialog();
+                OD.DefaultExt = ".csv";
+                OD.Filter = "Text documents (.csv)|*.csv";
+                if (OD.ShowDialog() == DialogResult.OK)
+                {
+                    pathEnd = OD.FileName;
+                    break;
+                }
+                else
+                {
+                    while (true)
+                    {
+                        try
+                        {
+                            Console.Write("\nЖелаете повторить выбор файла?\nДа(Y)/Нет(N)\nОтвет: ");
+                            otv = Convert.ToChar(Console.ReadLine());
+                            break;
+                        }
+                        catch
+                        {
+                            Console.WriteLine("Введены некорректные данные!");
+                        }
+                    }
+                    if ((otv.Equals('N') || otv.Equals('N') || otv.Equals('Т') || otv.Equals('т')))
+                    {
+                        return;
+                    }
+                }
+            }
+        }
         public void GetData(ref int n, ref int m, ref double[,] main, ref double[] res, ref double[] dohod)
         {
             var lines = File.ReadAllLines(pathStart);
@@ -97,6 +172,8 @@ namespace Симлекс_метод
         }
         public void Conclusion(double r, double[] a, double[,] b)
         {
+            File.AppendAllText(pathEnd, "Результат:;", Encoding.UTF8);
+            File.AppendAllText(pathEnd, Environment.NewLine);
             for (int i = 0; i < r; i++)
             {
                 File.AppendAllText(pathEnd, $"x{i + 1} =;{a[i]};");

+ 23 - 123
Симлекс_метод/Симлекс_метод/Program.cs

@@ -17,136 +17,36 @@ namespace Симлекс_метод
                 char otv;
                 FileWork fileWork = new FileWork();
                 Simplex simplex = new Simplex();
-                while (true)
-                {
-                    Console.WriteLine("После нажатия Enter, Вам необходимо указать csv файл где хранятся входные данные");
-                    Console.ReadKey();
-                    OpenFileDialog OD = new OpenFileDialog();
-                    OD.DefaultExt = ".csv";
-                    OD.Filter = "Text documents (.csv)|*.csv";
-                    if (OD.ShowDialog() == DialogResult.OK)
-                    {
-                        fileWork.pathStart = OD.FileName;
-                        break;
-                    }
-                    else
-                    {
-                        while (true)
-                        {
-                            try
-                            {
-                                Console.Write("\nЖелаете повторить выбор входных данных?\nДа(Y)/Нет(N)\nОтвет: ");
-                                otv = Convert.ToChar(Console.ReadLine());
-                                break;
-                            }
-                            catch
-                            {
-                                Console.WriteLine("Введены некорректные данные!");
-                            }
-                        }
-                        if ((otv.Equals('N') || otv.Equals('N') || otv.Equals('Т') || otv.Equals('т')))
-                        {
-                            return;
-                        }
-                    }
-                }
-                double[,] main = new double[0, 0]; // Расход сырья на единицу продуции
-                double[] res = new double[0]; // Запасы сырья
-                double[] dohod = new double[0]; // Доход от реализации единицы продукции
-                int n = 0; // Количество продукции
-                int m = 0; // Количество ресурсов
-                if (fileWork.Proverka() == true)
+                fileWork.VvodNameFile(); // Выбор файла, где хранятся входные данные
+                if (fileWork.Proverka() == true) // Проверка воходных данных на корректность
                 {
                     Console.ReadKey();
                     break;
                 }
-                fileWork.GetData(ref n, ref m, ref main, ref res, ref dohod);
-                simplex.Vvod(ref dohod);
-                int temp = main.GetLength(1) + 1; // Дополнительная переменная в СО
-                int dop = temp; // Дополнительная переменная для вывода в граничных условиях
-                simplex.MatModel(dohod, main, res); // Вывод математической модели
-                simplex.KanModel(dohod, main, res, temp, dop); // Вывод кананической модели
-
+                simplex.main = new double[0, 0];
+                simplex.res = new double[0];
+                simplex.dohod = new double[0];
+                simplex.n = 0;
+                simplex.m = 0;
+                fileWork.GetData(ref simplex.n, ref simplex.m, ref simplex.main, ref simplex.res, ref simplex.dohod);
+                simplex.Vvod(ref simplex.dohod);
+                simplex.temp = simplex.main.GetLength(1) + 1; // Дополнительная переменная в СО
+                simplex.dop = simplex.temp; // Дополнительная переменная для вывода в граничных условиях
+                simplex.MatModel(); // Вывод математической модели
+                simplex.KanModel(); // Вывод кананической модели
                 // Сборка первой симплекс таблицы
-                double[,] Table = new double[main.GetLength(0) + 1, main.GetLength(1) + main.GetLength(0) + 1]; // Массив симплекс-таблицы
-                temp = main.GetLength(1);
-                simplex.FirstTable(main, ref Table, res, dohod, ref temp);
-
-                //промежуточные
-                double[] ans = new double[0]; // Количество 
-                simplex.intermediate(Table, ref ans, 0);
-
-                //поиск индексов решающего элемента
-                bool check = false;
-                int col, row; // Разрешающий столбец и строка
-                int o = 0;
-                while (true)
-                {
-                    col = simplex.decisiveColumn(Table); // Нахождение разрешающего столбца
-                    row = simplex.decisiveRow(Table, col); // Нахождение разрешающей строки
-
-                    Console.WriteLine($"Разрешающий столбец: {col + 1}");
-                    Console.WriteLine($"Разрешающая строка: {row + 1}");
-
-                    simplex.solve(ref Table, row, col); // Преобразование симплекс-таблицы
-
-                    simplex.intermediate(Table, ref ans, o + 1); // Вывод промежуточных результатов
-
-                    for (int j = 0; j < Table.GetLength(1); j++)
-                    {
-                        if (Table[Table.GetLength(0) - 1, j] > 0 && Table[Table.GetLength(0) - 1, j] != 0)
-                        {
-                            check = false;
-                            break;
-                        }
-                        else
-                        {
-                            check = true;
-                        }
-                    }
-                    if (check)
-                    {
-                        break;
-                    }
-                    o++;
-                }
-                simplex.finalResults(main.GetLength(1), ans, Table);
+                simplex.Table = new double[simplex.main.GetLength(0) + 1, simplex.main.GetLength(1) + simplex.main.GetLength(0) + 1]; // Массив симплекс-таблицы
+                simplex.temp = simplex.main.GetLength(1);
+                simplex.FirstTable();
+                //Вывод промежуточных результатов
+                simplex.x = new double[0]; // Значение x в симплекс таблицах
+                simplex.intermediate(ref simplex.x, 0);
+                simplex.GetSolition(); // Нахождение всех промежуточных результатов
+                simplex.finalResults(simplex.main.GetLength(1));
                 Console.ReadKey();
                 Console.Clear();
-                while (true)
-                {
-                    Console.WriteLine("После нажатия Enter, Вам необходимо указать csv файл куда будет сохранён результат");
-                    Console.ReadKey();
-                    SaveFileDialog OD = new SaveFileDialog();
-                    OD.DefaultExt = ".csv";
-                    OD.Filter = "Text documents (.csv)|*.csv";
-                    if (OD.ShowDialog() == DialogResult.OK)
-                    {
-                        fileWork.pathEnd = OD.FileName;
-                        break;
-                    }
-                    else
-                    {
-                        while (true)
-                        {
-                            try
-                            {
-                                Console.Write("\nЖелаете повторить выбор файла?\nДа(Y)/Нет(N)\nОтвет: ");
-                                otv = Convert.ToChar(Console.ReadLine());
-                                break;
-                            }
-                            catch
-                            {
-                                Console.WriteLine("Введены некорректные данные!");
-                            }
-                        }
-                        if ((otv.Equals('N') || otv.Equals('N') || otv.Equals('Т') || otv.Equals('т')))
-                        {
-                            return;
-                        }
-                    }
-                }
-                fileWork.Conclusion(main.GetLength(1), ans, Table);
+                fileWork.SaveNameFile(); // Выюор файла для сохранения
+                fileWork.Conclusion(simplex.main.GetLength(1), simplex.x, simplex.Table);
                 while (true)
                 {
                     try

+ 70 - 36
Симлекс_метод/Симлекс_метод/Simplex.cs

@@ -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++;
+            }
         }
     }
 }

BIN
Симлекс_метод/Симлекс_метод/bin/Debug/Симлекс_метод.exe


BIN
Симлекс_метод/Симлекс_метод/bin/Debug/Симлекс_метод.pdb


BIN
Симлекс_метод/Симлекс_метод/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache


+ 8 - 0
Симлекс_метод/Симлекс_метод/obj/Debug/Симлекс_метод.csproj.FileListAbsolute.txt

@@ -6,3 +6,11 @@ C:\Users\Егор\Desktop\Подготовка к экзамену\Симлек
 C:\Users\Егор\Desktop\Подготовка к экзамену\Симлекс_метод\Симлекс_метод\obj\Debug\Симлекс_метод.csproj.CoreCompileInputs.cache
 C:\Users\Егор\Desktop\Подготовка к экзамену\Симлекс_метод\Симлекс_метод\obj\Debug\Симлекс_метод.exe
 C:\Users\Егор\Desktop\Подготовка к экзамену\Симлекс_метод\Симлекс_метод\obj\Debug\Симлекс_метод.pdb
+C:\Users\Егор\Desktop\PP\Симлекс_метод\Симлекс_метод\bin\Debug\Симлекс_метод.exe.config
+C:\Users\Егор\Desktop\PP\Симлекс_метод\Симлекс_метод\bin\Debug\Симлекс_метод.exe
+C:\Users\Егор\Desktop\PP\Симлекс_метод\Симлекс_метод\bin\Debug\Симлекс_метод.pdb
+C:\Users\Егор\Desktop\PP\Симлекс_метод\Симлекс_метод\obj\Debug\Симлекс_метод.csproj.AssemblyReference.cache
+C:\Users\Егор\Desktop\PP\Симлекс_метод\Симлекс_метод\obj\Debug\Симлекс_метод.csproj.SuggestedBindingRedirects.cache
+C:\Users\Егор\Desktop\PP\Симлекс_метод\Симлекс_метод\obj\Debug\Симлекс_метод.csproj.CoreCompileInputs.cache
+C:\Users\Егор\Desktop\PP\Симлекс_метод\Симлекс_метод\obj\Debug\Симлекс_метод.exe
+C:\Users\Егор\Desktop\PP\Симлекс_метод\Симлекс_метод\obj\Debug\Симлекс_метод.pdb

BIN
Симлекс_метод/Симлекс_метод/obj/Debug/Симлекс_метод.exe


BIN
Симлекс_метод/Симлекс_метод/obj/Debug/Симлекс_метод.pdb