Advertisement
Guest User

Untitled

a guest
Feb 21st, 2020
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.44 KB | None | 0 0
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. import math
  4.  
  5. ## Задание первоначальных данных ##
  6. rasp_ver_i={} # Распределение вероятности P(xi)
  7. A = 12
  8. alpha = - 0.02
  9. beta = 5
  10. n = [x for x in range(0,A)]
  11. i = [x for x in range(1,A+1)]
  12. Sum1 = 0
  13. g = 1
  14. for o in range(A):
  15. Sum1 += (math.e ** (alpha*(g - beta) ** 2))
  16. g += 1 # Вычисление суммы в знаменателе
  17. pref = 0
  18. Pxi = list() # Вычисление распределения вероятности
  19. for l in range(1, A + 1,1):
  20. pref = (math.e ** (alpha*(l - beta) ** 2) / Sum1)
  21. Pxi.append(pref)
  22. for x in i: # Задание таблицы (словаря) соответствий i - P(xi)
  23. rasp_ver_i[x] = Pxi[x-1]
  24. #print(rasp_ver_i, end='\n\n') # Вывод таблицы на экран
  25. P0=[]
  26. for x in i:
  27. P0.append(1/A)
  28.  
  29. PP = [[0 for j in range (0,A+1)] for i in range (0,A+1)] ## Создали массив, пока что с нуликами, в дальнейшем после каждого цикла он будет заполняться
  30. ## Расчет апостериорных вероятностей ##
  31.  
  32. def aposterior(P): ## Возвращает каждый цикл PP с новыми значениями
  33. global PP ## Обозначаем глобальную переменную, переменная становится доступной для следующего после оператора
  34. for c in range(1,A+1):
  35. PP[0][c] = P[c-1]
  36. for d in range(1,A):
  37. sum = [PP[d-1][k] for k in range(1,d+1)]
  38. Py=1-np.sum(sum)
  39. for f in range(1,A+1):
  40. if f <= d:
  41. PP[d][f] = 0
  42. else:
  43. PP[d][f] = (PP[d-1][f])/Py
  44. for a in range(0,A+1):
  45. for b in range(0,A+1):
  46. print(np.round((PP[a][b]), 3),end=' ')
  47. print()
  48. return PP
  49.  
  50.  
  51. ## Расчет КСН для последовательного алгоритма поиска ##
  52.  
  53. Gn = [0 for q in range(0, len(n))] ## Len() если что возвращает количнство элементов в списке >>S = ['a','b','c'] >>len(S) >>5
  54.  
  55. def ksn_poled(PP,P):
  56. global Gn, Hn, delH
  57. for l in n:
  58. q = [(-PP[l][i])*np.log2(PP[l][i]) for i in range(l+1,A+1)]
  59. Gn [l] = np.sum(q)
  60. Hn, delH = [0 for q in range(0, len(n))], [0 for q in range(0, len(n))]
  61. sum = [P[k] for k in range(0, A - 1)]
  62. for l in n:
  63. Hn[l] = Gn[l] * np.sum(sum)
  64. for l in range(1, A):
  65. delH[l] = Hn[l - 1] - Hn[l]
  66.  
  67. ## Расчет КСН для последовательного алгоритма поиска ##
  68. aposterior(Pxi)
  69. ksn_poled(PP,Pxi)
  70. H1n = Hn
  71. print('Значения КСН для последовательного поиска для заданного распределения вероятности: ', np.round(H1n,3))
  72. delH1 = delH
  73. print('Значения декрементов неопределенности delH1: ', np.round(delH1,3))
  74.  
  75. ## Построение графиков ##
  76. plt.figure(1)
  77. plt.subplot(2,2,1)
  78. plt.plot(n,H1n, color='black')
  79. plt.title("Кривая снятия неопределенности H1")
  80. plt.xlabel('n')
  81. plt.ylabel('H1n(n)')
  82. plt.grid()
  83.  
  84. plt.figure(2)
  85. plt.subplot(2,2,1)
  86. plt.plot(n[1:],delH1[1:], color='black')
  87. plt.title("Декремент неопределенности delH1")
  88. plt.xlabel('n')
  89. plt.ylabel('delH1(n)')
  90. plt.grid()
  91.  
  92. ## Расчет КСН для последовательного алгоритма поиска (равномерное распределение)##
  93. aposterior(P0)
  94. ksn_poled(PP,P0)
  95. H3n = Hn
  96. print('Значения КСН для последовательного поиска для равномерного распределения вероятности: ', np.round(H3n,3))
  97. delH3 = delH
  98. print('Значения декрементов неопределенности delH3: ', np.round(delH3,3))
  99.  
  100. ## Построение графиков ##
  101. plt.figure(1)
  102. plt.subplot(2,2,3)
  103. plt.plot(n,H3n, color='black')
  104. plt.title("Кривая снятия неопределенности H3")
  105. plt.xlabel('n')
  106. plt.ylabel('H3n(n)')
  107. plt.grid()
  108.  
  109. plt.figure(2)
  110. plt.subplot(2,2,3)
  111. plt.plot(n[1:],delH3[1:], color='black')
  112. plt.title("Декремент неопределенности delH3")
  113. plt.xlabel('n')
  114. plt.ylabel('delH3(n)')
  115. plt.grid()
  116.  
  117. #
  118. #
  119. #
  120. #
  121. # Я ТУУУУУУУУУУУУУУУУУУТ
  122. #
  123. #
  124. #
  125. #
  126.  
  127. ## Расчет КСН для дихотомического поиска ##
  128. class ksn_dixotom(): ## Создали класс КСН
  129.  
  130. def __init__(self): ## ССылаем класс на самого себя)
  131. self.H = [0 for i in range (0,A//4+1)]
  132. self.PP1, self.PP2, self.PP3, self.PP4, self.PP5, self.PP6, self.PP7, self.PP8 = [0 for i in range(0, A)], [0 for i in range(0, A)], [0 for i in range(0, A)], [0 for i in range(0, A)], [0 for i in range(0, A)], [0 for i in range(0, A)], [0 for i in range(0, A)], [0 for i in range(0, A)]
  133. def aprior(self, P):
  134. sum = [(-P[i]*np.log2(P[i])) for i in range(0,A)]
  135. self.H[0] = np.sum(sum) # Априорная энтропия
  136. return self.H[0]
  137.  
  138. def aposterior_1(self, P):
  139. ## Апостериорная энтропия после первого измерения ##
  140. for it in range(0,A):
  141. if it <= 6:
  142. sum = [P[k] for k in range(0,A//2)]
  143. self.PP1[it]= P[it]/np.sum(sum)
  144. else:
  145. sum = [P[k] for k in range(7,A)]
  146. self.PP2[it] = P[it]/np.sum(sum)
  147. sum = [(-(self.PP1[k])*np.log2(self.PP1[k])) for k in range(0,A//2)]
  148. H1 = np.sum(sum)
  149. sum = [(-(self.PP2[k])*np.log2(self.PP2[k])) for k in range(7,A)]
  150. H2 = np.sum(sum)
  151. self.H[1] = np.sum([P[k] for k in range(0,A//2)])*H1 + np.sum([P[k] for k in range(7,A)])*H2
  152. return self.H[1]
  153.  
  154. def aposterior_2(self,P):
  155. ## Апостериорная энтропия после второго измерения ##
  156. for it in range(0,A):
  157. if it < A//4:
  158. sum = [P[k] for k in range(0,A//4)]
  159. self.PP1[it]= P[it]/np.sum(sum)
  160. elif A//3 <= it < A//2:
  161. sum = [P[k] for k in range(A//3,A//2)]
  162. self.PP2[it] = P[it]/np.sum(sum)
  163. elif 7 <= it < 3*A//4:
  164. sum = [P[k] for k in range(7, 3*A//4)]
  165. self.PP3[it] = P[it] / np.sum(sum)
  166. elif 15*A//18 <= it < A:
  167. sum = [P[k] for k in range(15*A//18, A)]
  168. self.PP4[it] = P[it] / np.sum(sum)
  169.  
  170. sum = [(-(self.PP1[k])*np.log2(self.PP1[k])) for k in range(0,A//4)]
  171. H1 = np.sum(sum)
  172. sum = [(-(self.PP2[k])*np.log2(self.PP2[k])) for k in range(A//3,A//2)]
  173. H2 = np.sum(sum)
  174. sum = [(-(self.PP3[k])*np.log2(self.PP3[k])) for k in range(7,3*A//4)]
  175. H3 = np.sum(sum)
  176. sum = [(-(self.PP4[k])*np.log2(self.PP4[k])) for k in range(15*A//18,A)]
  177. H4 = np.sum(sum)
  178. self.H[2] = np.sum([P[k] for k in range(0,A//4)])*H1 + np.sum([P[k] for k in range(A//3,A//2)])*H2 + np.sum([P[k] for k in range(7,3*A//4)])*H3 + np.sum([P[k] for k in range(15*A//18,A)])*H4
  179. return self.H[2]
  180.  
  181. def aposterior_3(self, P):
  182. ## Апостериорная энтропия после третьего измерения ##
  183. for it in range(0,A):
  184. if it < A//6:
  185. sum = [P[k] for k in range(0,A//4)]
  186. self.PP1[it]= P[it]/np.sum(sum)
  187. elif 5 <= it < A//2:
  188. sum = [P[k] for k in range(5,A//2)]
  189. self.PP2[it] = P[it]/np.sum(sum)
  190. elif 8 <= it < 3*A//4:
  191. sum = [P[k] for k in range(8, 3*A // 4)]
  192. self.PP3[it] = P[it] / np.sum(sum)
  193. elif 11 <= it < A:
  194. sum = [P[k] for k in range(11, A)]
  195. self.PP4[it] = P[it] / np.sum(sum)
  196. # elif A//2 <= it < 5*A//8:
  197. # sum = [P[k] for k in range(A // 2, 5*A//8)]
  198. # self.PP5[it] = P[it] / np.sum(sum)
  199. # elif 5*A//8 <= it < 3*A//4:
  200. # sum = [P[k] for k in range(5*A // 8, 3*A//4)]
  201. # self.PP6[it] = P[it] / np.sum(sum)
  202. # elif 3*A//4 <= it < 7*A//8:
  203. # sum = [P[k] for k in range(3*A // 4, 7*A//8)]
  204. # self.PP7[it] = P[it] / np.sum(sum)
  205. # elif 7*A//8 <= it < A:
  206. # sum = [P[k] for k in range(7*A // 8, A)]
  207. # self.PP8[it] = P[it] / np.sum(sum)
  208.  
  209. sum = [(-(self.PP1[k])*np.log2(self.PP1[k])) for k in range(0,A//4)]
  210. H1 = np.sum(sum)
  211. sum = [(-(self.PP2[k])*np.log2(self.PP2[k])) for k in range(5,A//2)]
  212. H2 = np.sum(sum)
  213. sum = [(-self.PP3[k]*np.log2(self.PP3[k])) for k in range(8,3*A//4)]
  214. H3 = np.sum(sum)
  215. sum = [(-self.PP4[k]*np.log2(self.PP4[k])) for k in range(11,A)]
  216. H4 = np.sum(sum)
  217. #sum = [(-self.PP5[k]*np.log2(self.PP5[k])) for k in range(A//2,5*A//8)]
  218. #H5 = np.sum(sum)
  219. #sum = [(-self.PP6[k]*np.log2(self.PP6[k])) for k in range(5*A//8,3*A//4)]
  220. #H6 = np.sum(sum)
  221. #sum = [(-self.PP7[k]*np.log2(self.PP7[k])) for k in range(3*A//4,7*A//8)]
  222. #H7 = np.sum(sum)
  223. #sum = [(-self.PP8[k]*np.log2(self.PP8[k])) for k in range(7*A//8,A)]
  224. #H8 = np.sum(sum)
  225. self.H[3] = np.sum([P[k] for k in range(0,A//4)])*H1 + np.sum([P[k] for k in range(5,A//2)])*H2 + np.sum([P[k] for k in range(8,3*A//4)])*H3 + np.sum([P[k] for k in range(11,A)])*H4 #\
  226. # + np.sum([P[k] for k in range(A//2,5*A//8)])*H5 + np.sum([P[k] for k in range(5*A//8,3*A//4)])*H6 + np.sum([P[k] for k in range(3*A//4,7*A//8)])*H7 + np.sum([P[k] for k in range(7*A//8,A)])*H8
  227. return self.H[3]
  228.  
  229. def aposterior_4(self):
  230. self.H[4] = 0
  231. return self.H[4]
  232.  
  233. def dekrement(self):
  234. itH = [0,1,2,3,4]
  235. self.delH=[0,0,0,0,0]
  236. for l in range(1,A//3+1):
  237. self.delH[l]= self.H[l-1]-self.H[l]
  238. return self.delH
  239.  
  240. def returning(self):
  241. return self.H
  242. #
  243. #
  244. #
  245. #
  246. # И ТУУУУУУУУУУУУУУУУУУТ
  247. #
  248. #
  249. #
  250. #
  251.  
  252. ## Расчет КСН для дихотомического алгоритма поиска ##
  253. dixotom_ksn = ksn_dixotom()
  254. dixotom_ksn.aprior(Pxi)
  255. dixotom_ksn.aposterior_1(Pxi)
  256. dixotom_ksn.aposterior_2(Pxi)
  257. dixotom_ksn.aposterior_3(Pxi)
  258. dixotom_ksn.aposterior_4()
  259. H2n = dixotom_ksn.returning()
  260. delH2 = dixotom_ksn.dekrement()
  261. print('Значения КСН для дихотомического алгоритма поиска для заданного распределения', np.round(H2n,3))
  262. print('Значения декрементов неопределенности delH2: ', np.round(delH2,3))
  263.  
  264. ## Построение графиков ##
  265. plt.figure(1)
  266. plt.subplot(2,2,2)
  267. plt.plot(n[1:5],H2n[1:], color='black')
  268. plt.title("Кривая снятия неопределенности H2")
  269. plt.xlabel('n')
  270. plt.ylabel('H2n(n)')
  271. plt.grid()
  272.  
  273. plt.figure(2)
  274. plt.subplot(2,2,2)
  275. plt.plot(n[1:5],delH2[1:], color='black')
  276. plt.title("Декремент неопределенности delH2")
  277. plt.xlabel('n')
  278. plt.ylabel('delH2(n)')
  279. plt.grid()
  280.  
  281. ## Расчет КСН для дихотомического алгоритма поиска (равномерное распределение)##
  282. dixotom_ksn = ksn_dixotom()
  283. dixotom_ksn.aprior(P0)
  284. dixotom_ksn.aposterior_1(P0)
  285. dixotom_ksn.aposterior_2(P0)
  286. dixotom_ksn.aposterior_3(P0)
  287. dixotom_ksn.aposterior_4()
  288. H4n = dixotom_ksn.returning()
  289. delH4 = dixotom_ksn.dekrement()
  290. print('Значения КСН для дихотомического алгоритма поиска для заданного распределения', np.round(H4n,3))
  291. print('Значения декрементов неопределенности delH2: ', np.round(delH4,3))
  292.  
  293. ## Построение графиков ##
  294. plt.figure(1)
  295. plt.subplot(2,2,4)
  296. plt.plot(n[1:5],H4n[1:], color='black')
  297. plt.title("Кривая снятия неопределенности H4")
  298. plt.xlabel('n')
  299. plt.ylabel('H4n(n)')
  300. plt.grid()
  301.  
  302. plt.figure(2)
  303. plt.subplot(2,2,4)
  304. plt.plot(n[1:5],delH4[1:], color='black')
  305. plt.title("Декремент неопределенности delH4")
  306. plt.xlabel('n')
  307. plt.ylabel('delH4(n)')
  308. plt.grid()
  309. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement