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 2654.91713618

  1.     2861.40262808 2951.53875123 1637.46938903 2690.41130685]
    

[1313.98363765 1721.0569427 2843.17885473 2366.26815894 217.83020911

2861.40262808 0. 1018.23769327 2430.05946429 1760.13465394]

[1984.67654795 1452.28957168 2571.29889356 2207.7801068 954.74499213

2951.53875123 1018.23769327 0. 3066.2760802 2697.7342345 ]

[1122.17823896 2235.29013777 2481.82694804 2075.21420581 2304.65377009

1637.46938903 2430.05946429 3066.2760802 0. 1305.9682232 ]

[1022.15898959 2543.76040538 3262.97349055 2763.94446399 1751.48051659

2690.41130685 1760.13465394 2697.7342345 1305.9682232 0. ]]

距离:

10464.183486532447

--------------

路径:

0-> 9-> 8-> 5-> 3-> 2-> 1-> 7-> 4-> 6->

程序的运行时间是:0.0002605780000024538

Process finished with exit code 0

3 案例2——图论及最短距离

===============

3.1 知识点


3.2 networkx绘图


3.2.1 创建图

networkx有四种图 Graph 、DiGraph、MultiGraph、MultiDiGraph,分别为无多重边无向图、无多重边有向图、有多重边无向图、有多重边有向图。

#创建图======

import networkx as nx # 导入 NetworkX 工具包

G1 = nx.Graph() # 创建:空的 无向图

G2 = nx.DiGraph() #创建:空的 有向图

G3 = nx.MultiGraph() #创建:空的 多图

G4 = nx.MultiDiGraph() #创建:空的 有向多图

3.2.2 定点的添加、删除和查看

#====顶点的添加、删除和查看=

#==顶点(node)的操作=

#向图中添加顶点

G1.add_node(1) # 向 G1 添加顶点 1

G1.add_node(1, name=‘n1’, weight=1.0) # 添加顶点 1,定义 name, weight 属性

G1.add_node(2, date=‘May-16’) # 添加顶点 2,定义 time 属性

G1.add_nodes_from([3, 0, 6], dist=1) # 添加多个顶点,并定义属性

G1.add_nodes_from(range(10, 15)) # 向图 G1 添加顶点 10~14

#查看顶点和顶点属性

print(G1.nodes()) # 查看顶点列表

[1, 2, 3, 0, 6, 10, 11, 12, 13, 14]

print(G1._node) # 查看顶点属性

{1: {‘name’: ‘n1’, ‘weight’: 1.0}, 2: {‘date’: ‘May-16’}, 3: {‘dist’: 1}, 0: {‘dist’: 1}, 6: {‘dist’: 1}, 10: {}, 11: {}, 12: {}, 13: {}, 14: {}}

#从图中删除顶点

G1.remove_node(1) # 删除顶点

G1.remove_nodes_from([1, 11, 13, 14]) # 通过顶点标签的 list 删除多个顶点

print(G1.nodes()) # 查看顶点

[2, 3, 0, 6, 10, 12] # 顶点列表

3.2.3 边的添加、删除和查看

#====边的添加、删除和查看

#边(edge)的操作

#向图中添加边

G1.add_edge(1,5) # 向 G1 添加边,并自动添加图中没有的顶点

G1.add_edge(0,10, weight=2.7) # 向 G1 添加边,并设置边的属性

G1.add_edges_from([(1,2,{‘weight’:0}), (2,3,{‘color’:‘blue’})]) # 向图中添加边,并设置#属性

G1.add_edges_from([(3,6),(1,2),(6,7),(5,10),(0,1)]) # 向图中添加多条边

G1.add_weighted_edges_from([(1,2,3.6),[6,12,0.5]]) # 向图中添加多条赋权边: (node1,node2,weight)

print(G1.nodes()) # 查看顶点

[2, 3, 0, 6, 10, 12, 1, 5, 7] # 自动添加了图中没有的顶点

#从图中删除边

G1.remove_edge(0,1) # 从图中删除边 0-1

G1.remove_edges_from([(2,3),(1,5),(6,7)]) # 从图中删除多条边

#查看边和边的属性

print(G1.edges) # 查看所有的边

[(2, 1), (3, 6), (0, 10), (6, 12), (10, 5)]

print(G1.get_edge_data(1,2)) # 查看指定边的属性

{‘weight’: 3.6}

print(G1[1][2]) # 查看指定边的属性

{‘weight’: 3.6}

print(G1.edges(data=True)) # 查看所有边的属性

[(2, 1, {‘weight’: 3.6}), (3, 6, {}), (0, 10, {‘weight’: 2.7}), (6, 12, {‘weight’: 0.5}), (10, 5, {})]

3.3 案例


例题 1:已知如图的有权无向图,求顶点 v1 到 顶点 v11 的最短路径。

3.4 Python实现


#导入相关包=================

import matplotlib.pyplot as plt # 导入 Matplotlib 工具包

import networkx as nx # 导入 NetworkX 工具包

#问题:无向图的最短路问题=========

G1 = nx.Graph() # 创建:空的 无向图

G1.add_weighted_edges_from([(1,2,2),(1,3,8),(1,4,1),

(2,3,6),(2,5,1),

(3,4,7),(3,5,5),(3,6,1),(3,7,2),

(4,7,9),

(5,6,3),(5,8,2),(5,9,9),

(6,7,4),(6,9,6),

(7,9,3),(7,10,1),

(8,9,7),(8,11,9),

(9,10,1),(9,11,2),

(10,11,4)]) # 向图中添加多条赋权边: (node1,node2,weight)

print(‘nx.info:’,G1.nodes) # 返回图的基本信息,nx.info:返回图的基本信息

#=两个指定顶点之间的最短加权路径=========

minWPath_v1_v11 = nx.dijkstra_path(G1, source=1, target=11) # 顶点 1 到 顶点 11 的最短加权路径

print("顶点 v1 到 顶点 v11 的最短加权路径: ", minWPath_v1_v11)

两个指定顶点之间的最短加权路径的长度

lMinWPath_v1_v11 = nx.dijkstra_path_length(G1, source=1, target=11) # 最短加权路径长度

print("顶点 v1 到 顶点 v11 的最短加权路径长度: ", lMinWPath_v1_v11)

pos = {1: (0,4), 2: (5,7), 3: (5,4), 4: (5,1), 5: (10,7), 6: (10,4), 7: (10,1),

8: (15,7), 9: (15,4), 10: (15,1), 11: (20,4)} # 指定顶点位置,以节点为键,位置为值的字典

labels = nx.get_edge_attributes(G1, ‘weight’) # 设置边的 labels 为 ‘weight’

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
img

如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费学习大礼包,带大家一起学习,给大家剖析Python兼职、就业行情前景的这些事儿。

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-BIh6aVpo-1712963569549)]

更多推荐