实验目的:
python实现Dijkstra算法,lingo解决最短路问题
实验要求:
报告内容:
Python实现:
代码:
def startwith(start: int, mgraph: list) -> list:
passed = [start]
nopass = [x for x in range(len(mgraph)) if x != start]
dis = mgraph[start]
while len(nopass):
idx = nopass[0]
for i in nopass:
if dis[i] < dis[idx]: idx = i
nopass.remove(idx)
passed.append(idx)
for i in nopass:
if dis[idx] + mgraph[idx][i] < dis[i]: dis[i] = dis[idx] + mgraph[idx][i]
return dis
if __name__ == "__main__":
inf = 10086
mgraph = [[0, 5, 2, inf, inf, inf, inf],
[5, 0, inf, 2, 7, inf, inf],
[2, inf, 0, 7, inf, 4, inf],
[inf,2,7,0,6,2,inf],
[inf,7,inf,6,0,1,3],
[inf,inf,4,2,1,0,6],
[inf,inf,inf,inf,3,6,0]]
dis = startwith(0, mgraph)
dis
Lingo实现:
代码:
model:
sets:
city/1..7/:L;
road(city,city):d;
endsets
data:
d=10000;
enddata
calc:
d(1,2)=5;d(1,3)=2;
d(2,4)=2;d(2,5)=7;
d(3,4)=7;d(3,6)=4;
d(4,5)=6;d(4,6)=2;
d(5,6)=1;d(5,7)=3;
d(6,7)=6;
@for(city(j)|j#lt#@size(city):@for( city(i)|i#gt#j:d(i,j)= d(j,i)));
endcalc
L(1)=0;
@for(city(j)|j#gt#1:L(j)=@min(city(i):L(i)+d(i,j)));
end