图论的基础是三元组,点集,边集,权重函数。然而在实际的地图中,我们只知道地图(row,col)的值,可能表示海拔,也可能表示坡度,形式上就是一个二元矩阵。
形如此图:
表示的矩阵:
在这个矩阵中,255表示普通节点(不是障碍物),0表示障碍物。
转换为邻接矩阵,并画出点线图(代码):
import cv2
import numpy as np
# from MCL import markovCluster
import matplotlib.pyplot as py
obstacle = 0
unObstacle = 255
# 读取地图数据
def read_map_from_pic(file_path):
pic = cv2.imread(file_path, cv2.IMREAD_GRAYSCALE)
return pic
# 判断两个节点是否有相连的边
def is_neighbour(position1, position2):
# 检查两点元素是否是障碍物
if map[position1.row][position1.col] == obstacle or map[position2.row][position2.col] == obstacle:
return False
if abs(position1.row-position2.row) < 2 and abs(position1.col - position2.col) < 2:
return True
else:
return False
def getNodeSetByMap(map):
nodeSet = []
for row in range(map.shape[0]):
for col in range(map.shape[1]):
if map[row][col] == unObstacle:
nodeSet.append(Node(Position(row, col)))
return nodeSet
def getAdjacencyMatrix(nodeSet):
edgeList = []
adjacencyMatrix = np.zeros((len(nodeSet), len(nodeSet)))
for row in range(len(nodeSet)):
for col in range(len(nodeSet)):
adjacencyMatrix[row][col] = 1 if is_neighbour(nodeSet[row].position, nodeSet[col].position) else 0
if adjacencyMatrix[row][col] == 1:
xList = [nodeSet[row].position.row, nodeSet[col].position.row]
yList = [nodeSet[row].position.col, nodeSet[col].position.col]
edgeList.append([xList, yList])
return adjacencyMatrix, edgeList
def paintGraph(map, edgeList):
rowList = []
colList = []
for row in range(map.shape[0]):
for col in range(map.shape[1]):
if map[row][col] == unObstacle:
rowList.append(row)
colList.append(col)
py.scatter(rowList, colList, color='silver')
for i in range(len(edgeList)):
py.plot(edgeList[i][0], edgeList[i][1], color='cornflowerblue', linewidth=1, alpha=0.08)
py.show()
# 三元组存储稀疏矩阵(领接矩阵)
class Triple:
def __init__(self, position, value) -> None:
super().__init__()
self.position = position
self.value = value
class Position:
def __init__(self, row, col) -> None:
super().__init__()
self.row = row
self.col = col
class Node:
def __init__(self, position) -> None:
super().__init__()
self.position = position
# MCL聚类
if __name__ == "__main__":
file_path = r"E:\python_code\pytorch_learn\data\tsp\pse_cvt1.png"
map = read_map_from_pic(file_path)
position1 = Position(4, 1)
position2 = Position(3, 0)
print(is_neighbour(position1, position2))
# 图论点集
nodeSet = getNodeSetByMap(map)
# 构造邻接矩阵
adjacencyMat, edgeList = getAdjacencyMatrix(nodeSet)
print(adjacencyMat.shape)
# 画图
paintGraph(map, edgeList)
#dimension = 4
#numIter = 10
#inflateMat = markovCluster(adjacencyMat, dimension, numIter)
#print(inflateMat)
输出: