运筹学——图论与最短距离(Python实现)(3),2024年最新2024阿里Python高级面试题总结

dist = np.zeros((train_v.shape[0],train_d.shape[0])) #初始化距离 为10*10的全0矩阵

print(dist.shape) #(10,10)

#计算距离矩阵=

for i in range(train_v.shape[0]):

for j in range(train_d.shape[0]):

dist[i,j] = math.sqrt(np.sum((train_v[i,:]-train_d[j,:])**2))

print(‘距离矩阵:----------------------------------’)

print(dist)

#第四步:计算距离和路径====

“”"

s:已经遍历过的城市

dist:城市间距离矩阵

sumpath:目前的最小路径总长度

Dtemp:当前最小距离

flag:访问标记

“”"

i=1

n=train_v.shape[0]#城市个数

j=0

sumpath=0#目前的最小路径总长度

s=[]#已经遍历过的城市

s.append(0)#从城市0开始

start = time.perf_counter() #time.clock()

while True:

k=1#从1开始,因为人在城市0,所以我们设定先从城市1开始选择

Detemp=float(‘inf’)#当前最小距离

while True:

flag=0#访问标记,否0

if k in s:#是否访问,如果访问过,flag设为1

flag = 1

if (flag==0) and (dist[k][s[i-1]] < Detemp):#如果未访问过,并且距离小于最小距离

j = k;

Detemp=dist[k][s[i - 1]]; #当前两座城市相邻距离

k+=1#遍历下一城市

if k>=n:

break;

s.append(j)

i+=1;

sumpath+=Detemp

if i>=n:

break;

sumpath+=dist[0][j]#加上dist[0][j] 表示最后又回到起点

end = time.perf_counter() #time.clock()

print(“距离:”)

print(sumpath)

print(‘--------------’)

print(‘路径:’)

for m in range(n):

print("%s-> "%(s[m]),end=‘’)

print()

print(“程序的运行时间是:%s”%(end-start))

代码解析:数字k表示当前我们选择前往下一个城市时,我们需要计算所有未访问过的城市和当前城市距离。

数字i 用于控制访问过的城市,我们需要到达每一个城市。

代码中有两个while

里面那个while表示选择下一城市时,需要遍历所有未访问过的城市,然后选择距离当前城市最近的城市,赋值给j

外面while,表示我们的每一步,我们需要去每个城市。

2.4 结果


读取数据:----------------------------

1 2

0 2066 2333

1 935 1304

2 1270 200

3 1389 700

4 984 2810

5 2253 478

6 949 3025

7 87 2483

8 3094 1883

9 2706 3130

(10, 10)

距离矩阵:----------------------------------

[[ 0. 1529.05264788 2276.68728639 1767.77204413 1182.47748393

1864.40178073 1313.98363765 1984.67654795 1122.17823896 1022.15898959]

[1529.05264788 0. 1153.70750193 755.6004235 1506.7969339

1555.44205935 1721.0569427 1452.28957168 2235.29013777 2543.76040538]

[2276.68728639 1153.70750193 0. 513.96595218 2625.6229737

1021.55420806 2843.17885473 2571.29889356 2481.82694804 3262.97349055]

[1767.77204413 755.6004235 513.96595218 0. 2148.51693035

892.06502005 2366.26815894 2207.7801068 2075.21420581 2763.94446399]

[1182.47748393 1506.7969339 2625.6229737 2148.51693035 0.

2654.91713618 217.83020911 954.74499213 2304.65377009 1751.48051659]

[1864.40178073 1555.44205935 1021.55420806 892.06502005

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值