Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Управление качеством / 7 семестр / Надежность и центральность

.docx
Скачиваний:
0
Добавлен:
26.06.2025
Размер:
18.71 Кб
Скачать

import sys import numpy as np import matplotlib.pyplot as plt import networkx as nx from concurrent.futures import ProcessPoolExecutor from scipy.optimize import curve_fit # Функция для экспоненциальной модели def exp_model(alpha, a0, a1, a2): return np.exp(a0 + a1 * alpha + a2 * alpha**2) # Функция для вычисления структурной надежности связности графа def connectivity(matrix): n = matrix.shape[0] R = np.sum(matrix) // 2 # Количество рёбер в графе R_min = n - 1 # Минимальное количество рёбер для связности R_max = n * (n - 1) // 2 # Максимальное количество рёбер в графе if R < R_min: print('ОШИБКА - граф не связан, в модуле "вычиление запаса структурной надежности"') return -1 # Граф несвязный alpha = (R - R_min) / (R_max - R_min) return alpha # Функция для вычисления центральности графа def centrality_index(matrix): G = nx.from_numpy_array(matrix) # Создаем граф из матрицы if not nx.is_connected(G): return 0 centrality = nx.betweenness_centrality(G, k=min(10, matrix.shape[0])) return np.mean(list(centrality.values())) # Эксперимент: вычисление структурной надежности и центральности def experiment(n, show_intermediate=False): while True: # Цикл для гарантии создания связного графа # Генерация полносвязного графа matrix = np.ones((n, n), dtype=int) np.fill_diagonal(matrix, 0) max_edges = n * (n - 1) // 2 if show_intermediate: print(f"\nГенерация полносвязного графа с {n} вершинами") print(matrix) # Удаление случайных рёбер m = np.random.randint(int(0.4 * max_edges), int(0.7 * max_edges)) edge_indices = [(i, j) for i in range(n) for j in range(i + 1, n)] random_edges = np.random.choice(len(edge_indices), size=m, replace=False) for idx in random_edges: i, j = edge_indices[idx] matrix[i, j] = 0 matrix[j, i] = 0 if show_intermediate: print(f"\nМатрица после удаления {m} рёбер:") print(matrix) # Проверка связности графа G = nx.from_numpy_array(matrix) if nx.is_connected(G): if show_intermediate: print("\nГраф связный.") break elif show_intermediate: print("\nГраф несвязный. Перегенерация...") # Вычисление структурной надежности alpha = connectivity(matrix) if show_intermediate: print(f"\nРезультат вычисления структурной надежности (α): {alpha}") # Вычисление центральности beta = centrality_index(matrix) if show_intermediate: print(f"Результат вычисления центральности (β): {beta}") return alpha, beta # Главный цикл для экспериментов N_values = [5, 10, 25, 50, 100] scatter_data = {} def run_experiments(n, show_intermediate_once): results = [] for i in range(1000): # Количество экспериментов фиксировано show_intermediate = show_intermediate_once and (i == 0) # Промежуточные результаты только для первого графа alpha, beta = experiment(n, show_intermediate) results.append((alpha, beta)) return results def process_experiments(show_intermediate_once): with ProcessPoolExecutor() as executor: futures = {n: executor.submit(run_experiments, n, show_intermediate_once) for n in N_values} for n, future in futures.items(): scatter_data[n] = future.result() # Запуск экспериментов if __name__ == '__main__': show_intermediate_once = input("Выводить промежуточные результаты для одного графа? (да/нет): ").strip().lower() == 'да' for i in range(len(N_values)): if N_values[i] <= 0: print("ОШИБКА - Число вершин должно быть > 0 ") sys.exit() if N_values[i] > 100: print("ОШИБКА - Число вершин должно быть < 100 ") sys.exit() process_experiments(show_intermediate_once) for n, data in scatter_data.items(): data_array = np.array(data) alpha_values = data_array[:, 0] beta_values = data_array[:, 1] # Подгонка экспоненциальной модели popt, _ = curve_fit(exp_model, alpha_values, beta_values, p0=(0.1, 0.1, 0.1)) a0, a1, a2 = popt # Генерация модели для визуализации alpha_model = np.linspace(min(alpha_values), max(alpha_values), 100) beta_model = exp_model(alpha_model, a0, a1, a2) # Визуализация plt.figure(figsize=(10, 6)) plt.scatter(alpha_values, beta_values, color='blue', alpha=0.5, s=10, label='Экспериментальные данные') plt.plot(alpha_model, beta_model, color='red', lw=2, label=f'Экспоненциальная модель\n$a_0={a0:.3f}$, $a_1={a1:.3f}$, $a_2={a2:.3f}$') plt.title(f'Структурная надежность vs Центральность (n={n})') plt.xlabel('Структурная надежность (α)') plt.ylabel('Центральность (β)') plt.grid(True) plt.legend() plt.show()

Соседние файлы в папке 7 семестр