算法复习:最大团问题(回溯法和分支限界法)

原创 2016年05月31日 16:46:25

问题描述
给定无向图G=(V,E),V是顶点集,E是边集。如果UV,且对任意u,vU有(u,v)E,u,v是两个顶点的符号,则称U是G的完全子图。G的完全子图U是G的一个团当且仅当U不包含在G的更大的完全子图中。

2、一个例子
最大团的一个例子
–子集{1,2}是G的一个大小为2的完全子图,但不是一个团,因为它包含于G的更大的完全子图{1,2,5}中。{1,2,5}、{1,4,5}和{2,3,5}都是G的最大团。

A 回溯法:

·问题空间(input):
-G=(V,E)
·解空间(output):
-图G的顶点集V的子集选取问题,Xi{0,1}
-约束函数:团的定义
-目标函数:所含顶点数最多
·解空间树(所有可能解的结构):
-子集数(因为这是一个子集选取问题)
·搜索空间(最优解的求解过程):
-约束函数 顶点i到已选入的顶点集中每一个顶点都有边相连。
-限界函数 有足够多的可选择顶点使得算法有可能在右子树中找到更大的团。

下面是根据图构造出来的树(没有构造完,虚线的地方可以继续往下画,相应的下面的表也是):
解空间树
cn是当前顶点数,bestn是当前最大顶点数
下面的表是搜索过程:
搜索过程
Xi分别代表五个点,值为0代表没有选入顶点集U,值为1代表已选入顶点集U。
3、算法部分代码


int **a         //图G的邻接矩阵
int n           //图G的顶点数
int *x          //当前解
int *bestx      //当前最优解
int cn          //当前顶点数
int bestn       //当前最大顶点数


void MaxClique(int i)
{
    if (i > n)      //到达叶节点,更新最优值和最优解
    {
        for (int j = 1;j <= n;j++)
            bestx[j] = x[j];
        bestn = cn;
        return;
        //搜索扩展节点时,检查顶点i与当前团的连接
    }
    int OK = 1;
    for (int j = 1;j < i;j++)//扫描当前团
        if (x[j] && a[i][j] == 0)//i与当前团的顶点j不相连
        {
            OK = 0;
            break;
        }
    if (OK)//顶点i与当前团的每个顶点均有连接,进入左子树
    {
        x[i] = 1;//状态更新
        cn++;
        MaxClique (i + 1);
        x[i] = 0;//输出叶节点后,搜索右子树之前的状态恢复(即回溯指搜索右子树)
        cn--;
    }
    if (cn + n - i > bestn)//进入右子树
    {
        x[i] = 0;
        MaxClique(i + 1);
    }
}

4、算法效率
解最大团问题的回溯算法所需的计算时间为O(n2n)

B 分支限界法
优先队列式分支限界法
还是上面那题,图片再复制到这里
最大团的一个例子
·解空间和解空间树都没变
·剪枝
-左子树:从顶点i到已选入的顶点集中每一个顶点都有边,否则剪枝
-右子树:顶点数上界小于当前最优值(就是上面的bestn)时剪枝
顶点数上界=已确定的顶点数+未确定的顶点数的上界
·优先队列中节点的优先级
-顶点数上界

解空间树如下:
分支限界法解空间树
现在懂节点上那两数字相加啥意思了吧

树搜索的过程如下表:
搜索过程

所以,这已经很明白了,回溯法求解搜索树是深度优先,先一条道走到底,再回溯找其他的看是不是比得到的最优,而分支限界是广度优先,一层一层往下找,中间不断排除不符合的,找到最下面一层就得到了最优解。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

第五章 (回溯法)最大团问题

原文:http://www.cnblogs.com/pushing-my-way/archive/2012/08/08/2627993.html 问题描述:团就是最大完全子图。 给定无...

分支限界法之最大团问题

A,最大团问题:给定一个无向图G=(V,E),其中V代表顶点集合,E代表边的集合。,如果U是V的子集,且对于U中任意两个顶点u和v都是相连的,即u-->v属于E,则称顶点子集U是图G的完全子图或者G的...

最大团问题-分支限界算法

算法设计与分析课上,老师布置了一个讲解最大团的分支限界算法的went

0037算法笔记——【分支限界法】最大团问题

问题描述      给定无向图G=(V, E),其中V是非空集合,称为顶点集;E是V中元素构成的无序二元组的集合,称为边集,无向图中的边均是顶点的无序对,无序对常用圆括号“( )”表示。如果U∈V,...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

0030算法笔记——【回溯法】最大团问题和图的m着色问题

1、最大团问题      问题描述      给定无向图G=(V, E),其中V是非空集合,称为顶点集;E是V中元素构成的无序二元组的集合,称为边集,无向图中的边均是顶点的无序对,无序对常用圆括号...

最大团算法(Maximum Clique)

1.问题描述 最大团问题是图论中一个经典的组合优化问题,也是一类NP完全问题。在Wikipedia中Clique Problem的描述如下: In computer science, the cliq...

贪心算法和最大团

贪心算法和最大团 James McCaffrey 下载代码示例 在本月的专栏中,我将介绍图形最大 clique 问题的解决方案。 解决方案使用所谓的贪婪的算法,并...
  • lshni
  • lshni
  • 2011年12月29日 13:50
  • 3517

算法java实现--分支限界法--最大团问题

布线问题的java实现(分支限界法) 具体问题描述以及C/C++实现参见网址 http://blog.csdn.net/liufeng_king/article/details/89119...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法复习:最大团问题(回溯法和分支限界法)
举报原因:
原因补充:

(最多只允许输入30个字)