1. 程式人生 > 其它 >離散數學實驗三

離散數學實驗三

技術標籤:人工智慧數理基礎圖論

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)構造這個圖的關聯矩陣

在這裡插入圖片描述
在這裡插入圖片描述

(3)構造這個圖的鄰接矩陣

在這裡插入圖片描述