网上有关于给定邻接矩阵,matlab绘制有向图、无向图的资料,但是随机生成指定node和edge数量的有向图资料大部分是使用C,python和java等的。本篇博客借鉴了大佬的思路,实现了matlab随机生成DAG图以及邻接矩阵。另外,matlab自带查找图最短路径的函数。
1.有向无环图(DAG)
在数学,特别是图论和计算机科学中,有向无环图( DAG ) 是没有有向环的有向图。也就是说,它由顶点和边(也称为arcs)组成,每条边从一个顶点指向另一个顶点,这样沿着这些方向永远不会形成闭环。DAG 有许多科学和计算应用,从生物学(进化、家谱、流行病学)到信息科学(引文网络)再到计算(调度)。
![](https://img-blog.csdnimg.cn/img_convert/776965195515d6cb212e34bf565096eb.png)
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