用MATLAB实现贪心算法寻找图的最小支配集
find a minimum dominating set in a graph.
一、算法逻辑
①随机生成一个最小度数大于1的图,将所有顶点放入集合vertex_sub;
②在图中选中度数最大的顶点maxd_node,将其置入集合Set1,并将maxd_node的neighbor置入集合Set2;
③:如果Set1 U Set2=vertex_sub,那么Set1就是最小支配集,算法结束。
④:如果③中条件不成立,返回到②(执行②时跳过先前被选中过的maxd_node);
二、示例
三、代码
%用MATLAB实现贪心算法寻找图的最小支配集
Set1=[];%集合用来收纳选中的点(初始为空),作为支配集
Set2=[];%集合(初始为空)用来收纳被选中点的neighbor
Union_set=[];%初始化空集合
prompt = '请输入节点数量(N>2):N= ';
n = input(prompt);%输入节点个数
vertex_sub=1:n;%生成一个大小为n的序列矩阵(图的所有顶点集合)
minD=0; %随机图的最小度
while minD<2%判断随机生成图的最小度是否小于2
R = rand(n,n); %随机矩阵生成
A = round(R); %化为01矩阵
A= A-diag(diag(A)); %对角线赋值为0
A = triu(A,0); %对角线以下元素置0
C=A+transpose(A) ; %得到邻接矩阵
D=sum(C); %对邻接矩阵按行求和,即为度
minD = min(min(D)); %邻接矩阵每行之和的最小值,即为最小度数
if minD>=2 %判断最小度数是否满足要求
break
end
end
g=graph(C);%邻接矩阵转为图
Deg=transpose(degree(g));%得出各点的度(行矩阵表示)
while isequal(Union_set,vertex_sub)==0%判断两个集合是否相等
maxD=max(max(Deg));%从度数矩阵中取最大值(选中最大度数的点)
maxdegree_col=find(Deg==maxD);%找到maxD在度数矩阵中所处位置
maxdegree_verticeID=maxdegree_col;%将行数赋值给maxdegree_verticeID
maxdegree_verticeID=maxdegree_verticeID(1,1);%取到一个最大度数定点的ID
Deg(maxdegree_verticeID)=0;%%将被选中的点度数赋为0(避免下一轮再次选中)
Set1=union(Set1,maxdegree_verticeID);%将选中的顶点放入Set1
Neighbor=transpose(neighbors(g,maxdegree_verticeID));
%最大度顶点的neigoborID
Set2=transpose(union(Set2,Neighbor));%将最大度顶点的neighbors并入Set2
Union_set=union(Set1,Set2);%集合的并集
if isequal(Union_set,vertex_sub)==1%判断集合是否相等
break
end
end
min_dominatingset=Set1
figure=plot(g); %画出g的图
highlight(figure,min_dominatingset,'NodeColor','r')
title(['节点数为',num2str(n),'的图及其最小支配集'])
%TITLE函数的用法 title('XX')
四、测试结果
顶点数为10的图,红色的是最小支配集