matlab生成随机有向无环图以及查找最短/长路径

网上有关于给定邻接矩阵,matlab绘制有向图、无向图的资料,但是随机生成指定node和edge数量的有向图资料大部分是使用C,python和java等的。本篇博客借鉴了大佬的思路,实现了matlab随机生成DAG图以及邻接矩阵。另外,matlab自带查找图最短路径的函数。


1.有向无环图(DAG)

在数学,特别是图论和计算机科学中,有向无环图( DAG ) 是没有有向环的有向图。也就是说,它由顶点和边(也称为arcs)组成,每条边从一个顶点指向另一个顶点,这样沿着这些方向永远不会形成闭环。DAG 有许多科学和计算应用,从生物学(进化、家谱、流行病学)到信息科学(引文网络)再到计算(调度)。

2.随机生成DAG

思路:分两步完成edge的添加:用出现过的node连接未出现的node,生成前n-1条边,保证所有所有节点都被连接到一个图中;生成后m-n+1条边。另外,相比于直接随机生成边,代码新建了表示未出现edge的数组edge_notappeared,提高了生成后m-n+1条边的效率,不会出现重复边的情况。

输入:node和edge数目

输出:随机生成DAG的邻接矩阵

function out = CreatDAG(node,edge)
out = digraph;
out = addnode(out,node);
node_appeared = [];
node_notappeared = 1:node;
edge_notappeared = [1,2];
for i = 1:node-1
    for j = i+1:node
        edge_notappeared = union(edge_notappeared,[i,j],'rows');
    end
end

ne=0;ns=0;
%生成前n-1条边
for i = 1:node-1
    if(out.numedges==0)
        while(ne == ns)
            ns = randi(node-1);
            ne = randi(node-1);  
        end
        if(ne<ns)%顺序调整
            t = ns;
            ns = ne;
            ne = t;
        end
        out = addedge(out,ns,ne);%添加edge
        
        edge_notappeared = setdiff(edge_notappeared,[ns,ne],'rows');%更新edge列表
        node_appeared = union(node_appeared,[ns ne]); %更新node列表
        node_notappeared = setdiff(1:node,node_appeared);
    else
        ns = node_appeared(randi(length(node_appeared)));
        ne = node_notappeared(randi(length(node_notappeared)));
        if(ne<ns)%顺序调整
            t = ns;
            ns = ne;
            ne = t;
        end
        out = addedge(out,ns,ne);%添加edge

        edge_notappeared = setdiff(edge_notappeared,[ns,ne],'rows');%更新edge列表
        node_appeared = union(node_appeared,[ns,ne]);%更新node列表
        node_notappeared = setdiff(node_notappeared,[ns,ne]);
    end
end
%生成后m-n+1条边
while(out.numedges ~= edge)
    e = randi(length(edge_notappeared));
    out = addedge(out,edge_notappeared(e,1),edge_notappeared(e,2));%添加edge
    edge_notappeared = setdiff(edge_notappeared,edge_notappeared(e,:),"rows");
end

plot(out);
out = adjacency(out);

3.寻找最短/长路径

#最短路径
[path,distance] = shortestpath(G,node1,node2);#path返回路径,distance返回距离
#最长路径
G.Edges.Weight = -G.Edges.Weight;
[path,distance] = shortestpath(G,node1,node2);#path返回路径,distance返回距离

欢迎大佬批评指正~

参考资料

思路来源:https://www.jianshu.com/p/3eb85c38da4f

matlab语法:https://ww2.mathworks.cn/help/matlab/ref/digraph.html

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值