图搜索之基于Python的迪杰斯特拉算法和弗洛伊德算法,供大家参考,具体内容如下
Djstela算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
#encoding=UTF-8
MAX = 9
'''
Created on 2016年9月28日
@author: sx
'''
b = 999
G = [[ 0 , 1 , 5 ,b,b,b,b,b,b],\
[ 1 , 0 , 3 , 7 , 5 ,b,b,b,b],\
[ 5 , 3 , 0 ,b, 1 , 7 ,b,b,b],\
[b, 7 ,b, 0 , 2 ,b, 3 ,b,b],\
[b, 5 , 1 , 2 , 0 , 3 , 6 , 9 ,b],\
[b,b, 7 ,b, 3 , 0 ,b, 5 ,b],\
[b,b,b, 3 , 6 ,b, 0 , 2 , 7 ],\
[b,b,b,b, 9 , 5 , 2 , 0 , 4 ],\
[b,b,b,b,b,b, 7 , 4 , 0 ]]
P = []
D = []
def Djstela(G,P,D):
final = []
for i in range ( 0 , len (G)):
final.append( 0 )
D.append(G[ 0 ][i])
P.append( 0 )
D[ 0 ] = 0
final[ 0 ] = 1
k = 0
for v in range ( 1 , len (G)):
min = 999
for w in range ( 0 , len (G)):
if final[w] = = 0 and D[w]< min :
k = w
min = D[w]
final[k] = 1
for t in range ( 0 , len (G)):
if min + G[k][t]<D[t]:
D[t] = min + G[k][t]
P[t] = k
print ( "\n最短路径\n" ,D, "\n" , "\n前一个选择\n" ,P)
def search(x):
print ( "选择的终点" ,x, "最短路径" ,D[x])
print ( "邻接矩阵\n" )
for i in range ( 0 , 9 ):
print (G[i])
Djstela(G, P, D)
q = input ( "\n请输入终点" )
search( int (q))
|
FLOYD算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
#encoding=UTF-8
'''
Created on 2016年9月28日
@author: sx
'''
t = 0
b = 999
G = [[ 0 , 1 , 5 ,b,b,b,b,b,b],\
[ 1 , 0 , 3 , 7 , 5 ,b,b,b,b],\
[ 5 , 3 , 0 ,b, 1 , 7 ,b,b,b],\
[b, 7 ,b, 0 , 2 ,b, 3 ,b,b],\
[b, 5 , 1 , 2 , 0 , 3 , 6 , 9 ,b],\
[b,b, 7 ,b, 3 , 0 ,b, 5 ,b],\
[b,b,b, 3 , 6 ,b, 0 , 2 , 7 ],\
[b,b,b,b, 9 , 5 , 2 , 0 , 4 ],\
[b,b,b,b,b,b, 7 , 4 , 0 ]]
P = [[ 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 , 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 , 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 , 0 , 0 , 0 ]]
D = [[ 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 , 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 , 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 , 0 , 0 , 0 ]]
def Floyd(G,P,D):
t = 0
for u in range ( 0 , len (G)):
for s in range ( 0 , len (G)):
D[u][s] = G[u][s]
P[u][s] = s
for k in range ( 0 , len (G)):
for v in range ( 0 , len (G)):
for w in range ( 0 , len (G)):
if D[v][w]>D[v][k] + D[k][w]:
t = t + 1
D[v][w] = D[v][k] + D[k][w]
P[v][w] = P[v][k]
Floyd(G, P, D)
def search(s,u):
lenth = D[s][u]
print ( "路径长度为" ,lenth)
f = P[s][u]
foot = [s,f]
if f = = u:
print ( "无需规划,0步" )
while f! = u:
f = P[f][u]
foot.append(f)
for i in range ( 0 , len (foot)):
if i = = 0 :
print ( "起 点____" ,foot[i])
elif i = = len (foot) - 1 :
print ( "终 点____" ,foot[i], "步长___" ,G[foot[i - 1 ]][foot[i]])
else :
print ( "第" ,i, "点____" ,foot[i], "步长___" ,G[foot[i - 1 ]][foot[i]])
print ( "邻接矩阵" )
for i in range ( 0 , 9 ):
print (G[i])
s = input ( "请输入起点0-8\n" )
u = input ( "请输入终点0-8\n" )
Floyd(G, P, D)
search( int (s), int (u))
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/sinat_33829806/article/details/54487424