diff --git a/README.md b/README.md index 1aaa2a5..e63fd04 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,14 @@ -# PIbd-31_Musoev.D.T._Computed_Math +# Лабораторная работа №1 по ВМ +___ + +## Состав команды (ПИбд-32): + +- ### Мусоев Денис +- ### Батылкина Алина +- ### Ихонкина Екатерина +- ### Бытылкин Артем + +## Задание: + +![Картинка задания](image/task.jpg) \ No newline at end of file diff --git a/image/task.jpg b/image/task.jpg new file mode 100644 index 0000000..147ccb4 Binary files /dev/null and b/image/task.jpg differ diff --git a/src/main.py b/src/main.py new file mode 100644 index 0000000..b13b1fe --- /dev/null +++ b/src/main.py @@ -0,0 +1,76 @@ +import numpy as np +import math +import matplotlib.pyplot as plt + +class Simplex: + def __init__(self, source): + self.m, self.n = source.shape + self.table = np.zeros((self.m, self.n + self.m - 1)) + self.basis = [] + + for i in range(self.m): + self.table[i, :self.n] = source[i, :] + + if (self.n + i) < self.table.shape[1]: + self.table[i, self.n + i] = 1 + self.basis.append(self.n + i) + + self.n = self.table.shape[1] + + def calculate(self, result): + while not self.is_optimal_solution(): + main_col = self.select_pivot_column() + main_row = self.select_pivot_row(main_col) + self.basis[main_row] = main_col + self.perform_pivot(main_row, main_col) + + self.extract_solution(result) + return self.table + + def is_optimal_solution(self): + return all(self.table[self.m - 1, 1:] >= 0) + + def select_pivot_column(self): + return np.argmin(self.table[self.m - 1, 1:]) + 1 + + def select_pivot_row(self, main_col): + rows = [i for i in range(self.m - 1) if self.table[i, main_col] > 0] + return min(rows, key=lambda i: self.table[i, 0] / self.table[i, main_col]) + + def perform_pivot(self, main_row, main_col): + self.table[main_row, :] /= self.table[main_row, main_col] + for i in range(self.m): + if i != main_row: + self.table[i, :] -= self.table[i, main_col] * self.table[main_row, :] + + def extract_solution(self, result): + for i in range(len(result)): + k = self.basis.index(i + 1) if i + 1 in self.basis else None + result[i] = self.table[k, 0] if k is not None else 0 + +if __name__ == "__main__": + table = np.array([ + [45, 5, 3], + [-8, -1, 0], + [-10, 0, -1], + [0, -40, -36] + ]) + + result = np.zeros(2) + table_result = Simplex(table).calculate(result) + temp = -table[-1][-2] * result[0] + -table[-1][-1] * math.ceil(result[1]) + + table_data = [["{0:.2f}".format(value) for value in row] for row in table_result] + + fig, ax = plt.subplots() + ax.axis('tight') + ax.axis('off') + ax.table(cellText=table_data, cellLoc='center', loc='center') + + plt.text(-0.06, 0.055, "Решение:") + plt.text(-0.05, 0.045, f"X[1] = {result[0]}") + plt.text(-0.05, 0.035, f"X[2] = {math.ceil(result[1])}") + plt.text(-0.05, 0.025, f"F(x1, x2) = {temp}") + plt.text(-0.06, 0.015, "Решенная симплекс-таблица:") + + plt.show()