【Matlab】根据图生成带权邻接矩阵,并求出最短路径
目录
- 图的简介
- 无向图(Graph)
- 生成带权邻接矩阵
- 求两点最短路径
- 有向图(Digraph)
- 生成带权邻接矩阵
- 求最短路径
图的简介
图是拓扑学中的一个重要概念,分为无向图和有向图两种。图有两个重要属性,即点(Node)和边(Edge)。在图的概念中,我们只关心点和边的连接关系而并不关系他们在图中的相对位置。
由点和边连接的图中,将边赋予一定的权重,就可以将图转换为各种问题,例如TSP(旅行商)问题、(Shortest Path)最短路径问题。本文先介绍如何借助图以及赋予的边的权值生成带权邻接矩阵,再介绍利用图求两点之间最短路径的求法。
无向图(Graph)
生成带权邻接矩阵
先介绍根据以下无向图生成带权邻接矩阵的方法:
假设我们已经知道了每条边的权重(红色标定),该图中有11个点,如果挨个写出需要121个元素,对于此图已经非常繁琐。因此我给大家提供一种简单的方法,只需要写出图中标定权值的边即可达到目的。书写规则如下:
A→A:标定权值是0
若A→B没有路径可以到达,标定权值为0
若A→C有路径可以到达,根据建模需要标定权值
这样,我们在手动书写时,仅需要写出非0边的权重即可,每条边只需要书写一次,书写方式如下:
W=zeros(11);
W(1,2)=2;
W(1,4)=1;
W(1,3)=8;
W(2,3)=6;
W(2,5)=1;
W(3,4)=7;
W(3,5)=5;
W(3,6)=1;
W(3,7)=2;
W(4,7)=9;
W(5,6)=3;
W(5,8)=2;
W(5,9)=9;
W(6,7)=4;
W(6,9)=6;
W(7,9)=3;
W(7,10)=1;
W(8,9)=7;
W(8,11)=8;
W(9,10)=1;
W(9,11)=2;
W(10,11)=4;
由于本例中为无向图,因此生成的矩阵总满足W(i,j)=W(j,i),所以利用以下代码书写另一半:
n=size(W,1);
for i=1:nfor j=i:nW(j,i)=W(i,j);%次对角线分隔的下三角部分根据上三角部分对称end
end
G=graph(W,'upper');%根据带权邻接矩阵生成无向图
plot(G,'EdgeLabel',G.Edges.Weight)
title('标定权重的无向图')
自动绘图效果如下:
带权邻接矩阵W如下:
(如果要将平时我们认为的不能到达的路径之间权重设定为Inf也很容易,不过在Matlab内置的函数shortestpath中,认为权重0即不设路径)
求两点最短路径
格式:[path,distance]=shortestpath(G,1,6)
path返回的是路径经过的点,distance是该路径的长度
例如在工作区输入:
>>[path,distance]=shortestpath(G,1,6)
显示如下:
对照我们绘制的无向图也很容易手动验证,最短路径即1→2→5→6,最短路径的距离=2+1+3=6。
有向图(Digraph)
生成带权邻接矩阵
有向图示例如下:
创建一个数组,每一列依次保存起始点,出发点,以及带权。按照和无向图同样的方法对每条边书写带权:
W=[1 2 10;1 4 10;1 8 1;2 3 10;2 7 1;3 4 10;3 6 1;4 5 1;5 6 12;5 8 12;6 7 12;7 8 12;];
用类似的方法生成有向图如下:
startpoints=W(:,1);%起始点集合
endpoints=W(:,2);%结束点集合
weights=W(:,3);%对应起始点和结束点的边权重
G=digraph(startpoints,endpoints,weights);%生成有向图
plot(G,'EdgeLabel',weights,'layout','force','Edgecolor','red')%画出有向图
效果如下:
求最短路径
在工作区求取最短路径格式如下:
格式:>> [path,distance]=shortestpath(G,s,t)
得到的结果如下:
在此需要说明的和无向图的区别是,在这里我们只有起始点的点数比终点点数小才有路径,否则没有,因此如果按照如下条件调用,则会得到空集,利用这一个特点可以在程序中增加条件加以排除。
(if distance==Inf 或 if path==[])
>> [path,distance]=shortestpath(G,8,2)
希望本文对您有帮助,谢谢阅读
【Matlab】根据图生成带权邻接矩阵,并求出最短路径相关推荐
- 在Matlab中构建最大带权生成树
题目:在Matlab中构建最大带权生成树 学过数据结构的都知道"最小生成树" (Minimum Spanning Tree),可以使用Prim和Kruskal算法找到完全图的最小生 ...
- C++ 实现带权有向图的单源点最短路径Dijkstra算法(完整代码)
首先,引进一个辅助向量D,它的每个分量D[i]表示当前所找到的从始点v0到每个终点vi的最短路径的长度. 它的初态为:若从v0到vi有弧,则D[i]为弧上的权值:否则,置D[i]为∞. 显然,长度为 ...
- 【JFreeChart】自定义蜘蛛网图生成带刻度三角雷达图 自定义文字风格 背景色
工作中需要生成PDF 且包含图表.iText 或其他 可以访问网页地址转PDF.但是效果不是特别理想.故用iText代码方式实现生成PDF.奈何图表又是一个问题(还是个三角形的雷达图).Java端生成 ...
- 一个图的带权邻接表存储结构的应用
情景:在一个图中,已知经过的一串n节点信息,希望显示经过的路径. 数据组织: 点要素:存放图中的点信息,必含Id字段 线要素:存放编辑好的路径信息,必含"Start"和" ...
- 二分图大讲堂——彻底搞定最大匹配数(最小覆盖数)、最大独立数、最小路径覆盖、带权最优匹配
二分图匹配 二分图大讲堂--彻底搞定最大匹配数(最小覆盖数).最大独立数.最小路径覆盖.带权最优匹配(转) 文本内容框架: §1图论点.边集和二分图的相关概念和性质 §2二分图最大匹配求解 匈牙利算法 ...
- Java数据结构与算法:无向图,有向图,带权图,图的遍历,最小生成树
文章目录 无向图 有向图 带权图 图的遍历 广度优先遍历 深度优先遍历 最小生成树 无向图 前面了解到树是有单一根结点的非线性结构,图(graph)也是一种非线性结构,其中的结点可以与许多其他的结点相 ...
- 邻接矩阵中啥时候写0和无穷_带权有向图的邻接矩阵中0和无穷大
信息举报 时间:2020-12-23 本页为您甄选多篇描写带权有向图的邻接矩阵中0和无穷大,带权有向图的邻接矩阵中0和无穷大精选,带权有向图的邻接矩阵中0和无穷大大全,有议论,叙事 ,想象等形式.文章 ...
- 网状结构(图)图的存储(邻接矩阵、邻接表)、图的遍历(深度DFS、广度BFS)、图的最短路径
图 多对多关系 是一种网状数据结构,图是由非空的顶点集合和一个描述顶点之间关系的集合组成 其定义 Graph = (V, E) V={x | x ∈某个数据对象} E = {<u, v> ...
- 邮局选址问题-带权中位数
一.运行环境: Win7.MyEclipse.JDK8 二.运行过程说明: 数据文件格式:第一行是居民数量n的取值,第2~n+1行是每家的位置及权重. 输入格式:输入测试数据集文件编号,范围:1~6. ...
最新文章
- php中getdistance函数_php计算两个经纬度地点之间的距离
- R语言临床预测模型的评价指标与验证指标实战:自定义的综合判别改善指标(Integrated Discrimination Improvement, IDI)函数
- Android 友盟分享躺过的几个坑,大坑,坑爹啊
- boost::first_scalar的测试程序
- [Java] 蓝桥杯ADV-205 算法提高 拿糖果
- unity透明通道加颜色_关于Unity伽马校正的一点笔记
- linux安装i3wm桌面环境,ArchLinux + i3wm 桌面 Windows10 双系统安装(重点记录)
- ffmpeg使用说明书
- 利用gflags自定义标志的使用方法
- vue element web 表单设计工具
- 车架号VIN码识别,合格证,购车发票,房产证,车牌,驾驶证,行驶证,征信报告等等识别 从易鑫、大搜车、淘车网,看汽车金融发展新模式...
- 一些计算机模拟人脑项目
- windows10 配置 VNC server
- 嫌赚钱太慢,来炒币啊!
- glTexImage2D 函数详解
- fopen 参数'rb' 与'rb+'引发的黑色血案
- CleanMyMac多功能mac电脑管家清理软件
- android studio 下拉菜单,怎么在android studio中使用Spinner实现一个下拉菜单
- 联想服务器系统蓝屏,联想电脑蓝屏并提示“STOP:0X0000007B的原因分析和解决方法...
- Revit API:View 视图概述