在不确定图上求所有极大团算法

来源:互联网 发布:java怎么判断邮箱格式 编辑:程序博客网 时间:2024/06/04 18:15

论文题目:

                     Mining Maximal Cliques from an Uncertain Graph

一:实现中遇到的问题。

1,图的存储结构用什么好?

通过查找资料和询问师兄,先确定为邻接vector存储结构。因为vector作为STL中的类,封装了很多函数,用起来很方便。

2,如何确定哪些变量作参数时应该为引用?

不断调试中,发现变量X在不同层递归中,并入的顶点权值对是不一样的。即它是及时改变的,所以我把它作为引用参数。“另外我发现引用作参数时,同一层递归的引用才会在前一个分支的基础上改变,不同递归层时,应该是复制了一个空间,没一层递归单独使用一个空间。”可是后来发现不是这样的,引用作参数时,不同递归层也不会复制,一直都是是用这个空间的。至于我的代码中出现这样的假象,是因为我用另一个局部变量_X来作为下一层递归的参数值了,那么下一层递归改变的值是_X而与上一层递归中的X没有关系了,当然就不会改变X了。

3,怎么保证在同一层递归中,当前分支完成后得到的团C,不会被邻居分支使用?

在同一层递归中,一个for循环有多个i值,即有多条分支路线,每一条分支路线完成后得到的团C都不应该对邻近分支产生影响,但是在一开始,调了很久都没解决,后来突然一个想法,觉得可以在for循环之前产生一个局部变量,初始化它为当前递归层的团C值,然后每来一个i值,即每来一条分支,我都调用一个辅助函数,使用这个局部变量为参数,那在一条分支中改变的团,只是这个局部变量,而不影响当前递归层的团C

,那么在接下来的i+1,这条分支,起始团还是当前递归层的团C。

4,运行时遇到错误:vector subscript out of range?

应该是有vector没有分配足够的空间,但是却用了它的下标。

下边是实现代码:整个项目文件名为MULE.

下边是头文件:

Vertex_Value.h#pragma once#include <iostream>using namespace std;class Vertex_Value{public:Vertex_Value(void);~Vertex_Value(void);Vertex_Value(int x, float y);//friend bool operator<(const Vertex_Value& A, const Vertex_Value& B);public:int vertex;float val;};
node.h#pragma once#include "Vertex_Value.h"#include <vector>using namespace std;class node{public:node(void);~node(void);public:int vertex;    vector<Vertex_Value> vec;};
UDG.h#pragma once#include "node.h"#define VERNUM 10class UDG{public:UDG(void);~UDG(void);public:int vernum, arcnum;node *AdjVector;//是邻接vector的形式};
ReadFile.h#pragma once#include "UDG.h"#define path "F:\\test1.txt"class ReadFile{public:ReadFile(void);~ReadFile(void);void CreateUdg(UDG &g);};
BasicFunctions.h#pragma once#include <vector>#include "UDG.h"#include "Vertex_Value.h"using namespace std;#define $ 0.1class BasicFunctions{public:BasicFunctions(void);~BasicFunctions(void);//vector<int> VerValToVer(vector<Vertex_Value> A);//求顶点权值vector中的顶点float FindValue(int u, int v, UDG g);//给定顶点对,找权值float clq(vector<int> C, float q, Vertex_Value D, int m, UDG g);//求当前团加入一个顶点后的权值int MaxC(vector<int> C);//找当前团的最大顶点编号vector<int> AdjVertex(int m, UDG g);//找m的邻接点vector<int> mixede(vector<int> A, vector<int> B);//求两个vector的交集void MULE(const UDG g);//总函数void EnumUncertainMC(vector<int> C, float q, vector<Vertex_Value> I, vector<Vertex_Value>& X,UDG g);vector<Vertex_Value> GenerateI(vector<int> C, float q, vector<Vertex_Value> I, UDG g);bool isbelongto(int m, vector<int> S1);//检测m顶点是否属于S1;vector<Vertex_Value> GenerateX(vector<int> C, float q, vector<Vertex_Value> X, UDG g);void fuzhufunction(vector<int> C, float q, vector<Vertex_Value> I, vector<Vertex_Value>& X, int i, UDG g);};
下边是.cpp文件

Vertex_Value.cpp#include "StdAfx.h"#include "Vertex_Value.h"Vertex_Value::Vertex_Value(void){}Vertex_Value::~Vertex_Value(void){}Vertex_Value::Vertex_Value(int x, float y){vertex = x;y = val;}
ReadFile.cpp#include "StdAfx.h"#include "ReadFile.h"#include <fstream>#include <iostream>using namespace std;ReadFile::ReadFile(void){}ReadFile::~ReadFile(void){}void ReadFile::CreateUdg(UDG &g){ifstream infile(path);cout << "开始读入文件!" << endl;infile >> g.vernum >> g.arcnum;cout << "顶点个数和边数为:" << endl;cout << g.vernum << ' ' << g.arcnum << endl;g.AdjVector = new node[g.vernum + 1];//0号不存结点cout << "开始读入边,建立邻接vector!" << endl;int i;for (i = 0; i < g.arcnum; i++){int head, tail;float val;infile >> head >> tail >> val;g.AdjVector[head].vertex = head;Vertex_Value temp;temp.vertex = tail;temp.val = val;g.AdjVector[head].vec.push_back(temp);}}
BasicFuncions.cpp#include "StdAfx.h"#include "UDG.h"#include "BasicFunctions.h"BasicFunctions::BasicFunctions(void){}BasicFunctions::~BasicFunctions(void){}//***********************************************************************vector<int> BasicFunctions::mixede(vector<int> A, vector<int> B){int a[VERNUM];vector<int> vec;//cout << vec.size() << endl;//cout << vec.capacity() << endl;unsigned int i;for (i = 0; i < A.size(); i++){a[A[i]] = A[i];//cout << a[A[i]] << endl;}//cout << "............." << endl;for (i = 0; i < B.size(); i++){if (B[i] == a[B[i]]){//vec[i] = B[i];vec.push_back(B[i]);//cout << vec[i] << endl;}}return vec;}//***********************************************************************int BasicFunctions::MaxC(vector<int> C){if (C.empty()){return 0;}int max = 1;unsigned int i;for (i = 0; i < C.size(); i++){if (max < C[i]){max = C[i];}}return max;}//***********************************************************************vector<int> BasicFunctions::AdjVertex(int m, UDG g){vector<int> C;unsigned int i;for (i = 0; i < g.AdjVector[m].vec.size(); i++){C.push_back(g.AdjVector[m].vec[i].vertex);}return C;}//***********************************************************************//vector<int> BasicFunctions::VerValToVer(vector<Vertex_Value> A)//{//unsigned int i;//vector<int> C;//for (i = 0; i < A.size(); i++)//{//C.push_back(A[i].vertex);//}//return C;//}//***********************************************************************float BasicFunctions::FindValue(int u, int v, UDG g){unsigned int i;for (i = 0; i < g.AdjVector[u].vec.size(); i++){if (g.AdjVector[u].vec[i].vertex == v){return g.AdjVector[u].vec[i].val;}}}//***********************************************************************float BasicFunctions::clq(vector<int> C, float q, Vertex_Value D, int m, UDG g){float temp;temp = FindValue(D.vertex, m, g);return q * D.val * temp;}//***********************************************************************bool BasicFunctions::isbelongto(int m, vector<int> S1){for (unsigned int i = 0; i < S1.size(); i++){if (m == S1[i]){return true;}}return false;}//***********************************************************************vector<Vertex_Value> BasicFunctions::GenerateI(vector<int> C, float q, vector<Vertex_Value> I, UDG g){int m = MaxC(C);vector<int> S2 = AdjVertex(m, g);vector<Vertex_Value> _I;vector<int> S1;unsigned int i;for (i = 0; i < I.size(); i++){S1.push_back(I[i].vertex);}S1 = mixede(S1, S2);unsigned int j = 0;for (i = 0, j; i < I.size(); i++){if (I[i].vertex > m && isbelongto(I[i].vertex, S1)){if ( clq(C, q, I[i], m, g) >= $){_I.push_back(I[i]);_I[j].val = _I[j].val * FindValue(_I[j].vertex, m, g);j++;}}}return _I;}//***********************************************************************vector<Vertex_Value> BasicFunctions::GenerateX(vector<int> C, float q, vector<Vertex_Value> X, UDG g){if (X.empty()){return X;}int m = MaxC(C);vector<int> S2 = AdjVertex(m, g);vector<Vertex_Value> _X;vector<int> S1;unsigned int i;for (i = 0; i < X.size(); i++){S1.push_back(X[i].vertex);}S1 = mixede(S1, S2);unsigned int j;for (i = 0, j = 0;  i < X.size(); i++){if (isbelongto(X[i].vertex, S1)){if (clq(C, q, X[i], m, g) >= $){_X.push_back(X[i]);_X[j].val = _X[j].val * FindValue(_X[j].vertex, m, g);j++;}}}return _X;}//***********************************************************************void BasicFunctions::fuzhufunction(vector<int> C, float q, vector<Vertex_Value> I, vector<Vertex_Value>& X, int i, UDG g){C.push_back(I[i].vertex);q = q * I[i].val;//vector<Vertex_Value> _I(GenerateI(C, q, I, g));vector<Vertex_Value> _I = GenerateI(C, q, I, g);vector<Vertex_Value> _X = GenerateX(C, q, X, g);EnumUncertainMC(C, q, _I, _X, g);X.push_back(I[i]);}//***********************************************************************void BasicFunctions::EnumUncertainMC(vector<int> C, float q, vector<Vertex_Value> I, vector<Vertex_Value>& X, UDG g){//if (C.empty())//{//cout <<"当前团为空!" << endl;//}//else//{//for (unsigned int k = 0; k < C.size(); k++)//{//cout << C[k] << ' ';//}//}//cout << endl;unsigned int i;if (I.empty() && X.empty()){cout << "产生一个极大团!" << endl;for (i = 0; i < C.size(); i++){cout << C[i] << ' ';}cout << endl;return;}vector<int> Ctemp(C);for (i = 0; i < I.size(); i++){//C.push_back(I[i].vertex);//q = q * I[i].val;////vector<Vertex_Value> _I(GenerateI(C, q, I, g));//vector<Vertex_Value> _I = GenerateI(C, q, I, g);//vector<Vertex_Value> _X = GenerateX(C, q, X, g);//EnumUncertainMC(C, q, _I, _X, g);//X.push_back(I[i]);//C.pop_back();fuzhufunction(Ctemp, q, I, X, i, g);}}//***********************************************************************void BasicFunctions::MULE(const UDG g){vector <Vertex_Value> _I(g.vernum);vector<int> C;vector<Vertex_Value> X;int i = 1;for (i; i <= g.vernum; i++){_I[i-1].vertex = i;_I[i-1].val = 1;}float j = 1;EnumUncertainMC(C, j, _I, X, g);}
MULE.cpp#include "stdafx.h"#include "ReadFile.h"#include "BasicFunctions.h"#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){UDG g;ReadFile A;A.CreateUdg(g);//测试求交集的函数。。。。。。。。。。。。。。。。。。。。。。。。//vector<int> B;//vector<int> C;//int i;//for (i = 0; i < 5; i++)//{//B.push_back(i);//C.push_back(i + 1);//}//BasicFunctions BF;//vector<int> bf(BF.mixede(B, C));//for (unsigned int j = 0; j < bf.size(); j++)//{//cout << bf[j] << endl;//}BasicFunctions BB;BB.MULE(g);system("pause");return 0;}
test1.txt如下:

9 28
1 2 0.6
1 3 0.5
2 1 0.6
2 3 0.4
2 5 0.7
3 1 0.5
3 2 0.4
3 4 0.5
3 5 0.1
4 3 0.5
4 5 0.2
5 2 0.7
5 3 0.1
5 4 0.2
5 6 0.4
6 5 0.4
6 7 0.7
6 8 0.9
6 9 0.8
7 6 0.7

实验结果为:











1 0
原创粉丝点击