最大团 matlab,无向图中最大团问题的求解(附上matlab代码) |
您所在的位置:网站首页 › matlab无向图 › 最大团 matlab,无向图中最大团问题的求解(附上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 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |