1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
import numpy as np
from collections import deque
import random
import networkx as nx
import matplotlib.pyplot as plt
import ot
def adj_to_dist(adj_matrix):
n = len(adj_matrix)
distance_matrix = np.full((n, n), np.inf)
for start in range(n):
# BFS
queue = deque([start])
distances = [-1] * n
distances[start] = 0
while queue:
current = queue.popleft()
for neighbor in range(n):
if adj_matrix[current][neighbor] == 1 and distances[neighbor] == -1:
distances[neighbor] = distances[current] + 1
queue.append(neighbor)
for end in range(n):
if distances[end] != -1:
distance_matrix[start][end] = distances[end]
return distance_matrix.astype(int)
def plot_graph(adj_matrix):
G = nx.from_numpy_array(adj_matrix)
pos = nx.spring_layout(G, seed=42)
nx.draw(G, pos, with_labels=True, node_color='skyblue', edge_color='gray',
node_size=800, font_size=12, font_weight='bold')
plt.title("Graph")
plt.savefig("graph.png")
print("Saved: 'graph.png' に保存しました")
def gen_random_adj_matrix(n, edge_prob=0.3, seed=None):
# n : ノード数
# edge_prob : 各辺が存在する確率
# seed : ランダムシード
if seed is not None:
np.random.seed(seed)
# 上三角行列にランダムな0/1を生成(対角は0)
upper_tri = np.triu(np.random.rand(n, n) < edge_prob, k=1).astype(int)
# 対称行列に変換(上三角 + 転置)
adj_matrix = upper_tri + upper_tri.T
return adj_matrix
def main():
adj = gen_random_adj_matrix(6, edge_prob=0.5, seed=42)
plot_graph(adj)
if __name__ == "__main__":
main()
|