Python で隣接行列を用いてグラフを表現します。
グラフ理論については、下記を読んでいる途中です。
隣接行列
グラフ理論および計算機科学において、隣接行列(りんせつぎょうれつ、英: adjacency matrix)は、有限グラフ(英語版)を表わすために使われる正方行列である。
出典: フリー百科事典『ウィキペディア(Wikipedia)』
以下のような隣接行列で表される、辺の重みをもつ無向グラフを考えます。
\begin{pmatrix} 0 & 0 & 20 & 0 & 10 \\ 0 & 0 & 30 & 0 & 40 \\ 20 & 30 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 50 \\ 10 & 40 & 0 & 50 & 0 \end{pmatrix}
下のようなグラフです。
このグラフを Python で表現します。
class Vertex(object):
def __init__(self, id):
self.id = id
def get_id(self):
return self.id
def set_id(self, id):
self.id = id
class Graph(object):
def __init__(self, num_vertex):
self.adj_matrix = [[0] * num_vertex for _ in range(num_vertex)]
self.num_vertex = num_vertex
self.vertices = []
for i in range(0, num_vertex):
new_vertex = Vertex(i)
self.vertices.append(new_vertex)
def set_vertex(self, vtx, id):
if 0 <= vtx < self.num_vertex:
self.vertices[vtx].set_id(id)
def get_vertex(self, n):
for vertxin in range(0, self.num_vertex):
if n == self.vertices[vertxin].get_id():
return vertxin
return -1
def add_edge(self, frm, to, weight=0):
if self.get_vertex(frm) != -1 and self.get_vertex(to) != -1:
self.adj_matrix[self.get_vertex(frm)][self.get_vertex(to)] = weight
# 有向グラフの場合は別
self.adj_matrix[self.get_vertex(to)][self.get_vertex(frm)] = weight
def get_vertices(self):
vertices = []
for vertxin in range(0, self.num_vertex):
vertices.append(self.vertices[vertxin].get_id())
return vertices
def print_matrix(self):
for u in range(0, self.num_vertex):
row = []
for v in range(0, self.num_vertex):
row.append(self.adj_matrix[u][v])
print(row)
def get_edges(self):
edges = []
for v in range(0, self.num_vertex):
for u in range(0, self.num_vertex):
if self.adj_matrix[u][v] != 0:
vid = self.vertices[v].get_id()
wid = self.vertices[u].get_id()
edges.append((vid, wid, self.adj_matrix[u][v]))
return edges
if __name__ == '__main__':
graph = Graph(5)
print('隣接行列')
graph.print_matrix()
print('ノード')
print(graph.get_vertices())
print('エッジ')
print(graph.get_edges())
print('-----------------------')
# 隣接行列
# [0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0]
# ノード
# [0, 1, 2, 3, 4]
# エッジ
# []
# -----------------------
graph.set_vertex(0, 'a')
graph.set_vertex(1, 'b')
graph.set_vertex(2, 'c')
graph.set_vertex(3, 'd')
graph.set_vertex(4, 'e')
print('隣接行列')
graph.print_matrix()
print('ノード')
print(graph.get_vertices())
print('エッジ')
print(graph.get_edges())
print('-----------------------')
# 隣接行列
# [0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0]
# ノード
# ['a', 'b', 'c', 'd', 'e']
# エッジ
# []
# -----------------------
graph.add_edge('a', 'e', 10)
graph.add_edge('a', 'c', 20)
graph.add_edge('c', 'b', 30)
graph.add_edge('b', 'e', 40)
graph.add_edge('e', 'd', 50)
print('隣接行列')
graph.print_matrix()
print('ノード')
print(graph.get_vertices())
print('エッジ')
print(graph.get_edges())
print('-----------------------')
# 隣接行列
# [0, 0, 20, 0, 10]
# [0, 0, 30, 0, 40]
# [20, 30, 0, 0, 0]
# [0, 0, 0, 0, 50]
# [10, 40, 0, 50, 0]
# ノード
# ['a', 'b', 'c', 'd', 'e']
# エッジ
# [('a', 'c', 20), ('a', 'e', 10), ('b', 'c', 30), ('b', 'e', 40), ('c', 'a', 20), ('c', 'b', 30), ('d', 'e', 50), ('e', 'a', 10), ('e', 'b', 40), ('e', 'd', 50)]
# -----------------------
想定通りの結果を得ることができました。