Advertisement
Guest User

Untitled

a guest
Jun 24th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.13 KB | None | 0 0
  1. #*********
  2. # Fait Par
  3. # Maxime Carbonneau (16 209 657)
  4. #
  5. # Pour strassen, nous avons besoin de la library numpy
  6. # Pour l'installer, éxécuter la ligne suivante dans un terminal en mode administrateur
  7. # pip install numpy
  8. #
  9. #*********
  10. from random import random
  11. from math import floor
  12. import heapq
  13. import numpy as np
  14. import time
  15.  
  16. TAILLE_MATRICE = 4 # NE PAS CHANGER
  17.  
  18. def naif(A,B, TAILLE):
  19. X = np.asarray(A)
  20. Y = np.asarray(B)
  21.  
  22. result = ([[0 for i in range(TAILLE)] for j in range(TAILLE)])
  23. # iterate through rows of X
  24. for i in range(len(X)):
  25. # iterate through columns of Y
  26. for j in range(len(Y[0])):
  27. # iterate through rows of Y
  28. for k in range(len(Y)):
  29. result[i][j] += X[i][k] * Y[k][j]
  30.  
  31. return result
  32.  
  33.  
  34. # https://stackoverflow.com/questions/12867099/strassen-matrix-multiplication-close-but-still-with-bugs
  35. def straight(a, b):
  36. if len(a[0]) != len(b): return "Matrices are not m*n and n*p"
  37. p_matrix = np.zeros((len(a), len(b[0])))
  38. p_matrix += [[np.sum([a[i][k] * b[k][j] for k in range(len(b))]) for j in range(len(b[0]))] for i in range(len(a))]
  39. return p_matrix
  40.  
  41. # split matrix into quarters
  42. def split(matrix):
  43. row, col = matrix.shape
  44. return matrix[:row//2, :col//2], matrix[:row//2, col//2:], matrix[row//2:, :col//2], matrix[row//2:, col//2:]
  45.  
  46. def strassen(a, b):
  47. q = len(a)
  48. if q == 1: # base case: 1x1 matrix
  49. return a * b
  50. a11, a12, a21, a22 = split(a)
  51. b11, b12, b21, b22 = split(b)
  52. p1 = strassen(a11 + a22, b11 + b22) # p1 = (a11 + a22) * (b11 + b22)
  53. p2 = strassen(a21 + a22, b11) # p2 = (a21 + a22) * b11
  54. p3 = strassen(a11, b12 - b22) # p3 = a11 * (b12 - b22)
  55. p4 = strassen(a22, b21 - b11) # p4 = a22 * (b21 - b11)
  56. p5 = strassen(a11 + a12, b22) # p5 = (a11 + a12) * b22
  57. p6 = strassen(a21 - a11, b11 + b12) # p6 = (a21 - a11) * (b11 + b12)
  58. p7 = strassen(a12 - a22, b21 + b22) # p7 = (a12 - a22) * (b21 + b22)
  59. c11 = p1 + p4 - p5 + p7 # c11 = p1 + p4 - p5 + p7
  60. c12 = p3 + p5 # c12 = p3 + p5
  61. c21 = p2 + p4 # c21 = p2 + p4
  62. c22 = p1 + p3 - p2 + p6 # c22 = p1 + p3 - p2 + p6
  63. c = np.vstack((np.hstack((c11, c12)), np.hstack((c21, c22))))
  64. return c
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73. n = int(input("Entrez un n (Nombre d'élément à afficher) : "))
  74.  
  75. #Liste des évènements possible qui peuvent se produire lors d'un harcèlement
  76. # Probabilités que l'évènement se produise
  77. #e = ["Insulter", "Rabaisser", "Frapper", "Violer"]
  78. e = np.matrix([[round(random(), 2)] for i in range(TAILLE_MATRICE)])
  79.  
  80. #Liste des effets psychologiques et physiques définies par des évènements
  81. # AUGMENTÉ d'un effet non identifié
  82. f = ["Atteinte à la dignité", "Santé physique", "Peur", "Effet non identifié"]
  83.  
  84. # f = Re où R est la matrice des probabilités
  85. R = np.matrix([[round(random(), 2) for i in range(TAILLE_MATRICE)] for j in range(TAILLE_MATRICE)])
  86.  
  87. # Matrice des probabilités qu'un effet provoque un type d'harcèlement
  88. Q = np.matrix([[round(random(), 2) for i in range(TAILLE_MATRICE)] for j in range(TAILLE_MATRICE)])
  89.  
  90. matrix_strassen = strassen(Q,R)
  91. h = np.dot(matrix_strassen, e) # Q * R * e
  92.  
  93. # Afficher dans un ordre croissant les n éléments de h ayant les plus fortes valeurs
  94. print("Numéro 1.1 et 1.2")
  95. result_array = np.squeeze(np.asarray(h))
  96. result_array.sort()
  97. for i in range(n):
  98. print(i, ":", result_array[i])
  99.  
  100.  
  101.  
  102. # Comparer le temps d’exécution des deux algorithmes
  103. print("Numéro 1.3")
  104. print("SIZE", "NAIF", "------------", "STRASSEN")
  105.  
  106. for count in range(2,10):
  107. SIZE = 2**count
  108. Q = np.matrix([[round(random(), 2) for i in range(SIZE)] for j in range(SIZE)])
  109. R = np.matrix([[round(random(), 2) for i in range(SIZE)] for j in range(SIZE)])
  110.  
  111. start = time.time()
  112. matrix_naif = naif(Q,R,SIZE) # Q * R
  113. end = time.time()
  114. temps_naif = end - start
  115.  
  116. start = time.time()
  117. matrix_strassen = strassen(Q,R) # Q * R
  118. end = time.time()
  119. temps_strassen = end - start
  120.  
  121.  
  122. print(SIZE, round(temps_naif, 4), " ------------", round(temps_strassen, 4))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement