Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy as np
- import matplotlib.pyplot as plt
- import math
- ## Задание первоначальных данных ##
- rasp_ver_i={} # Распределение вероятности P(xi)
- A = 12
- alpha = - 0.02
- beta = 5
- n = [x for x in range(0,A)]
- i = [x for x in range(1,A+1)]
- Sum1 = 0
- g = 1
- for o in range(A):
- Sum1 += (math.e ** (alpha*(g - beta) ** 2))
- g += 1 # Вычисление суммы в знаменателе
- pref = 0
- Pxi = list() # Вычисление распределения вероятности
- for l in range(1, A + 1,1):
- pref = (math.e ** (alpha*(l - beta) ** 2) / Sum1)
- Pxi.append(pref)
- for x in i: # Задание таблицы (словаря) соответствий i - P(xi)
- rasp_ver_i[x] = Pxi[x-1]
- #print(rasp_ver_i, end='\n\n') # Вывод таблицы на экран
- P0=[]
- for x in i:
- P0.append(1/A)
- PP = [[0 for j in range (0,A+1)] for i in range (0,A+1)] ## Создали массив, пока что с нуликами, в дальнейшем после каждого цикла он будет заполняться
- ## Расчет апостериорных вероятностей ##
- def aposterior(P): ## Возвращает каждый цикл PP с новыми значениями
- global PP ## Обозначаем глобальную переменную, переменная становится доступной для следующего после оператора
- for c in range(1,A+1):
- PP[0][c] = P[c-1]
- for d in range(1,A):
- sum = [PP[d-1][k] for k in range(1,d+1)]
- Py=1-np.sum(sum)
- for f in range(1,A+1):
- if f <= d:
- PP[d][f] = 0
- else:
- PP[d][f] = (PP[d-1][f])/Py
- for a in range(0,A+1):
- for b in range(0,A+1):
- print(np.round((PP[a][b]), 3),end=' ')
- print()
- return PP
- ## Расчет КСН для последовательного алгоритма поиска ##
- Gn = [0 for q in range(0, len(n))] ## Len() если что возвращает количнство элементов в списке >>S = ['a','b','c'] >>len(S) >>5
- def ksn_poled(PP,P):
- global Gn, Hn, delH
- for l in n:
- q = [(-PP[l][i])*np.log2(PP[l][i]) for i in range(l+1,A+1)]
- Gn [l] = np.sum(q)
- Hn, delH = [0 for q in range(0, len(n))], [0 for q in range(0, len(n))]
- sum = [P[k] for k in range(0, A - 1)]
- for l in n:
- Hn[l] = Gn[l] * np.sum(sum)
- for l in range(1, A):
- delH[l] = Hn[l - 1] - Hn[l]
- ## Расчет КСН для последовательного алгоритма поиска ##
- aposterior(Pxi)
- ksn_poled(PP,Pxi)
- H1n = Hn
- print('Значения КСН для последовательного поиска для заданного распределения вероятности: ', np.round(H1n,3))
- delH1 = delH
- print('Значения декрементов неопределенности delH1: ', np.round(delH1,3))
- ## Построение графиков ##
- plt.figure(1)
- plt.subplot(2,2,1)
- plt.plot(n,H1n, color='black')
- plt.title("Кривая снятия неопределенности H1")
- plt.xlabel('n')
- plt.ylabel('H1n(n)')
- plt.grid()
- plt.figure(2)
- plt.subplot(2,2,1)
- plt.plot(n[1:],delH1[1:], color='black')
- plt.title("Декремент неопределенности delH1")
- plt.xlabel('n')
- plt.ylabel('delH1(n)')
- plt.grid()
- ## Расчет КСН для последовательного алгоритма поиска (равномерное распределение)##
- aposterior(P0)
- ksn_poled(PP,P0)
- H3n = Hn
- print('Значения КСН для последовательного поиска для равномерного распределения вероятности: ', np.round(H3n,3))
- delH3 = delH
- print('Значения декрементов неопределенности delH3: ', np.round(delH3,3))
- ## Построение графиков ##
- plt.figure(1)
- plt.subplot(2,2,3)
- plt.plot(n,H3n, color='black')
- plt.title("Кривая снятия неопределенности H3")
- plt.xlabel('n')
- plt.ylabel('H3n(n)')
- plt.grid()
- plt.figure(2)
- plt.subplot(2,2,3)
- plt.plot(n[1:],delH3[1:], color='black')
- plt.title("Декремент неопределенности delH3")
- plt.xlabel('n')
- plt.ylabel('delH3(n)')
- plt.grid()
- #
- #
- #
- #
- # Я ТУУУУУУУУУУУУУУУУУУТ
- #
- #
- #
- #
- ## Расчет КСН для дихотомического поиска ##
- class ksn_dixotom(): ## Создали класс КСН
- def __init__(self): ## ССылаем класс на самого себя)
- self.H = [0 for i in range (0,A//4+1)]
- 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)]
- def aprior(self, P):
- sum = [(-P[i]*np.log2(P[i])) for i in range(0,A)]
- self.H[0] = np.sum(sum) # Априорная энтропия
- return self.H[0]
- def aposterior_1(self, P):
- ## Апостериорная энтропия после первого измерения ##
- for it in range(0,A):
- if it <= 6:
- sum = [P[k] for k in range(0,A//2)]
- self.PP1[it]= P[it]/np.sum(sum)
- else:
- sum = [P[k] for k in range(7,A)]
- self.PP2[it] = P[it]/np.sum(sum)
- sum = [(-(self.PP1[k])*np.log2(self.PP1[k])) for k in range(0,A//2)]
- H1 = np.sum(sum)
- sum = [(-(self.PP2[k])*np.log2(self.PP2[k])) for k in range(7,A)]
- H2 = np.sum(sum)
- 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
- return self.H[1]
- def aposterior_2(self,P):
- ## Апостериорная энтропия после второго измерения ##
- for it in range(0,A):
- if it < A//4:
- sum = [P[k] for k in range(0,A//4)]
- self.PP1[it]= P[it]/np.sum(sum)
- elif A//3 <= it < A//2:
- sum = [P[k] for k in range(A//3,A//2)]
- self.PP2[it] = P[it]/np.sum(sum)
- elif 7 <= it < 3*A//4:
- sum = [P[k] for k in range(7, 3*A//4)]
- self.PP3[it] = P[it] / np.sum(sum)
- elif 15*A//18 <= it < A:
- sum = [P[k] for k in range(15*A//18, A)]
- self.PP4[it] = P[it] / np.sum(sum)
- sum = [(-(self.PP1[k])*np.log2(self.PP1[k])) for k in range(0,A//4)]
- H1 = np.sum(sum)
- sum = [(-(self.PP2[k])*np.log2(self.PP2[k])) for k in range(A//3,A//2)]
- H2 = np.sum(sum)
- sum = [(-(self.PP3[k])*np.log2(self.PP3[k])) for k in range(7,3*A//4)]
- H3 = np.sum(sum)
- sum = [(-(self.PP4[k])*np.log2(self.PP4[k])) for k in range(15*A//18,A)]
- H4 = np.sum(sum)
- 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
- return self.H[2]
- def aposterior_3(self, P):
- ## Апостериорная энтропия после третьего измерения ##
- for it in range(0,A):
- if it < A//6:
- sum = [P[k] for k in range(0,A//4)]
- self.PP1[it]= P[it]/np.sum(sum)
- elif 5 <= it < A//2:
- sum = [P[k] for k in range(5,A//2)]
- self.PP2[it] = P[it]/np.sum(sum)
- elif 8 <= it < 3*A//4:
- sum = [P[k] for k in range(8, 3*A // 4)]
- self.PP3[it] = P[it] / np.sum(sum)
- elif 11 <= it < A:
- sum = [P[k] for k in range(11, A)]
- self.PP4[it] = P[it] / np.sum(sum)
- # elif A//2 <= it < 5*A//8:
- # sum = [P[k] for k in range(A // 2, 5*A//8)]
- # self.PP5[it] = P[it] / np.sum(sum)
- # elif 5*A//8 <= it < 3*A//4:
- # sum = [P[k] for k in range(5*A // 8, 3*A//4)]
- # self.PP6[it] = P[it] / np.sum(sum)
- # elif 3*A//4 <= it < 7*A//8:
- # sum = [P[k] for k in range(3*A // 4, 7*A//8)]
- # self.PP7[it] = P[it] / np.sum(sum)
- # elif 7*A//8 <= it < A:
- # sum = [P[k] for k in range(7*A // 8, A)]
- # self.PP8[it] = P[it] / np.sum(sum)
- sum = [(-(self.PP1[k])*np.log2(self.PP1[k])) for k in range(0,A//4)]
- H1 = np.sum(sum)
- sum = [(-(self.PP2[k])*np.log2(self.PP2[k])) for k in range(5,A//2)]
- H2 = np.sum(sum)
- sum = [(-self.PP3[k]*np.log2(self.PP3[k])) for k in range(8,3*A//4)]
- H3 = np.sum(sum)
- sum = [(-self.PP4[k]*np.log2(self.PP4[k])) for k in range(11,A)]
- H4 = np.sum(sum)
- #sum = [(-self.PP5[k]*np.log2(self.PP5[k])) for k in range(A//2,5*A//8)]
- #H5 = np.sum(sum)
- #sum = [(-self.PP6[k]*np.log2(self.PP6[k])) for k in range(5*A//8,3*A//4)]
- #H6 = np.sum(sum)
- #sum = [(-self.PP7[k]*np.log2(self.PP7[k])) for k in range(3*A//4,7*A//8)]
- #H7 = np.sum(sum)
- #sum = [(-self.PP8[k]*np.log2(self.PP8[k])) for k in range(7*A//8,A)]
- #H8 = np.sum(sum)
- 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 #\
- # + 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
- return self.H[3]
- def aposterior_4(self):
- self.H[4] = 0
- return self.H[4]
- def dekrement(self):
- itH = [0,1,2,3,4]
- self.delH=[0,0,0,0,0]
- for l in range(1,A//3+1):
- self.delH[l]= self.H[l-1]-self.H[l]
- return self.delH
- def returning(self):
- return self.H
- #
- #
- #
- #
- # И ТУУУУУУУУУУУУУУУУУУТ
- #
- #
- #
- #
- ## Расчет КСН для дихотомического алгоритма поиска ##
- dixotom_ksn = ksn_dixotom()
- dixotom_ksn.aprior(Pxi)
- dixotom_ksn.aposterior_1(Pxi)
- dixotom_ksn.aposterior_2(Pxi)
- dixotom_ksn.aposterior_3(Pxi)
- dixotom_ksn.aposterior_4()
- H2n = dixotom_ksn.returning()
- delH2 = dixotom_ksn.dekrement()
- print('Значения КСН для дихотомического алгоритма поиска для заданного распределения', np.round(H2n,3))
- print('Значения декрементов неопределенности delH2: ', np.round(delH2,3))
- ## Построение графиков ##
- plt.figure(1)
- plt.subplot(2,2,2)
- plt.plot(n[1:5],H2n[1:], color='black')
- plt.title("Кривая снятия неопределенности H2")
- plt.xlabel('n')
- plt.ylabel('H2n(n)')
- plt.grid()
- plt.figure(2)
- plt.subplot(2,2,2)
- plt.plot(n[1:5],delH2[1:], color='black')
- plt.title("Декремент неопределенности delH2")
- plt.xlabel('n')
- plt.ylabel('delH2(n)')
- plt.grid()
- ## Расчет КСН для дихотомического алгоритма поиска (равномерное распределение)##
- dixotom_ksn = ksn_dixotom()
- dixotom_ksn.aprior(P0)
- dixotom_ksn.aposterior_1(P0)
- dixotom_ksn.aposterior_2(P0)
- dixotom_ksn.aposterior_3(P0)
- dixotom_ksn.aposterior_4()
- H4n = dixotom_ksn.returning()
- delH4 = dixotom_ksn.dekrement()
- print('Значения КСН для дихотомического алгоритма поиска для заданного распределения', np.round(H4n,3))
- print('Значения декрементов неопределенности delH2: ', np.round(delH4,3))
- ## Построение графиков ##
- plt.figure(1)
- plt.subplot(2,2,4)
- plt.plot(n[1:5],H4n[1:], color='black')
- plt.title("Кривая снятия неопределенности H4")
- plt.xlabel('n')
- plt.ylabel('H4n(n)')
- plt.grid()
- plt.figure(2)
- plt.subplot(2,2,4)
- plt.plot(n[1:5],delH4[1:], color='black')
- plt.title("Декремент неопределенности delH4")
- plt.xlabel('n')
- plt.ylabel('delH4(n)')
- plt.grid()
- plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement