離散數學實驗三
阿新 • • 發佈:2020-12-11
1. 給定無向圖的各邊所關聯的頂點對:
(1) 確定每個頂點的度
(2) 構造這個圖的關聯矩陣
(3) 若將無向邊改為有向邊:
構造這個圖的鄰接矩陣
2.實驗程式碼
(1) 確定每個頂點的度
# !/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Time : 2020/11/13 09:58
@Author : Albert Darren
@Contact : [email protected]
@File : graph.py
@Version : Version 1.0.0
@Description : TODO 離散數學實驗三
@Created By : PyCharm
"""
import numpy as np
import re
import pandas as pd
def degree(v_pattern: list, edge_set: str):
"""
返回各頂點的度
:param v_pattern: 各頂點的正則模式列表
:param edge_set:無向圖的各邊所關聯的頂點對
:return:各頂點的度的矩陣
"""
degree_matrix = np.zeros(len(v_pattern), dtype=np.int32)
for index, pattern in enumerate(v_pattern):
degree_matrix[index] = len(re.findall(pattern, edge_set))
return degree_matrix
(2) 構造這個圖的關聯矩陣
def incidence_matrix(v, edge, is_direction=False):
"""
返回無向圖G=<V,E>或者有向圖D=<V,E>(不能有環)的關聯矩陣
:param is_direction: 預設是無向圖
:param v: 頂點集
:param edge: 邊集
:return: 二維標籤陣列
"""
matrix = np.zeros((len(v), len(edge)), dtype=np.int32)
data_frame = pd.DataFrame(matrix, index=v, columns=list(edge.keys()))
direction = "無向圖G"
if is_direction:
direction = "有向圖D"
for key, tup in edge.items():
# e始點記為1,不關聯點記為0,終點記為-1
data_frame.loc[tup[0], key] = 1
data_frame.loc[tup[1], key] = -1
else:
for key, tup in edge.items():
# 環的關聯度為2
if tup[0] == tup[1]:
data_frame.loc[tup[0], key] = 2
else:
data_frame.loc[tup[0], key] = 1
data_frame.loc[tup[1], key] = 1
return direction, data_frame
(3)構造這個圖的鄰接矩陣
def adjacent_matrix(v, digraph_edge_set):
"""
返回有向圖D=<V,E>鄰接矩陣A
:param v:頂點集
:param digraph_edge_set:有向邊集
:return:鄰接矩陣A
"""
matrix = np.zeros((len(v), len(v)), dtype=np.int32)
data_frame = pd.DataFrame(matrix, index=v, columns=v)
for index, value in digraph_edge_set.items():
data_frame.loc[index] = value
return data_frame
3.測試(引入DataFrame資料結構方便理解)
if __name__ == '__main__':
print("各頂點的度:{}".format(degree(v_pattern=["v1", "v2", "v3", "v4", "v5"],
edge_set="{(v1,v1),(v1,v2),(v2,v3),(v2,v3),(v2,"
"v5),(v1,v5),(v4,v5)}")))
V = ["v1", "v2", "v3", "v4", "v5"]
E = {"e1": ("v1", "v1"), "e2": ("v1", "v2"), "e3": ("v1", "v5"),
"e4": ("v2", "v5"), "e5": ("v2", "v3"),
"e6": ("v2", "v3"), "e7": ("v4", "v5")}
map_matrix = incidence_matrix(V, E)
print("{}=<V,E>的關聯矩陣為:\n{}".format(map_matrix[0], map_matrix[1]))
E = {"e1": ("v2", "v1"), "e2": ("v1", "v2"), "e3": ("v2", "v4"),
"e4": ("v3", "v4"), "e5": ("v3", "v4"), }
map_matrix = incidence_matrix(V, E, is_direction=True)
print("{}=<V,E>的關聯矩陣為:\n{}".format(map_matrix[0], map_matrix[1]))
e = {("v1", "v1"): 1, ("v1", "v2"): 1, ("v2", "v3"): 2, ("v2", "v5"): 1, ("v1", "v5"): 1, ("v4", "v5"): 1}
print("鄰接矩陣為:\n%s" % adjacent_matrix(V, e))
(1)確定每個頂點的度
(2)構造這個圖的關聯矩陣