用MATLAB实现贪心算法寻找图的最小支配集

用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);

二、示例
节点数为8的图
经过4轮查找,得到图的最小支配集是3,4,5,6三、代码

%用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的图,红色的是最小支配集
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值