From b573569a97551fa31c11a6baad1fb1ce2e99ebcb Mon Sep 17 00:00:00 2001 From: pgirl111 Date: Sat, 19 Oct 2024 10:46:15 +0400 Subject: [PATCH] borschevskaya_anna_lab_6 is ready --- borschevskaya_anna_lab_6/README.md | 26 +++ borschevskaya_anna_lab_6/images/results.PNG | Bin 0 -> 63248 bytes .../matrix-det/.gitignore | 38 +++++ borschevskaya_anna_lab_6/matrix-det/pom.xml | 17 ++ .../src/main/java/ru/uni/rvip/Main.java | 155 ++++++++++++++++++ 5 files changed, 236 insertions(+) create mode 100644 borschevskaya_anna_lab_6/README.md create mode 100644 borschevskaya_anna_lab_6/images/results.PNG create mode 100644 borschevskaya_anna_lab_6/matrix-det/.gitignore create mode 100644 borschevskaya_anna_lab_6/matrix-det/pom.xml create mode 100644 borschevskaya_anna_lab_6/matrix-det/src/main/java/ru/uni/rvip/Main.java diff --git a/borschevskaya_anna_lab_6/README.md b/borschevskaya_anna_lab_6/README.md new file mode 100644 index 0000000..4869b36 --- /dev/null +++ b/borschevskaya_anna_lab_6/README.md @@ -0,0 +1,26 @@ +# Отчет. Лабораторная работа 6 + +## Описание +В рамках лабораторной работы была реализована программа, которая производит вычисление детерминанта матрицы +с применением последовательного и паралелльного алгоритма. + +В качестве способа нахождения определителя матрицы был выбран алгоритм нахождения путем разложения по столбцу (строке). +При данном подходе определитель находится как сумма произведений элементов выбранной строки на их алгебраические дополнения. +Была произведена небольшая оптимизация алгоритма - выбор строки для разложения основывался на количестве нулевых элементов в ней. +Чем больше нулей в строке - тем меньше будет выполняться подзадач в алгоритме. + +Результаты представлены на следующих изображениях: + +![results](images/results.PNG) + +Как мы можем увидеть, производительность паралелльной реализации на маленьких матрицах ниже, чем у последовательного подхода, +это связано с дополнительными действиями по созданию и управлению потоками. Однако с увеличением размера матриц мы можем +наблюдать увеличение производительности. Но на больших размерах (от 12х12) матриц алгоритм становится довольно медленным +вне зависимости от применения многопоточности. + +## Как запустить +Необходимо иметь установленную JDK 21. Можно воспользоваться встроенным в нее компилятором (javac), а затем запустить исполняемый файл (java) +или запускать из среды разработки. + +## Видео-отчет +Работоспособность лабораторной работы можно оценить в следующем [видео](https://disk.yandex.ru/i/-sWDKdW3Q-vbHg). \ No newline at end of file diff --git a/borschevskaya_anna_lab_6/images/results.PNG b/borschevskaya_anna_lab_6/images/results.PNG new file mode 100644 index 0000000000000000000000000000000000000000..df739dd41cec7079170cb7ae1b8b3d1ab01a22a5 GIT binary patch literal 63248 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 Hb-e!%g#TF{ literal 0 HcmV?d00001 diff --git a/borschevskaya_anna_lab_6/matrix-det/.gitignore b/borschevskaya_anna_lab_6/matrix-det/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/borschevskaya_anna_lab_6/matrix-det/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/borschevskaya_anna_lab_6/matrix-det/pom.xml b/borschevskaya_anna_lab_6/matrix-det/pom.xml new file mode 100644 index 0000000..f034aac --- /dev/null +++ b/borschevskaya_anna_lab_6/matrix-det/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + + ru.uni.rvip + matrix-det + 1.0-SNAPSHOT + + + 21 + 21 + UTF-8 + + + \ No newline at end of file diff --git a/borschevskaya_anna_lab_6/matrix-det/src/main/java/ru/uni/rvip/Main.java b/borschevskaya_anna_lab_6/matrix-det/src/main/java/ru/uni/rvip/Main.java new file mode 100644 index 0000000..db3f997 --- /dev/null +++ b/borschevskaya_anna_lab_6/matrix-det/src/main/java/ru/uni/rvip/Main.java @@ -0,0 +1,155 @@ +package ru.uni.rvip; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Random; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.stream.IntStream; + +public class Main { + + private static final ExecutorService executor = Executors.newFixedThreadPool(8); + + public static void main(String[] args) { + int size = 12; + + for (int i = 5; i <= size; i += 2) { + System.out.printf("Размер матриц %dx%d\n", i, i); + + var matrix = createRandomMatrix(i); + + var startTime = System.currentTimeMillis(); + var result = findDeterminant(matrix); + var timeOfExecution = System.currentTimeMillis() - startTime; + System.out.printf("Детерминант матрицы = %f\n", result); + System.out.printf("Время нахождения детерминанта с помощью последовательного алгоритма: %d ms\n", timeOfExecution); + + startTime = System.currentTimeMillis(); + findDeterminantParallel(matrix); + timeOfExecution = System.currentTimeMillis() - startTime; + System.out.printf("Время нахождения детерминанта с помощью параллельного алгоритма: %d ms\n", timeOfExecution); + } + executor.shutdown(); + } + + private static double findDeterminant(double[][] matrix) { + int rows = matrix.length; + int n = matrix[0].length; + if (rows == n && rows == 1) { + return matrix[0][0]; + } + if (rows == n && rows == 2) { + return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]; + } + + if (rows == n && rows == 3) { + return matrix[0][0] * matrix[1][1] * matrix[2][2] + matrix[0][1] * matrix[1][2] * matrix[2][0] + matrix[0][2] * matrix[1][0] * matrix[2][1] + - (matrix[0][2] * matrix[1][1] * matrix[2][0] + matrix[1][0] * matrix[0][1] * matrix[2][2] + matrix[0][0] * matrix[1][2] * matrix[2][1]); + } + double[][] temporary; + double det = 0; + // поиск наиболее подходящей строки + int indexWithMaxZeros = IntStream.range(0, matrix.length) + .boxed() + .max(Comparator.comparingInt(i -> + (int) Arrays.stream(matrix[i]).filter(x -> x == 0).count())) + .orElse(-1); + + double[] maxZerosCountRow = matrix[indexWithMaxZeros]; + + + for (int i = 0; i < n; i++) { + if (maxZerosCountRow[i] > 0) { + temporary = getSubmatrix(matrix, rows, n, i, indexWithMaxZeros); + det += maxZerosCountRow[i] * Math.pow(-1, i) * findDeterminant(temporary); + } + } + + return det; + } + + private static double findDeterminantParallel(double[][] matrix) { + int rows = matrix.length; + int n = matrix[0].length; + if (rows == n && rows == 1) { + return matrix[0][0]; + } + if (rows == n && rows == 2) { + return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]; + } + if (rows == n && rows == 3) { + return matrix[0][0] * matrix[1][1] * matrix[2][2] + matrix[0][1] * matrix[1][2] * matrix[2][0] + matrix[0][2] * matrix[1][0] * matrix[2][1] + - (matrix[0][2] * matrix[1][1] * matrix[2][0] + matrix[1][0] * matrix[0][1] * matrix[2][2] + matrix[0][0] * matrix[1][2] * matrix[2][1]); + } + double det = 0; + // поиск наиболее подходящей строки + int indexWithMaxZeros = IntStream.range(0, matrix.length) + .boxed() + .max(Comparator.comparingInt(i -> + (int) Arrays.stream(matrix[i]).filter(x -> x == 0).count())) + .orElse(-1); + + double[] maxZerosCountRow = matrix[indexWithMaxZeros]; + var futures = new ArrayList>(); + for (int i = 0; i < n; i++) { + // нахождение подматрицы + final var finalRow = i; + + futures.add(executor.submit(() -> { + final var temporary = getSubmatrix(matrix, rows, n, finalRow, indexWithMaxZeros); + return maxZerosCountRow[finalRow] * Math.pow(-1, finalRow) * findDeterminant(temporary); + })); + } + + try { + for (var future : futures) { + det += future.get(); + } + } catch (InterruptedException | ExecutionException e) { + System.out.println("Возникла ошибка во время многопоточного нахождения определителя матрицы"); + return -1; + } + return det; + } + + private static double[][] getSubmatrix(double[][] matrix, int rows, int n, int col, int row) { + final var temporary = new double[rows - 1][n - 1]; + for (int j = 0; j < rows; j++) { + if (j == row) continue; + + for (int k = 0; k < n; k++) { + if (k == col) continue; + + //temporary[j][k] = matrix[j][k]; + temporary[j < row ? j : j - 1][k < col ? k : k - 1] = matrix[j][k]; + } + } + return temporary; + } + + private static double[][] createRandomMatrix(Integer size) { + var matrix = new double[size][size]; + var random = new Random(); + for (var i = 0; i < size; i++) { + for (var j = 0; j < size; j++) { + matrix[i][j] = random.nextInt(50); + } + } + return matrix; + } + + private static void printMatrix(double[][] matrix) { + for (double[] ints : matrix) { + for (double elem : ints) { + System.out.printf("%5f\t", elem); + } + System.out.println(); + } + } +} + +