commit 5d7e92d8aaf5f0232d9aa008975f4c7f926020b1 Author: Арина Абросимова Date: Mon Dec 18 17:14:01 2023 +0400 Вариант №2 diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..3dce9c6 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..a971a2c --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..041476e --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/simplex.iml b/.idea/simplex.iml new file mode 100644 index 0000000..d0876a7 --- /dev/null +++ b/.idea/simplex.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..ffc22b2 --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +# Лабараторная работа №1 + +## Группа: ПИбд-31 + +Участники: +- Хайбуллова Дания +- Негина Яна +- Абросимова Арина +- Юдакова Дания + +### Вариант №2: +>f(x) = 2x_1 + 3x_2 -> max +> +>x_1 + 3x_2 <= 18 +> +>2x_1 + x_2 <= 16 +> +>x_2 <= 5 +> +>3x_1 <= 21 +> +>x_i >= 0 \ No newline at end of file diff --git a/README.md.bak b/README.md.bak new file mode 100644 index 0000000..a27cc8d --- /dev/null +++ b/README.md.bak @@ -0,0 +1,22 @@ +# Лабараторная работа №1 + +## Группа: ПИбд-31 + +Участники: +- Хайбуллова Дания +- Негина Яна +- Абросимова Арина +- Юдакова Дания + +### Вариант 8: +>f(x) = 2x_1 + 3x_2 -> max +> +>x_1 + 3x_2 <= 18 +> +>2x_1 + x_2 <= 16 +> +>x_2 <= 5 +> +>3x_1 <= 21 +> +>x_i >= 0 \ No newline at end of file diff --git a/Simplex.py b/Simplex.py new file mode 100644 index 0000000..17ae9f8 --- /dev/null +++ b/Simplex.py @@ -0,0 +1,102 @@ +import numpy as np + + +class Simplex: + def __init__(self, source): + # Получение размеров матрицы source в переменные + # m (количество строк) и n (количество столбцов). + m, n = source.shape + self.table = np.zeros((m, n + m - 1)) + # Будет содержать индексы базисных переменных. + self.basis = [] + + + # Заполнение матрицы table значениями из матрицы source до столбца n. + # Остальные элементы инициализируются нулями. + for i in range(m): + for j in range(self.table.shape[1]): + if j < n: + self.table[i, j] = source[i, j] + else: + self.table[i, j] = 0 + # Добавление единицы в ячейку подходящей строки и столбца для создания единичной матрицы. + # Запись индекса этой переменной в список базисных переменных. + if (n + i) < self.table.shape[1]: + self.table[i, n + i] = 1 + self.basis.append(n + i) + # Сохранение значений m и n в атрибуты объекта. + self.m = m + self.n = self.table.shape[1] + + # Метод calculate, который выполняет итерации симплекс-метода до достижения оптимального решения + # или обнаружения отсутствия решения. + def calculate(self, result): + # Цикл, выполняющийся до тех пор, пока не будет достигнут критерий окончания + # (проверяется методом is_it_end()). + while not self.is_it_end(): + main_col = self.find_main_col() + main_row = self.find_main_row(main_col) + + # Обновление списка базисных переменных. + self.basis[main_row] = main_col + + # Инициализация новой матрицы нулями той же размерности, что и self.table. + new_table = np.zeros((self.m, self.n)) + + # Заполнение строки main_row новой матрицы значениями, + # полученными делением соответствующих элементов из исходной матрицы. + for j in range(self.n): + new_table[main_row, j] = self.table[main_row, j] / self.table[main_row, main_col] + + # Заполнение остальных строк новой матрицы путем вычитания соответствующих элементов исходной матрицы. + for i in range(self.m): + if i == main_row: + continue + + for j in range(self.n): + new_table[i, j] = self.table[i, j] - self.table[i, main_col] * new_table[main_row, j] + + # Обновление исходной матрицы. + self.table = new_table + + # Заполнение массива result значениями переменных в соответствии с текущим базисом. + for i in range(len(result)): + k = self.basis.index(i + 1) if i + 1 in self.basis else -1 + result[i] = self.table[k, 0] if k != -1 else 0 + # Возвращение итоговой матрицы после завершения симплекс-метода. + return self.table + + # Метод проверяет, выполнено ли условие завершения симплекс-метода. + def is_it_end(self): + # sВозвращает True, если все элементы последней строки матрицы больше + # или равны нулю (условие оптимальности). + return np.all(self.table[self.m - 1, 1:] >= 0) + + # Метод нахождения ведущего столбца методом find_main_col(). + def find_main_col(self): + main_col = 1 + + for j in range(2, self.n): + if self.table[self.m - 1, j] < self.table[self.m - 1, main_col]: + main_col = j + + return main_col + + # Метод для нахождения ведущий строки. Возвращает индекс найденной ведущей строки. + def find_main_row(self, main_col): + # Переменная для отслеживания индекса ведущей строки + main_row = 0 + + for i in range(self.m - 1): + if self.table[i, main_col] > 0: + main_row = i + break + + # Поиск строки с минимальным отношением элемента в столбце 0 к элементу в заданном столбце + # Отношение используется для выбора оптимальной строки для ведущей. + for i in range(main_row + 1, self.m - 1): + if self.table[i, main_col] > 0 and (self.table[i, 0] / self.table[i, main_col]) < ( + self.table[main_row, 0] / self.table[main_row, main_col]): + main_row = i + + return main_row \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..617aa9a --- /dev/null +++ b/main.py @@ -0,0 +1,24 @@ +import numpy as np +import tabulate as tb +from Simplex import Simplex + +X_COUNT = 2 # Задача содержит две переменные: x1 и x2. + +table = np.array([[18, 1, 3], + [16, 2, 1], + [5, 0, 1], + [21, 3, 0], + [0, -2, -3]]) + +# Инициализация массива result нулями для хранения решения (значений переменных). +result = np.zeros(X_COUNT) +S = Simplex(table) +# Вызов метода calculate объекта S для решения задачи. +table_result = S.calculate(result) + +print("Результирующая симплексная таблица:") +print(tb.tabulate(table_result)) + +print("\nРезультат:") +print(f"X[max] = {result}") +print(f"F[max] = {table_result[-1][0]:.2f}")