1 | #include <string>
|
---|
2 | #include <iostream>
|
---|
3 | #include <fstream>
|
---|
4 | #include <sstream>
|
---|
5 |
|
---|
6 | #include <boost/graph/adjacency_list.hpp>
|
---|
7 | #include <boost/graph/graphviz.hpp>
|
---|
8 |
|
---|
9 | #include <boost/graph/bc_clustering.hpp>
|
---|
10 | #include <boost/graph/iteration_macros.hpp>
|
---|
11 |
|
---|
12 |
|
---|
13 | // Graph edge properties (bundled properties)
|
---|
14 | struct EdgeProperties
|
---|
15 | {
|
---|
16 | int weight;
|
---|
17 | };
|
---|
18 |
|
---|
19 | typedef boost::property<boost::edge_weight_t, float> EdgeWeightProperty;
|
---|
20 |
|
---|
21 | typedef boost::adjacency_list< boost::setS, boost::vecS, boost::undirectedS, boost::no_property, EdgeWeightProperty > Graph;
|
---|
22 |
|
---|
23 | typedef Graph::vertex_descriptor Vertex;
|
---|
24 | typedef Graph::edge_descriptor Edge;
|
---|
25 |
|
---|
26 | void WriteGraph(const Graph& g, const std::string& filename);
|
---|
27 |
|
---|
28 | int addition(int a, int b);
|
---|
29 | int betweenness(int*, int*, int);
|
---|
30 |
|
---|
31 | int main()//std::vector<int> arr)
|
---|
32 | {
|
---|
33 | //provide array of connections from graph
|
---|
34 | //from https://www.google.co.uk/search?q=between+centrality+calculation&client=firefox-b-ab&dcr=0&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjeg8W7tdvZAhXMBZoKHbEnCjkQ_AUICigB&biw=1376&bih=692#imgrc=H9wvPMTEbg6bKM:
|
---|
35 | int arr [] = { 1,2, 1,3, 2,3, 3,4, 3,5, 2,5, 5,7, 5,6 };
|
---|
36 | //weights of the above connections
|
---|
37 | int arr_weights[] = { 10,10,10,10,10,1,10,10};
|
---|
38 | int size_nodes = 8;
|
---|
39 | int a;
|
---|
40 | int out = 1;
|
---|
41 | a = betweenness(arr, arr_weights, size_nodes);//works
|
---|
42 |
|
---|
43 | return 0;
|
---|
44 | }
|
---|
45 |
|
---|
46 | int findMax(int array[], int arraySize) {
|
---|
47 | int maxPosition = 0; //assume the first element is maximum
|
---|
48 | for (int i = 1; i < arraySize; i++)
|
---|
49 | if (array[i] > array[maxPosition]) //compare the current element with the known max
|
---|
50 | maxPosition = i; //update maxPosition
|
---|
51 | return array[maxPosition];
|
---|
52 | }
|
---|
53 |
|
---|
54 | int betweenness(int *param, int *weights, int size_nodes)
|
---|
55 | {
|
---|
56 |
|
---|
57 | int ii = boost::lexical_cast<int>("1");
|
---|
58 | double max_centrality = 14;
|
---|
59 |
|
---|
60 | //// Create a graph
|
---|
61 | Graph g;
|
---|
62 | int paramSize = size_nodes;
|
---|
63 |
|
---|
64 | static int Vert[50000000];
|
---|
65 |
|
---|
66 | int biggest = findMax(param, 16);
|
---|
67 |
|
---|
68 | //create the vetrices
|
---|
69 | for (int a1=0; a1 < biggest+1; a1++)
|
---|
70 | {
|
---|
71 | Vert[a1] = boost::add_vertex(g);
|
---|
72 | }
|
---|
73 |
|
---|
74 | //create the edges (with the given weights included)
|
---|
75 | for (int a2=0; a2 < paramSize; a2++)
|
---|
76 | {
|
---|
77 | //EdgeWeightProperty weight0 = 5;
|
---|
78 | boost::add_edge(Vert[param[a2*2]],Vert[param[a2*2+1]], EdgeWeightProperty(weights[a2]), g);
|
---|
79 | }
|
---|
80 |
|
---|
81 |
|
---|
82 | // Define VertexCentralityMap
|
---|
83 | typedef boost::property_map< Graph, boost::vertex_index_t>::type VertexIndexMap;
|
---|
84 |
|
---|
85 |
|
---|
86 |
|
---|
87 | VertexIndexMap v_index = get(boost::vertex_index, g);
|
---|
88 | std::vector< double > v_centrality_vec(boost::num_vertices(g), 0.0);
|
---|
89 |
|
---|
90 | // Create the external property map
|
---|
91 | boost::iterator_property_map< std::vector< double >::iterator, VertexIndexMap >
|
---|
92 | v_centrality_map(v_centrality_vec.begin(), v_index);
|
---|
93 |
|
---|
94 |
|
---|
95 |
|
---|
96 |
|
---|
97 | // Write to graphviz -> illustrate the graph via 'neato -Tps before.dot > before.ps'
|
---|
98 | WriteGraph(g, "before.dot");
|
---|
99 |
|
---|
100 | // Calculate the vertex and edge centralites
|
---|
101 | // Can be used to get an initial impression about the edge centrality values for the graph
|
---|
102 | //brandes_betweenness_centrality( g, v_centrality_map, e_centrality_map );
|
---|
103 | brandes_betweenness_centrality(g, v_centrality_map);
|
---|
104 |
|
---|
105 |
|
---|
106 | //BGL_FORALL_VERTICES(vertex, g, Graph)
|
---|
107 | for (int vertex=1;vertex<size_nodes;vertex++)
|
---|
108 | {
|
---|
109 | std::cout << vertex << ": " << v_centrality_map[vertex] << std::endl;
|
---|
110 | }
|
---|
111 |
|
---|
112 | WriteGraph(g, "after.dot");
|
---|
113 |
|
---|
114 | return 0;
|
---|
115 | }
|
---|
116 |
|
---|
117 | void WriteGraph(const Graph& g, const std::string& filename)
|
---|
118 | {
|
---|
119 | std::ofstream graphStream;
|
---|
120 | graphStream.open(filename.c_str());
|
---|
121 | boost::write_graphviz(graphStream, g);
|
---|
122 | graphStream.close();
|
---|
123 | }
|
---|