\u003ct-22/\u003e \u003ct-24/\u003e \u003ct-26/\u003e \u003ct-28/\u003e \u003ct-30/\u003e : \u003cc-32/\u003e/ \u003cc-34/\u003e
import networkx as nx import matplotlib.pyplot as plt import random # Définir le graphique de l'architecture de sécurité def build_security_graph(): G = nx.Graph() # Noeuds : Pays/Régions (se concentrer sur l'Europe + Ukraine, pas les États-Unis) nodes = [ 'Ukraine', 'Pologne', 'Allemagne', 'France', 'Royaume-Uni', 'Estonie', 'Roumanie', 'Bulgarie', 'Suède', 'Finlande', 'Turquie', 'Suisse' # Neutre pour les données ] G.add_nodes_from(nodes) # Arêtes : Alliances/Priorités (géopolitique, économique, cyber, info) # Poids : Force (1-10, plus élevé = lien plus fort) edges = [ ('Ukraine', 'Pologne', {'weight': 9, 'type': 'géopolitique/économique'}), ('Ukraine', 'Allemagne', {'weight': 8, 'type': 'économique/cyber'}), ('Ukraine', 'France', {'weight': 7, 'type': 'info/pouvoir doux'}), ('Ukraine', 'Royaume-Uni', {'weight': 8, 'type': 'militaire/intel'}), ('Ukraine', 'Estonie', {'weight': 6, 'type': 'cyber'}), ('Ukraine', 'Roumanie', {'weight': 7, 'type': 'géopolitique/mer noire'}), ('Pologne', 'Allemagne', {'weight': 9, 'type': 'économique'}), ('Allemagne', 'France', {'weight': 10, 'type': 'noyau de l'UE'}), ('France', 'Royaume-Uni', {'weight': 7, 'type': 'post-Brexit'}), ('Estonie', 'Suède', {'weight': 8, 'type': 'cyber nordique'}), ('Suède', 'Finlande', {'weight': 9, 'type': 'nordique'}), ('Roumanie', 'Bulgarie', {'weight': 6, 'type': 'mer noire'}), ('Ukraine', 'Turquie', {'weight': 5, 'type': 'militaire/drone'}), ('Suisse', 'Allemagne', {'weight': 6, 'type': 'protection des données'}), ('Suisse', 'Ukraine', {'weight': 4, 'type': 'hub de données neutre'}) ] G.add_edges_from(edges) return G # Simuler la propagation de menaces hybrides (par exemple, attaque cybernétique à partir d'un nœud externe) def simulate_threat(G, start_node='External_Threat', target='Ukraine', steps=5): # Ajouter un nœud de menace externe G.add_node(start_node) # Connecter la menace aux arêtes vulnérables (par exemple, aux nœuds faisant face à la Russie) G.add_edge(start_node, 'Ukraine', {'weight': 1, 'type': 'hybride'}) G.add_edge(start_node, 'Estonie', {'weight': 1, 'type': 'cyber'}) G.add_edge(start_node, 'Roumanie', {'weight': 1, 'type': 'info'}) # Propagation simple : Marche aléatoire avec vérification de résilience current = start_node path = [current] resilience_scores = {node: random.uniform(0.7, 1.0) for node in G.nodes()} # Haute résilience dans le réseau for _ in range(steps): neighbors = list(G.neighbors(current)) if not neighbors: break next_node = random.choice(neighbors) edge_weight = G[current][next_node]['weight'] # La résilience atténue la propagation if random.random() > (edge_weight / 10) * resilience_scores[next_node]: print(f"Menace bloquée à {next_node} en raison de la résilience.") break current = next_node path.append(current) return path, resilience_scores[target] # Visualiser le graphique def visualize_graph(G): pos = nx.spring_layout(G) edge_labels = nx.get_edge_attributes(G, 'type') nx.draw(G, pos, with_labels=True, node_color='lightblue', node_size=500) nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels) plt.title("Graphique de l'Architecture de Sécurité Européenne-Ukraine") plt.show() # Ou enregistrer en tant qu'image : plt.savefig('security_arch.png') # Exécution principale if __name__ == "__main__": G = build_security_graph() threat_path, ukraine_resilience = simulate_threat(G, steps=10) print(f"Chemin de menace simulé : {threat_path}") print(f"Score de résilience de l'Ukraine : {ukraine_resilience:.2f}") visualize_graph(G) # Commenter si pas d'affichage ; enregistrer à la place pour l'image