参考资料:
MULE算法
不确定图上的枚举算法研究
Bron-Kerbosch算法视频介绍
Bron-Kerbosch算法
MULE(Maximal Uncertain CLique Enumeration )算法的论文原文是 Mining Maximal Cliques from an Uncertain Graph
1 | 论文作者:Arko Provo Mukherjee ,Pan Xu,Srikanta Tirthapura |
Bron-Kerbosch算法是在确定图上找出极大团,MULE算法是在不确定图上找出极大团。
我们现在的目的,是要在不确定图上找出极大团,现有的不确定图上极大团枚举算法中,基于顶点编号升序的典型算法—MULE 算法性能较好,其时间复杂度为 O(n·2n)。但是MULE 算法的时间代价会随着不确定图顶点规模的增大而急剧上升,而随着大数据和互联网技术的发展,不确定图的顶点规模越来越大,那么 MULE 算法也将难以满足实际应用的需求。
因此,通过将原图划分为子图,过滤掉其中绝对不可能成为 α-极大团的顶点集合,提高算法的计算效率,从而达到优化时间性能的目的。
算法的主要思想:
先不考虑原图中边上的概率,通过Bron-Kerbosch算法在原图中,找到一个个极大团子图。再对这每一个极大团子图,使用MULE算法,找出我们所需要的不确定图中的极大团。
例如这是原不确定图,在不考虑概率的情况下,我们利用Bron-Kerbosch算法可以得到5个极大团子图,分别是{1,2,3}、{2,3,5}、{3,4,5}、{5,6}、{6,7,8,9}。
接下来对每一个极大团子图调用 MULE 算法,枚举其中的 α-极大团(这里给定α=0.1,团概率大于等于0.1的就是α-极大团,团概率就是团中每条边上权值的乘积)对于顶点集合{1,2,3}所代表的极大团子图,调用 MULE 算法,可得顶点集合{1,2,3}本身就是一个 α-极大团;对于顶点集合{2,3,5}所代表的极大团子图,调用 MULE 算法,可得顶点集合{2,3}、{2,5}以及{3,5}是 α-极大团;对于顶点集合{3,4,5}所代表的极大团子图,调用 MULE 算法,可得顶点集合{3,4}、{3,5}以及{4,5}是 α-极大团;对于顶点集合{5,6}所代表的极大团子图,调用 MULE 算法,可得顶点集合{5,6}本身就是一个 α-极大团;对于顶点集合{6,7,8,9}所代表的极大团子图,调用 MULE 算法,可得顶点集合{6,7,8,9}本身就是一个 α-极大团。因此,在对每一个极大团子图调用 MULE 算法后,得到的所有 α-极大团为{1,2,3}、{2,3}、{2,5}、{3,5}、{3,4}、{3,5}、{4,5}、{5,6}以及{6,7,8,9}共计 9 个 α-极大团。
在原图中,给定 α = 0.1,那么不确定图 G 中的 α-极大团分别为顶点集合{1,2,3}、{2,5}、{3,4}、{3,5}、{4,5}、{5,6}以及{6,7,8,9},共 7 个 α-极大团。可是现在有了9个,多出了两个,这多出的两个,可以通过验证算法去掉,以后再详细介绍,这里不考虑,我只需要求出最后的9个极大团,就算完成任务。
下面是代码:
头文件:
1 | Vertex_Value.h |
1 | node.h |
1 | UDG.h |
1 | ReadFile.h |
1 | BasicFunctions.h |
下面是cpp文件:
1 | Vertex_Value.cpp |
1 | ReadFile.cpp |
1 | BasicFunctions.cpp |
下面是主函数:
1 | #include <tchar.h> |
test2.txt如下:
9表示结点数,28表示边数(这里的1 2和2 1算不同的边)
第一位数字是头结点,第二位数字是边结点,第三个数字是边上的概率
1 | 9 28 |
实验结果: