1. 图的基本概念
    图包括点和线(分无向和有向),一般用点表示事物,用线表示关系

  2. 图可以用矩阵表示:

    比如(3,4)对应的点为2,表示的就是第三行第四列的点,在图中表示第三点指向第四点并有权重为2.图中的Inf表示的是无穷,说明这两个点在该方向上没有连接,记为无穷。无向图可以理解为双向图,道理相同。
    8-1 图论最短路径问题

  3. 迪杰斯特拉算法
    算法的思想可以由一个四行表格来概括:
    8-1 图论最短路径问题
    对这样一个道路,我们想要找出0-4的最短道路是多长,我们可以用这样的算法:
    用visited记录走过的点,distance记录权重,parent记录上一个点(初始状态下没有上一个点,记为-1)
    0走出第一步,可以走1,也可以走7,这时我们就记下路程,更新表格:
    8-1 图论最短路径问题
    这时我们记下了到点1和点7的数据,然后我们选择最短的一条路来走,于是选择了点1的路(就是橙色部分)
    然后继续走,1-2,1-7好像都可以唉
    更新表格:
    8-1 图论最短路径问题
    这里我们看到点2和点7都更新了,那就选择最近的点7的路即可。
    剩下的就是一直更新表格➡选路➡更新表格,一直到最短路径出来就可以了。
    最后是这样一个表格:
    8-1 图论最短路径问题
    我们可以直接看parent:0-1-7-8-5-2(不选6和3,是因为parent一项中它们没有出现,也就是它们实际上不包含在最短路径里面)

    最后提示:这个算法和弗洛伊德算法、贝尔曼-福特算法都不支持含有负权回路的图!

  4. 相关函数(这部分很多都来自清风老师的ppt…整理出来方便回看罢辽…)
    a. matlab作图
    graph(s,t):可在s 和 t 中的对应节点之间创建边,并生成一个图:G1 = graph(s1, t1); plot(G1)
    graph(s,t,w):可在s 和t 中的对应节点之间以w的权重创建边,并生成一个图 G2 = graph(s2, t2); plot(G2, ‘linewidth’, 2) % 设置线的宽度
    % 下面的命令是在画图后不显示坐标 set( gca, ‘XTick’, [], ‘YTick’, [] );
    上面都是无向图,要做出有向图,只需要将graph改为digraph就行了
    (这个是为了后面的图像处理方便,放到论文里面的话建议在线画图会好看)
    b. 返回任意两点的距离矩阵
    d = distances(G [,‘Method’,algorithm])
    c. 找给定范围内所有的点
    [nodeIDs,dist] = nearest(G,s,d[,‘Method’,algorithm]) 返回图形G 中与节点s 的距离在d 之内的所有节点。 nodeIDs是符合条件的节点,Dist是这些节点与s的距离。
    d. Matlab计算最短路径
    [P,d] = shortestpath(G,start,end[,‘Method’,algorithm] )
    功能:返回图G中start节点到end节点的最短路径
    输入参数: (1)G ‐输入图(graph 对象 / digraph 对象) (2)start 起始的节点 (3)end 目标的节点 (4)[,‘Method’,algorithm]是可选的参数,表示计算最短路径的算法。一般不用手动设置,默认使用的是“auto”,
    输出参数:
    (1)P –最短路径经过的节点 (2)d –最短距离

相关文章: