最优路径算法(python实现)
从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径,称为最短路径
主要的最优(最短)路径算法:
一、深度优先算法;二、广度优先算法;三、Dijstra最短路径;四、floyd最短路径
深度优先算法
图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。
它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。
无向无权值网络
data = [[0, 0, 1, 1, 0, 1, 0], [0, 0, 1, 0, 0, 0, 0], [1, 1, 0, 1, 0, 0x’x’x’x, 0], [1, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 1, 1, 0]]
def depth_first_search(data, data_index): # 有向、无向都可以满足要求
d1 = [data_index[0]]
index_now = 0
for i in range(len(data_index) - 1): # 只需要再寻找剩余的数值即可
state = 1
for j in range(len(data[index_now])): # 遍历可行路径
if data[index_now][j] == 1: # 如果该路径可行,则直接判断
if data_index[j] not in d1: # 判断原始输出中是否已有
d1.append(data_index[j])# 无,则加入
index_now = j
state = 0
break
if state:
for k in d1[-2::-1]: # 到达叶子后的操作
index_now = data_index.index(k)
for j in range(len(data[index_now])): # 遍历可行路径
if data[index_now][j] == 1: # 如果该路径可行,则直接判断
if data_index[j] not in d1: # 判断原始输出中是否已有
d1.append(data_index[j]) # 无,则加入
index_now = j
break
if index_now != data_index.index(k):
break
# print(d1)
return d1
if __name__ == "__main__":
data = [[0, 0, 1, 1, 0, 1, 0], [0, 0, 1, 0, 0, 0, 0], [1, 1, 0, 1, 0, 0, 0], [1, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 1, 1, 0]]
data_w = [[0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 1, 1, 0], [0, 0, 0, 0, 1, 0, 0], [0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0]]
data_index = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
# print(data_index.index('F'))
d1 = depth_first_search(data_w, data_index)
print(d1)
输入(无向图):
data = [[0, 0, 1, 1, 0, 1, 0], [0, 0, 1, 0, 0, 0, 0], [1, 1, 0,