DAS_2024_1/mochalov_danila_lab_6/main.py

86 lines
3.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import random as rnd
import time
from multiprocessing import Pool
# Функция для генерации квадратной матрицы заданного размера со случайными значениями от 0 до 100
def generateMatrixWithSize(size):
return [[rnd.randint(0, 100) for i in range(size)] for j in range(size)]
# Функция для вывода матрицы на экран
def printMatrix(matrix):
for row in matrix:
print(*row, sep="\t")
# Функция для вычисления определителя матрицы (стандартный алгоритм, рекурсивный)
def determinantOGWay(matrix):
size = len(matrix)
if size == 1:
return matrix[0][0]
elif size == 2:
return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]
else:
det = 0
for c in range(size):
submatrix = [row[:c] + row[c+1:] for row in matrix[1:]]
det += ((-1)**c) * matrix[0][c] * determinantOGWay(submatrix)
return det
# Функция для вычисления минора матрицы (для параллельного алгоритма)
def calculateMinor(matrix, row, col):
return [r[:col] + r[col+1:] for r in (matrix[:row]+matrix[row+1:])]
# Функция для вычисления части определителя в отдельном процессе (worker для Pool)
def determinantPart(args):
matrix, col_range_start, col_range_end = args
size = len(matrix)
det_part = 0
for c in range(col_range_start, col_range_end):
submatrix = calculateMinor(matrix, 0, c)
det_part += ((-1)**c) * matrix[0][c] * determinantOGWay(submatrix)
return det_part
# Функция для параллельного вычисления определителя матрицы с использованием процессов
def determinantWithProcesses(matrix, process_count):
size = len(matrix)
chunk_size = size // process_count
remainder = size % process_count
args = []
start_c = 0
for i in range(process_count):
end_c = start_c + chunk_size + (1 if i < remainder else 0)
args.append((matrix, start_c, end_c))
start_c = end_c
with Pool(processes=process_count) as pool:
results = pool.map(determinantPart, args)
return sum(results)
if __name__ == "__main__":
matrix_sizes = [9,10,11] # С большими размерами рекурсивный метод очень долгий, лучше использовать другие алгоритмы (например в numpy)
num_processes = [1, 2, 4]
for size in matrix_sizes:
matrix = generateMatrixWithSize(size)
# Замер времени для стандартного вычисления определителя
start_time = time.time()
det_og = determinantOGWay(matrix)
end_time = time.time()
print(f"Обычный режим. Размер матрицы: {size}x{size}. Время: {end_time - start_time} сек. Определитель: {det_og}")
# Замер времени для параллельного вычисления определителя с разным количеством процессов
for processes in num_processes:
start_time = time.time()
det_parallel = determinantWithProcesses(matrix, processes)
end_time = time.time()
print(f"Параллельный режим. Размер матрицы: {size}x{size}. Количество процессов: {processes}. Время: {end_time - start_time} сек. Определитель: {det_parallel}")
print("\n\n")