lab1 complete

This commit is contained in:
movavi 2023-12-18 15:41:50 +03:00
parent d4fb67ce1c
commit f2193d197a
3 changed files with 89 additions and 1 deletions

View File

@ -1,2 +1,14 @@
# PIbd-31_Musoev.D.T._Computed_Math
# Лабораторная работа №1 по ВМ
___
## Состав команды (ПИбд-32):
- ### Мусоев Денис
- ### Батылкина Алина
- ### Ихонкина Екатерина
- ### Бытылкин Артем
## Задание:
![Картинка задания](image/task.jpg)

BIN
image/task.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

76
src/main.py Normal file
View File

@ -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()