图论基础知识--最小生成树算法kruskal(克鲁斯克尔)和普里姆算法(Prim算法);最短路径算法Dijkstra(迪杰斯特拉)和Floyd(弗洛伊德)

一.基础知识

 

         有向图   无向图

以无向图为例:

邻接矩阵:

度矩阵(对角矩阵):

二.最小生成树

应用:将网络顶点看着城市,边看着城市之间通讯网,边的权重看着成本,根据最小生成树可以构建城市之间成本最低的通讯网.

1.kruskal(克鲁斯克尔)算法

2.普里姆算法(Prim算法)

求点与点之间的最小生成树

代码:

#coding:utf-8
"""
最小生成树
"""
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
from numpy import randomG = nx.Graph()
# Matrix = np.array(random.randint((5), size=(5, 5)))
# print('==Matrix:', Matrix)
# print(maps)
Matrix = np.array(  [[3, 4, 0, 2, 2],[4, 1, 0, 3, 4],[0, 0, 0, 4, 4],[2, 3, 4, 0, 3],[2, 4, 4, 3, 1]])
#实际在用的时候,只用了下三角矩阵
#构建无向图
for i in range(len(Matrix)):for j in range(len(Matrix)):if Matrix[i, j] != 0:G.add_edge(i, j)
nx.draw_networkx(G)
plt.title("G")
plt.show()class Graph(object):def __init__(self, Matrix):self.Matrix = Matrixself.nodenum = self.get_nodenum()self.edgenum = self.get_edgenum()def get_nodenum(self):return len(self.Matrix)def get_edgenum(self):count = 0for i in range(self.nodenum):  # 获取除去对角的下三角矩阵for j in range(i):# print('i,j', i, j)if self.Matrix[i][j] > 0 and self.Matrix[i][j] < 9999:count += 1return countdef kruskal(self):list = []if self.nodenum <= 0 or self.edgenum < self.nodenum - 1:return listedge_list = []for i in range(self.nodenum):  # 获取除去对角的下三角矩阵for j in range(i):if self.Matrix[i][j] < 9999:edge_list.append([i, j, self.Matrix[i][j]])print('==排序之前边的集合 edge_list:', edge_list)edge_list.sort(key=lambda a: a[2])  # 已经排好序的边集合print('==排序以后边的集合 edge_list:', edge_list)group = [[i] for i in range(self.nodenum)]  # 存储代表元列表print('存储代表元列表', group)for edge in edge_list:for i in range(len(group)):if edge[0] in group[i]:m = i#开始节点if edge[1] in group[i]:n = i#终止节点if m != n:# 合并联通分量 进行存储元列表更新list.append(edge)print('开始节点m,终止节点n:', m, n)group[m] = group[m] + group[n]group[n] = []print('==更新后的代表元列表:', group)return listdef prim(self):list = []if self.nodenum <= 0 or self.edgenum < self.nodenum - 1:return listselected_node = [0]candidate_node = [i for i in range(1, self.nodenum)]#候选节点# print('==candidate_node:', candidate_node)while len(candidate_node) > 0:begin, end, minweight = 0, 0, 9999for i in selected_node:for j in candidate_node:if self.Matrix[i][j] < minweight:minweight = self.Matrix[i][j]begin = i#存储开始节点end = j#存储终止节点list.append([begin, end, minweight])selected_node.append(end)#找到权重最小的边 加入可选节点candidate_node.remove(end)#候选节点被找到 进行移除return list
#
#
G = Graph(Matrix)
print('邻接矩阵为\n%s' % G.Matrix)
print('节点数据为%d,边数为%d\n' % (G.nodenum, G.edgenum))
print('------最小生成树kruskal算法------')
print(G.kruskal())print('------最小生成树prim算法')
print(G.prim())

 

三.最短路径:

1.Dijkstra(迪杰斯特拉)算法

Dijkstra算法用于解决单源最短路问题,所谓单源最短路就是指定一个起点,求出这个起点到其它所有点的最短路。本质就是依次让每个顶点作为起点,更新最短路的过程。

示例:求M到各个顶点的最短路径

             

先构建邻接矩阵Adjacent, 初始状态dist[1~n] = inf, dist[M]=0,顶点更新状态vst[1~n] = 0

以点M为起点:

dist[M] = 0    vst[M] = 0
dist[W] = inf  vst[W] = 0
dist[E] = inf  vst[E] = 0
dist[D] = inf  vst[D] = 0
dist[X] = inf  vst[X] = 0

找出dist中值最小且未被使用的点,发现dist[M]=0最小,且vst[M]=0,未被使用,故将M作为新的起点.
找出所有M可达的顶点,为X、W、E
dist[X]=inf > 0+10 ,更新dist[X]=10
dist[W]=inf > 0+5 ,更新dist[W]=5
dist[E]=inf > 0+8 ,更新dist[E]=8
M已被使用,vst[M]=1

dist[M] = 0    vst[M] = 1
dist[W] = 5    vst[W] = 0
dist[E] = 8    vst[E] = 0
dist[D] = inf  vst[D] = 0
dist[X] = 10   vst[X] = 0

依次遍历每个顶点........ 

Inf = float('inf')
# Dijkstra算法,就是依次让每个顶点作为起点,更新最短路的过程。
Adjacent = [[0, 10, 5, Inf, 8],[10, 0, 3, 1, Inf],[5, 3, 0, 9, 2],[Inf, 1, 9, 0, 6],[8, Inf, 2, 6, 0]]Src, Dst, N = 0, 4, 5def dijstra(adj, src, dst, n):dist = [Inf] * n  # 初始化为inf无穷大dist[src] = 0  # 起始点到起始点距离为0vst = [0] * n  # 记录已经确定的顶点prev = [0] * nwhile True:now = -1for u in range(n):  # 找到dist最小且vst=0的点作为起点if not vst[u] and (now == -1 or dist[u] < dist[now]):now = uprint('====now:', now)if now == -1:  # now未被更新,即表示所有顶点都被使用过,算法结束breakfor v in range(n):  # 遍历当前起点now能到达的所有点if dist[v] > dist[now] + adj[now][v]:  # 如果dist[v]大于dist[now] + adj[now][v] 则更新dist[v] = dist[now] + adj[now][v]prev[v] = nowprint('==dist:', dist)# assert 1==0vst[now] = 1  # 当前起点now已被使用过,vst[now]=1# print('===dist:', dist)# print('==prev:', prev)## print('==dist[dst]:', dist[dst])return dist, prevdist, prev = dijstra(Adjacent, Src, Dst, N)print('==dist,prev:', dist, prev)def construct_path(prev, index, path=[]):path = path + [prev[index]]if prev[index] == 0:#终止条件return pathnew_path = construct_path(prev, prev[index], path)return new_path
# res = construct_path(prev, 4,[4])
# print('==res:', res)
for i in range(len(prev)):path = construct_path(prev, i, [i])print('{}节点路径为:{}'.format(i, path))

2.Floyd(弗洛伊德)

本质任意两个节点最短路径是否经过此节点,用dp的思想来存储中间结果.

示例:

#Floyd(弗洛伊德)找最短路径 本质任意两个节点最短路径是否经过此节点
import numpy as np
Inf = float('inf')
DIS = [[0, 3, 8, Inf, -4],[Inf, 0, Inf, 1, 7],[Inf, 4, 0, Inf, Inf],[2, Inf, -5, 0, Inf],[Inf, Inf, Inf, 6, 0]]Direction = [[0, 1, 2, 3, 4],[0, 1, 2, 3, 4],[0, 1, 2, 3, 4],[0, 1, 2, 3, 4],[0, 1, 2, 3, 4]]
V = 5
#k就是是否要经过的节点,i就是开始节点,j就是终止节点
for k in range(V):for i in range(V):for j in range(V):if DIS[i][k] + DIS[k][j] < DIS[i][j]:DIS[i][j] = DIS[i][k] + DIS[k][j]Direction[i][j] = Direction[i][k]print('最终的距离矩阵{}'.format(np.array(DIS)))
print('方向矩阵{}'.format(np.array(Direction)))def construct_path(Direction, i, j, path=[]):path = path + [Direction[i][j]]if Direction[i][j] == j:#终止条件return pathnew_path = construct_path(Direction, Direction[i][j], j, path)return new_path#找到路径
for i in range(V):for j in range(V):path = construct_path(Direction, i, j, [i])print('{}--{}节点路径为:{}'.format(i, j, path))

 最终的距离矩阵和方向矩阵,其中方向矩阵可以用来还原开始节点到终止节点的路径:

参考:

https://blog.csdn.net/weixin_43093481/article/details/82702176

https://www.bilibili.com/video/BV1q4411M7r9?from=search&seid=4042347737055062965

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493169.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高中生活--第7篇–我为什么不交作业

无耻的打个广告&#xff1a;小伙伴&#xff0c;有IT相关的问题来这里提问吧&#xff0c;http://www.itfriend.cn/topic&#xff0c;社区网友和我努力帮你解答。好久没有写“高中生活”系列了&#xff0c;上一篇“高中生活--第6篇-批评和表扬之间的对决”已经是2013年8月26日。人…

nginx做负载均衡,解决多机器多gpu卡服务对外暴露一个接口问题

思路&#xff1a;多个gpu 服务接口-->ngxin做负载均衡-->对外暴露一个。 以一机两卡为例,其中gunicorn部署一卡多进程服务参考这篇文章 一.制作nginx负载均衡镜像 1.制作Dockerfie FROM nginx:1.13.3 COPY ./ / RUN mkdir /app COPY /nginx.conf /etc/nginx/nginx.co…

算法偏见侦探

来源&#xff1a;AI 科技评论摘要&#xff1a;随着越来越多的算法不断渗透入社会的层层面面&#xff0c;如医疗机构、政府部门&#xff0c;对算法偏见的讨论越来越多。这个月&#xff0c;Nature 杂志评选出 2018 年最受欢迎的十大科学长篇专题报道&#xff0c;其中&#xff0c;…

iOS程序UI主线程和定时器相互阻塞的问题

解决iOS程序UI主线程和定时器相互阻塞的问题转载于:https://www.cnblogs.com/hl666/p/3784838.html

pytorch实现常用的一些即插即用模块(长期更新)

1.可分离卷积 #coding:utf-8 import torch.nn as nnclass DWConv(nn.Module):def __init__(self, in_plane, out_plane):super(DWConv, self).__init__()self.depth_conv nn.Conv2d(in_channelsin_plane,out_channelsin_plane,kernel_size3,stride1,padding1,groupsin_plane)…

硅片行业:过剩背景下的寡头市场

来源&#xff1a;乐晴智库精选▌竞争格局:过剩背景下的寡头市场&#xff0c;规模壁垒初步形成光伏产业总体处于产能过剩的状态&#xff0c;硅片环节的过剩尤为突出。根据PVInfolink的统计数据&#xff0c;截至2018年2季度末&#xff0c;全球硅片总产能超过160GW&#xff0c;年化…

oracle11g dataguard物理备库搭建

Dataguard 环境&#xff1a; 操作系统:Redhat6.4Primary数据库:IP 地址&#xff1a;192.168.1.122数据库SID&#xff1a;ora11gDB_UNIQUE_NAME:ora11g_primaryStandby数据库:IP 地址&#xff1a;192.168.1.123数据库SID&#xff1a;ora11gDB_UNIQUE_NAME:ora11g_standby(注:ora…

从attention到Transformer+CV中的self-attention

一.总体结构 由于rnn等循环神经网络有时序依赖&#xff0c;导致无法并行计算&#xff0c;而Transformer主体框架是一个encoder-decoder结构&#xff0c;去掉了RNN序列结构&#xff0c;完全基于attention和全连接。同时为了弥补词与词之间时序信息&#xff0c;将词位置embedding…

12年后,人工智能和人类会是什么样?这是900位专家的看法|报告

来源&#xff1a;机器之能摘要&#xff1a;有分析师预计&#xff0c;到2030年&#xff0c;在复杂的数字系统中&#xff0c;人们将更加依赖于网络人工智能。 有人说&#xff0c;随着对这些网络工具的广泛使用&#xff0c;我们将继续沿着历史的轨迹生活地更好。也有一些人说&…

中文繁体和简体转换 (Java代码)

String jianti"皑蔼碍爱翱袄奥坝罢摆败颁办绊帮绑镑谤剥饱宝报鲍辈贝钡狈备惫绷笔毕毙币闭边编贬变辩辫标鳖别瘪濒滨宾摈饼并拨钵铂驳卜补财参蚕残惭惨灿苍舱仓沧厕侧册测层诧搀掺蝉馋谗缠铲产阐颤场尝长偿肠厂畅钞车彻尘沉陈衬撑称惩诚骋痴迟驰耻齿炽冲虫宠畴踌筹绸丑橱厨…

水印去除(基于nosie2noise优化 代码+模型)

github链接 1.感受野计算: :本层感受野; :上层感受野; :第i层卷积或池化的步长 k:本层卷积核大小 2.空洞卷积卷积核计算:Kk(k-1)(r-1)&#xff0c;k为原始卷积核大小&#xff0c;r为空洞卷积参数空洞率&#xff0c;带入上式即可计算空洞卷积感受野&#xff1b; 3.针对noi…

广度深度都要,亚马逊是如何推动 Alexa 内生成长的?

来源&#xff1a;雷锋网摘要&#xff1a;发展到今天&#xff0c;Alexa 已经成为亚马逊旗下最重要的几个业务支柱之一&#xff0c;尤其是在人工智能语音助手层面&#xff0c;它和 Google Assistant、Apple Siri、Microsoft Cortana 并驾齐驱&#xff0c;甚至在应用场景上有领先之…

剖析云平台中的“共享型数据库”

剖析云计 算中的“共享型数据库” 摘要&#xff1a; 随着云计算的出现&#xff0c;出现了很多新的名词&#xff0c;像云数据库、云存储、弹性扩容&#xff0c;资源隔离等词汇。下面就大家炒的比较热的“共享型数据库”做一下解释&#xff0c;给大家剖析什么叫“共享型数据库”。…

FCOS: A Simple and Strong Anchor-free Object Detector

论文链接 一.背景 1.anchor-base缺点          (&#xff11;)&#xff0e;anchor的设置对结果影响很大,不同项目这些超参都需要根据经验来确定&#xff0c;难度较大&#xff0e; (&#xff12;)&#xff0e;anchor太过密集&#xff0c;其中很多是负样本&#xff…

大数据有十大应用领域,看看你用到了哪个?

来源&#xff1a;网络大数据摘要&#xff1a;如果提到“大数据”时&#xff0c;你会想到什么?也许大部分人会联想到庞大的服务器集群;或者联想到销售商提供的一些个性化的推荐和建议。如今大数据的深度和广度远不止这些&#xff0c;大数据已经在人类社会实践中发挥着巨大的优势…

2018年《环球科学》十大科学新闻出炉:霍金逝世、贺建奎事件位列前二

来源&#xff1a;量子位如果要用两个词来定义2018年的话&#xff0c;我们可能会选择“进步”与“反思”。中国科学在持续进步&#xff0c;克隆猴“中中”与“华华”、单条染色体的酵母&#xff0c;都是世界级的研究成果。“火星快车”在火星上发现大面积的液态湖泊&#xff0c;…

CornerNet: Detecting Objects as Paired Keypoints

CornerNet论文链接 Hourglass Network论文链接 一.背景 1.anchor-base缺点          (&#xff11;)&#xff0e;anchor的设置对结果影响很大,不同项目这些超参都需要根据经验来确定&#xff0c;难度较大&#xff0e; (&#xff12;)&#xff0e;anchor太过密集&…

Leetcode: Divide Two Integers

Divide two integers without using multiplication, division and mod operator. Best method(跟discuss vote最高相似)&#xff1a;只有一种情况整数除以整数会overflow&#xff0c;那就是Integer.MIN_VALUE除以-1&#xff0c;这种情况特殊分析。 之所以要用long a, b代替div…

详细解读什么是自适应巡航?

来源&#xff1a;智车科技摘要&#xff1a;自适应巡航设计初衷是减轻驾驶员长途驾驶的疲劳&#xff0c;极为复杂的城市路况并不是它发挥作用的地方。虽然现在的自适应巡航系统具备了根据前车情况、根据路况减速&#xff0c;甚至是刹停的功能&#xff0c;不过其开发之初便是为了…

CenterNet:Objects as Points

CenterNet论文链接 一.背景 1.anchor-base缺点          (&#xff11;)&#xff0e;anchor的设置对结果影响很大,不同项目这些超参都需要根据经验来确定&#xff0c;难度较大&#xff0e; (&#xff12;)&#xff0e;anchor太过密集&#xff0c;其中很多是负样本…