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

本文介绍了如何在MATLAB中生成随机的有向无环图(DAG),并提供了详细的代码实现,包括创建邻接矩阵和添加边的逻辑。此外,还展示了利用MATLAB内置函数寻找图的最短路径的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网上有关于给定邻接矩阵,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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值