无向图中最大团问题的求解(附上matlab代码)

一、问题描述:
团就是最大完全图;最大团就是数目最多的最大子图;[1]
对于给定的无向图G(V,E).如果U在V集合内,且对任意的u,v在集合V内,且(u,v)属于集合E,则称U是G的完全子图;(u,v)是u和v形成所有边的集合;
二、数学建模:
首先设最大团为一个空团,往其中加入顶点,然后依次考虑每一个顶点,查看该顶点加入团后是否仍然构成一个团,如果可以,考虑将顶点加入团或者舍弃两种情况,如果不行,直接舍弃,然后递归判断下一个顶点。对于无连接或者舍弃两种情况,在递归前,可采用减枝策略来避免无效的搜索。
为了判断当前顶点加入团后是否仍是一个团,只需考虑该顶点和团中顶点是否都有连接。
程序中采用了一个比较简单的剪枝策略,即如果剩余未考虑的顶点数加上团中顶点数小于等于当前最优解的顶点数,可停止继续深度搜索,否则继续深度递归
当搜索到一个叶子结点时,即可停止搜索,此时更新最优解和最优值;[2]

[Bestx,Bestn,answer]=MCP(A)
global A;
global n;
n=size(A,2);
global cn;%当前团中顶点数
cn=0;
global x;%解
x=[];
global bestx;%最优解
bestx=[];
global Bestx;%最优解解集合
Bestx=[];
global Bestn;%最优解个数集合
Bestn=[];
Backtrack(1);
answer=max(Bestn);
funtion Backtrack(i)
global n;
global cn;
global bestx;
global bestn;
global x;
global A;
global Bestx;
global Bestn;
%最终某一路径上深度探索的条件;达到叶子结点
if(i>n)
	bestx=x;
	Bestx=[Bestx,bestx];
	bestn=cn;
	Bestn=[Bestn,bestn];
	for j=1:size(bestx,2)
		fprintf(' %d',bestx(j));
	end
	fprinf('\n');
	return;
end
ok=1;
%判断加入顶点是否能够组成团
for j=1:i-1
	if(x(j)&&A(i,j)==0)
		ok=0;
		break;
	end
end
if(ok)%进入左子树
	x(i)=1;
	cn=cn+1;
	Backtrack(i+1);
	x(i)=0;
	cn=cn-1;
end
if(cn+n-i>=bestn)%进入右子树,进入右子树也是有条件的;存在可能的解比当前的解好才会进入(前提是存在最优解,只有存在最优解,则一定到过叶子结点)
	x(i)=0;
	Backtrack(i+1);
end
%最优解的确定肯定是在叶子结点处

在这里插入图片描述
在这里插入图片描述
参考文献:
[1]https://blog.csdn.net/qq_18995813/article/details/51547099
[2]www.cnblogs.com/pushing-my-way/archive/2012/08/08/2627993.html
具体代码和测试代码:参见:
https://download.csdn.net/download/fyf18845165207/10737425

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值