Вариант №2
This commit is contained in:
commit
5d7e92d8aa
3
.idea/.gitignore
vendored
Normal file
3
.idea/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
12
.idea/inspectionProfiles/Project_Default.xml
Normal file
12
.idea/inspectionProfiles/Project_Default.xml
Normal file
@ -0,0 +1,12 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<profile version="1.0">
|
||||
<option name="myName" value="Project Default" />
|
||||
<inspection_tool class="PyPep8NamingInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true">
|
||||
<option name="ignoredErrors">
|
||||
<list>
|
||||
<option value="N806" />
|
||||
</list>
|
||||
</option>
|
||||
</inspection_tool>
|
||||
</profile>
|
||||
</component>
|
6
.idea/inspectionProfiles/profiles_settings.xml
Normal file
6
.idea/inspectionProfiles/profiles_settings.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
</component>
|
4
.idea/misc.xml
Normal file
4
.idea/misc.xml
Normal file
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11" project-jdk-type="Python SDK" />
|
||||
</project>
|
8
.idea/modules.xml
Normal file
8
.idea/modules.xml
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/simplex.iml" filepath="$PROJECT_DIR$/.idea/simplex.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
8
.idea/simplex.iml
Normal file
8
.idea/simplex.iml
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
6
.idea/vcs.xml
Normal file
6
.idea/vcs.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
22
README.md
Normal file
22
README.md
Normal file
@ -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
|
22
README.md.bak
Normal file
22
README.md.bak
Normal file
@ -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
|
102
Simplex.py
Normal file
102
Simplex.py
Normal file
@ -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
|
24
main.py
Normal file
24
main.py
Normal file
@ -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}")
|
Loading…
Reference in New Issue
Block a user