3 Commits c5a0bcdd91 ... 62930ca1ef

Author SHA1 Message Date
  ArrayKat 62930ca1ef Merge branch 'featSimplexMetod' 5 months ago
  ArrayKat cc6ef67850 fix: update simplex metod in max and min 5 months ago
  ArrayKat c8bf0ad5a1 feat: add simplex metod 5 months ago

+ 133 - 0
MathModelingSimulator/Function/SimplexMetod.cs

@@ -0,0 +1,133 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MathModelingSimulator.Function
+{
+    internal class SimplexMetod
+    {
+        public int MainSimplexMetod(int[,] mas, bool isMax)
+        {
+
+            while (check(mas, isMax)) //пока в строке функционала есть отрицательные/положительные элементы в последней строке
+            {
+                //находим минимум в последней строке, это и будет ведущим столбцом
+                int leadingColumn = LeadingColumn(mas, isMax); //индекс ведущего столбца
+                int leadingRow = LeadingRow(mas, leadingColumn);//находим индекс ведущей строки
+                mas[leadingRow, 0] = mas[0, leadingColumn]; //меняем базисы
+
+                int ledingElement = mas[leadingRow, leadingColumn]; //ведущий элемент
+                for (int j = 1; j < mas.GetLength(1); j++) //делаем 1 ведущую строку с ведущим элементом
+                {
+                    mas[leadingRow, j] = mas[leadingRow, j] / ledingElement;
+                }
+
+
+                int otrZnach = 0;
+                for (int i = 1; i < mas.GetLength(0); i++) //ведущий столбюец, кроме ведущего элемента - равен 0
+                {
+                    for (int j = 1; j < mas.GetLength(1); j++)
+                    {
+                        if (j == 1 && i != leadingRow)
+                        {
+                            otrZnach = mas[i, leadingColumn] * (-1);
+                        }
+                        if (i != leadingRow)
+                        {
+                            mas[i, j] = mas[leadingRow, j] * otrZnach + mas[i, j];
+                        }
+
+                    }
+                }
+            }
+            return mas[mas.GetLength(0) - 1, mas.GetLength(1) - 1];
+        }
+        int LeadingColumn(int[,] mas, bool isMax)
+        {
+            if (isMax)
+            {
+                int min = int.MaxValue;
+                int IndCol = 0;
+                for (int i = mas.GetLength(0) - 1; i < mas.GetLength(0); i++)
+                {
+                    for (int j = 1; j < mas.GetLength(1); j++)
+                    {
+                        if (mas[i, j] < min)
+                        {
+                            min = mas[i, j];
+                            IndCol = j;
+                        }
+                    }
+                }
+                return IndCol;
+            }
+            else
+            {
+                int max = 0;
+                int IndCol = 0;
+                for (int i = mas.GetLength(0) - 1; i < mas.GetLength(0); i++)
+                {
+                    for (int j = 1; j < mas.GetLength(1); j++)
+                    {
+                        if (mas[i, j] > max)
+                        {
+                            max = mas[i, j];
+                            IndCol = j;
+                        }
+                    }
+                }
+                return IndCol;
+            }
+        }
+        int LeadingRow(int[,] mas, int indLeadingCol)
+        {
+            int result;
+            int indLeadingRow = 1;
+            int indLastColumn = mas.GetLength(1) - 1;
+            int min = int.MaxValue;
+            for (int i = 1; i < mas.GetLength(0) - 1; i++)
+            {
+                if (mas[i, indLeadingCol] > 0)
+                {
+                    result = mas[i, indLastColumn] / mas[i, indLeadingCol];
+                    if (result < min)
+                    {
+                        min = result;
+                        indLeadingRow = i;
+                    }
+                }
+
+            }
+            return indLeadingRow;
+        }
+        bool check(int[,] mas, bool isMax)
+        {
+            if (isMax)
+            {
+                int indRow = mas.GetLength(0) - 1;
+                for (int j = 1; j < mas.GetLength(1); ++j)
+                {
+                    if (mas[indRow, j] < 0)
+                    {
+                        return true; // продолжать проверять
+                    }
+                }
+                return false; //остановиться
+            }
+            else
+            {
+                int indRow = mas.GetLength(0) - 1;
+                for (int j = 1; j < mas.GetLength(1); ++j)
+                {
+                    if (mas[indRow, j] > 0)
+                    {
+                        return true; // продолжать проверять
+                    }
+                }
+                return false; //остановиться
+            }
+        }
+    }
+}

+ 31 - 2
MathModelingSimulator/ViewModels/CreateSimulatorViewModel.cs

@@ -93,7 +93,8 @@ namespace MathModelingSimulator.ViewModels
 				fillMatrix();
                 switch (selectedSimulator)
                 {
-                    case "Ñèìïëåêñ ìåòîä": MessageRezult = "ß ïîêà íå óìåþ òàêîå ðåøàòü"; break;
+                    case "Ñèìïëåêñ ìåòîä íà ìèíèìóì": GetMinSimplexMetod(); break;
+                    case "Ñèìïëåêñ ìåòîä íà ìàêñèìóì": GetMaxSimplexMetod(); break;
                     case "Çàäà÷à Êîììèâîÿæåðà": MessageRezult = "ß ïîêà íå óìåþ òàêîå ðåøàòü"; break;
                     case "Òðàíñïîðòíûå çàäà÷è. Ìåòîä àïïðîêñèìàöèè Ôîãåëÿ": GetAnswerZadFogel(); break;
                     case "Çàäà÷à Äæîíñîíà": GetAnswerZadDzhonsons(); break;
@@ -175,7 +176,35 @@ namespace MathModelingSimulator.ViewModels
 				Answer = "0";
             }
 		}
-
+		void GetMinSimplexMetod() {
+            SimplexMetod simplexMetod = new SimplexMetod();
+            var rezult = simplexMetod.MainSimplexMetod(_matrixBD, false);
+            if (rezult != null)
+            {
+                Answer = rezult.ToString();
+            }
+            else
+            {
+                IsVisibleRezult = true;
+                MessageRezult = "Âàøà ìàòðèöà íå ïîäõîäèò äëÿ ýòîé çàäà÷è";
+                Answer = "0";
+            }
+        }
+        void GetMaxSimplexMetod()
+        {
+            SimplexMetod simplexMetod = new SimplexMetod();
+            var rezult = simplexMetod.MainSimplexMetod(_matrixBD, true);
+            if (rezult != null)
+            {
+                Answer = rezult.ToString();
+            }
+            else
+            {
+                IsVisibleRezult = true;
+                MessageRezult = "Âàøà ìàòðèöà íå ïîäõîäèò äëÿ ýòîé çàäà÷è";
+                Answer = "0";
+            }
+        }
         public void CreateTask()
 		{
 			if (CountRows != 0 && CountColumns != 0)

+ 22 - 5
MathModelingSimulator/Views/SimulatorsView.axaml

@@ -45,7 +45,7 @@
 						Background="Transparent"
 						Foreground="White"
 						Padding="20 15 20 15"
-						Content="Тренажер 2. Симплекс метод"
+						Content="Тренажер 2. Симплекс метод на минимум"
 						Command="{Binding SimulatorsVM.GetTaskSimulator}"
 						CommandParameter="2"/>
 
@@ -63,12 +63,11 @@
 						Background="Transparent"
 						Foreground="White"
 						Padding="20 15 20 15"
-						Content="Тренажер 3. Задача Коммивояжера"
+						Content="Тренажер 3. Симплекс метод на максимум"
 						Command="{Binding SimulatorsVM.GetTaskSimulator}"
 						CommandParameter="3"/>
 
 				</Border>
-
 				<Border
 					BorderBrush="#000000"
 					BorderThickness="1"
@@ -81,7 +80,7 @@
 						Background="Transparent"
 						Foreground="White"
 						Padding="20 15 20 15"
-						Content="Тренажер 4. Задача Джонсона"
+						Content="Тренажер 4. Задача Коммивояжера"
 						Command="{Binding SimulatorsVM.GetTaskSimulator}"
 						CommandParameter="4"/>
 
@@ -99,12 +98,30 @@
 						Background="Transparent"
 						Foreground="White"
 						Padding="20 15 20 15"
-						Content="Тренажер 5. Алгоритм Дейкстры"
+						Content="Тренажер 5. Задача Джонсона"
 						Command="{Binding SimulatorsVM.GetTaskSimulator}"
 						CommandParameter="5"/>
 
 				</Border>
 
+				<Border
+					BorderBrush="#000000"
+					BorderThickness="1"
+					Background="#09A0B3"
+					CornerRadius="10"
+					Margin="0 20 0 0">
+
+					<Button
+						HorizontalAlignment="Stretch"
+						Background="Transparent"
+						Foreground="White"
+						Padding="20 15 20 15"
+						Content="Тренажер 6. Алгоритм Дейкстры"
+						Command="{Binding SimulatorsVM.GetTaskSimulator}"
+						CommandParameter="6"/>
+
+				</Border>
+
 			</StackPanel>
 
 			<!--Для преподавателя-->