Автор работы: Пользователь скрыл имя, 04 Мая 2013 в 20:35, курсовая работа
Python поддерживает несколько парадигм программирования, в том числе структурное, объектно-ориентированное, функциональное, императивное и аспектно-ориентированное. Основные архитектурные черты — динамическая типизация, автоматическое управление памятью, полная интроспекция, механизм обработки исключений, поддержка многопоточных вычислений и удобные высокоуровневые структуры данных. Код в Питоне организовывается в функции и классы, которые могут объединяться в модули (которые в свою очередь могут быть объединены в пакеты).
Программное обеспечение……………………………………………………………………………………………………3
Систематизация процесса контроля в условиях ограничений частичной упорядоченности……………………………………………………………………………………………………………………4
Теоретическая часть……………………………………………………………………………………………………..4
Практическая часть……………………………………………………………………………………………………….7
Выводы……………………………………………………………………………………………………………………….18
Определение количества повторных измерений контролируемых параметров оптимального по критерию максимума достоверности результатов……………………………….19
Теоретическая часть……………………………………………………………………………………………………19
Практическая часть…………………………………………………………………………………………………….20
Выводы……………………………………………………………………………………………………………………….24
Список используемой литературы………………………………………………………………………………………25
display_tree(i, tab + 1) # чем глубже рекурсия - тем шире табуляция
def draw_tree(count, tree, with_Toc=False):
tr = nx.Graph()
add_edge_to_tree(count, tree, tr, with_Toc)
pos = nx.spring_layout(tr)
colors = range(20)
nx.draw(tr, pos, node_size=200, node_color='#A0CBE2', width=2,
edge_cmap=plt.cm.Blues, with_labels=True)
if with_Toc:
file_name = 'solve_tree.png'
else:
file_name = 'variant_tree.png'
plt.savefig(file_name) # save as png
sys.stdout.write('Рисунок ' + file_name + ' сохранен\n')
# plt.show() # display
def list_to_str(list):
"""Функция принимает список и возвращает строку, созданную из списка"""
string = ''
for i in list:
string += str(i)
return string
def add_edge_to_tree(count, node, tr, with_Toc):
if node.childs_numbers:
for child in node.childs:
if len(child.parents_numbers) != count: # не будем рисовать последний узел
if with_Toc:
node_name = 'Z' + str(node.number) + ' ' + list_to_str(
node.parents_numbers) + ' (' + str(node.Toc) + ')'
child_name = 'Z' + str(child.number) + ' ' + list_to_str(
child.parents_numbers) + ' (' + str(child.Toc) + ')'
else:
node_name = list_to_str(node.parents_
child_name = list_to_str(child.parents_
tr.add_edge(node_name, child_name)
add_edge_to_tree(count, child, tr, with_Toc)
def read_data_from_file(file_name)
"""Функция чтения вводных данных из файла"""
data = open(file_name)
count = int(data.readline()[0])
# первая строка файла должна содержать кол-во элементов
tau = [int(x) for x in data.readline().split()[:
data.readline() # пропускаем пустую строку
t = []
for i in xrange(count):
t.append([int(x)
for x in data.readline().split()[:
data.readline() # пропускаем пустую строку
link = []
for i in xrange(count):
link.append([int(x)
for x in data.readline().split()[:
graph = []
for i in xrange(count):
graph.append(Node(i, tau[i]))
for i in xrange(count):
for j in xrange(count):
if link[i][j]:
graph[i].set_child(graph[j])
data.close()
return count, graph, t, tau
def calculate_b(count, tau, t):
b = [-1] * count # матрица для b. TODO найти более элегантное решение для заполнения матрицы
for i in range(count):
b[i] = [-1] * count
for i in xrange(count):
for j in xrange(count):
if t[i][j] >= 0:
if i < j:
b[i][j] = tau[i] + t[i][j]
return b
def display_b(b):
sys.stdout.write("Построим z-размерную матрицу bij:\n")
for i in range(len(b)):
for j in b[i]:
if j == -1:
temp = "-∞"
else:
temp = str(j)
sys.stdout.write(temp + '\t')
sys.stdout.write("\n")
sys.stdout.write("\n")
def calculate_Tn(count, graph, tau, t, b):
sys.stdout.write("Определим более раннее время начала модуля zk.\n")
Tn = []
for i in xrange(count):
temp = []
if i == 0:
sys.stdout.write("Tn(z%d) = 0\n" % i)
Tn.append(0)
continue
for parent in graph[i].parents:
temp.append(Tn[parent.number] + b[parent.number][i])
sys.stdout.write("Tn(z%d) = %d + %d = %d\n" % (i, Tn[parent.number], b[parent.number][i], Tn[parent.number] + b[parent.number][i]))
if len(temp) > 1:
sys.stdout.write("max(Tn(z%d)) = %d\n" % (i, max(temp)))
Tn.append(max(temp))
sys.stdout.write("\n")
return Tn
def calculate_TL(count, graph, tau, t):
sys.stdout.write(
"Определим длины путей, которые ведут от вершины zk к миноранте.\n")
TL = []
for x in xrange(count):
temp = []
generate_path(
graph[x], [], temp) # находим все пути от узла i до последнего узла
all_TL = []
for i in temp: # находим max
sys.stdout.write("T(L*(z%d))" % x)
sum_path = 0
for j in xrange(len(i)):
if i[j] != count - 1:
if j != 0:
sys.stdout.write(" + ")
else:
sys.stdout.write(" = ")
sum_path += tau[i[j]] # сумма всех узлов
sum_path += t[i[j]][i[j + 1]]
#прибавляем веса связей между узлами
sys.stdout.write(
"%d + %d" % (tau[i[j]], t[i[j]][i[j + 1]]))
else:
sys.stdout.write(" = %d\n" % sum_path)
all_TL.append(sum_path)
TL.append(max(all_TL)) # находим максимальное
if len(all_TL) > 1:
sys.stdout.write("max(T(L*(z%
sys.stdout.write("\n")
return TL
def generate_path(node, path, temp):
path.append(node.number)
if len(node.childs):
for child in node.childs:
generate_path(child, copy.copy(path), temp)
else:
temp.append(path)
def display_data_table(count, tau, Tn, TL, t):
sys.stdout.write('Полученные данные сведем в таблицу.\n')
sys.stdout.write('z\tτ\tTn\
U = []
t_temp = []
for i in range(len(t)):
for j in range(len(t[i])):
if t[i][j] != -1:
U.append((i, j))
t_temp.append(t[i][j])
for i in range(len(U)):
if i > len(tau) - 1:
sys.stdout.write("\t\t\t\t%s\
else:
sys.stdout.write("z%d\t%d\t%d\
i], Tn[i], TL[i], str(U[i]), t_temp[i]))
sys.stdout.write('\n')
def make_solve_tree(count, tree, Tn, TL, tau, t):
global solve_table
solve_table += 'S\tz\tN\tY\tt*\tTоц\n'
solve_tree = copy.copy(tree)
add_Toc_to_node(count, solve_tree, Tn, TL, tau, t)
recursive_make_solve_tree(
count, tree, Tn, TL, tau, t, solve_tree)
return solve_tree
def recursive_make_solve_tree(
solve_tree.childs = copy.copy(tree.childs)
solve_tree.childs_numbers = copy.copy(tree.childs_numbers)
if len(solve_tree.childs) == 0:
return
for child in solve_tree.childs:
add_Toc_to_node(count, child, Tn, TL, tau, t)
temp = {}
for child in solve_tree.childs:
temp[child.Toc] = child.number
for child in solve_tree.childs:
if child.number == temp[min(temp.keys())]: # если у потомка наименьший Toc
for child_of_tree in tree.childs:
if child_of_tree.number == temp[min(temp.keys())]: # находим такой же потомок у главного дерева
recursive_make_solve_tree(
else:
child.del_childs()
def add_Toc_to_node(count, node, Tn, TL, tau, t):
if len(node.parents_numbers) == count:
return
t_star = 0
for i in xrange(len(node.parents_
t_star += tau[node.parents_numbers[i]] # сумма всех узлов
if i < len(node.parents_numbers) - 1:
if t[node.parents_numbers[i]][
t_star += t[node.parents_numbers[i]][
i + 1]] # прибавляем веса связей между узлами
temp = {}
for child in node.childs:
q = TL[child.number]
if t_star < Tn[child.number]:
q += Tn[child.number] - t_star
temp[q] = child.number
node.Toc = max(temp.keys()) + t_star
global solve_table
global S
solve_table += "S" +
str(S) + '\t' + "z" + str(node.number) + '\t' + list_to_str(node.childs_
S += 1
def main():
count, graph, t, tau = read_data_from_file("data")
# draw_graph(graph)
# первый этап
tree = make_tree(graph)
# display_tree(tree)
# draw_tree(count, tree)
#второй этап
b = calculate_b(count, tau, t)
display_b(b)
#третий этап
Tn = calculate_Tn(count, graph, tau, t, b)
#четвертый этап
TL = calculate_TL(count, graph, tau, t)
display_data_table(count, tau, Tn, TL, t)
#пятый этап
solve_tree = make_solve_tree(count, tree, Tn, TL, tau, t)
global solve_table
sys.stdout.write("Оценки нижних границ:\n")
sys.stdout.write(solve_table)
# display_tree(solve_tree)
draw_tree(count, solve_tree, True)
if __name__ == '__main__':
main()
Приложение 2
Листинг программы на языке Python 2.7
# -*- coding: utf-8 -*-
import sys
import copy
sigma_default = [0.1, 0.2, 0.3, 0.4, 0.5]
p_default = [
[0.99893, 0.99930, 0.99945, 0.99955, 0.99960, 0.99963, 0.99967, 0.99970, 0.99971,
0.99973, 0.99974, 0.99975],
[0.99784, 0.99859, 0.99886, 0.99901, 0.99915, 0.99923, 0.99931, 0.99933, 0.99937,
0.99942, 0.99945, 0.99948],
[0.99634, 0.99775, 0.99821, 0.99846, 0.99868, 0.99879, 0.99890, 0.99895, 0.99901,
0.99909, 0.99914, 0.99918],
[0.99419, 0.99669, 0.99748, 0.99785, 0.99816, 0.99833, 0.99849, 0.99859,
0.99867, 0.99876, 0.99882, 0.99887],
[0.99110, 0.99533, 0.99657, 0.99714, 0.99756, 0.99780, 0.99801, 0.99818,
0.99828, 0.99839, 0.99848, 0.99854]]
def get_p(sigma):
p = [[] for i in sigma]
for i in range(len(sigma)):
p[i] =
p_default[sigma_default.index(
return p
def get_psi(i, j, p, t):
a = p[j][i]
if i == 0:
b = 0
else:
b = p[j][i - 1]
try:
return (a - b) / (b * t[j])
except ZeroDivisionError:
return -1
def get_table_psi(p, t):
table_psi = []
for i in range(len(p[0])):
table_psi.append([0 for x in t])
for j in range(len(t)):
table_psi[i][j] = get_psi(i, j, p, t)
return table_psi
def get_max_value(list):
max_value = 0
i_max = 0
j_max = 0
for i in range(len(list)):
for j in range(len(list[i])):
if list[i][j] > max_value:
max_value = list[i][j]
i_max = i
j_max = j
return i_max, j_max
def list_to_str(list):
s = ''
for i in list:
s += str(i) + "\t"
return s
def get_max_table(p, t, psi):
count = 1
multi = 1
for i in p:
multi *= i[0]
P = [multi]
T = [sum(t)]
temp_table = []
max_table = [[1 for i in psi[0]]]
temp = []
sys.stdout.write("N\tn\tΨ\
for i in range(len(psi)):
temp_table.append(copy.copy(
a = get_max_value(temp_table)[0]
b = get_max_value(temp_table)[1]
if temp_table[a][b] == -1:
continue
sys.stdout.write(
"%d\t%d\t%d\t%2.8f\n" % (count, a + 1, b + 1, temp_table[a][b]))
temp.append(temp_table[a][b])
count += 1
temp_table[a][b] = 0
max_table[-1][b] += 1
max_table.append(copy.copy(
P.append(P[-1] * p[b][a] / p[b][a - 1])
T.append(T[-1] + t[b])
while P[-1] < 0.992 and T[-1] < 600:
a = get_max_value(temp_table)[0]
b = get_max_value(temp_table)[1]
if temp_table[a][b] == -1:
continue
sys.stdout.write(
"%d\t%d\t%d\t%2.8f\n" % (count, a + 1, b + 1, temp_table[a][b]))
temp.append(temp_table[a][b])
count += 1
temp_table[a][b] = 0
max_table[-1][b] += 1
max_table.append(copy.copy(
P.append(P[-1] * p[b][a] / p[b][a - 1])
T.append(T[-1] + t[b])
sys.stdout.write("\n")
sys.stdout.write("N\tn1\tn2\
for i in range(len(max_table) - 1):
sys.stdout.write("%d\t%s%4.5f\
i + 1, list_to_str(max_table[i]), P[i + 1], T[i + 1] / 60, T[i + 1] % 60))
sys.stdout.write("\n")
sys.stdout.write('n\tΨ1(ni)\t\
for i in range(len(p[0])):
sys.stdout.write("%d\t" % (i + 1))
for j in range(len(t)):
if psi[i][j] == -1 or psi[i][j] not in temp:
sys.stdout.write('---------\t'
else:
sys.stdout.write('%4.7f\t' % psi[i][j])
sys.stdout.write("\n")
def main():
sigma = [0.3, 0.2, 0.4, 0.1, 0.5]
t = [30, 5, 15, 20, 50]
p = get_p(sigma)
psi = get_table_psi(p, t)
get_max_table(p, t, psi)
if __name__ == '__main__':
main()
Информация о работе Технический контроль и диагностика систем ЛА