A Brandes-algoritmus egy hatékony módszer a gráfok központossági mérőszámainak (betweenness centrality) kiszámítására. Ezt a metrikát gyakran használják a gráfok elemzésében, hogy meghatározzák, mely csúcsok vagy élek a legfontosabbak az információáramlás szempontjából.
Egy csúcs központosságát a rajta áthaladó **legrövidebb utak** száma alapján határozzák meg: ahol: - : Az -ből -be vezető legrövidebb utak száma, - : Az -ből -be vezető azon legrövidebb utak száma, amelyek -n keresztül haladnak.
Az algoritmus egy hatékony ( O(V E) )-s időkomplexitású módszer, amely elkerüli az összes csúcspár közötti legrövidebb utak explicit kiszámítását.
Brandes(G): Initialize C_B(v) = 0 for all v in V for s in V: S = üres stack P = üres lista minden v ∈ V sigma = 0 minden v ∈ V; sigma = 1 d = -1 minden v ∈ V; d = 0 # BFS vagy Dijkstra Q = üres sor Q.push(s) while Q nem üres: v = Q.pop() S.push(v) for minden szomszéd w ∈ G: if d < 0: Q.push(w) d = d + 1 if d == d + 1: sigma += sigma P.append(v) delta = 0 minden v ∈ V while S nem üres: w = S.pop() for v in P: delta += (sigma / sigma) * (1 + delta) if w != s: C_B += delta return C_B
Az alábbi példa egy egyszerű, nem súlyozott gráf esetén mutatja be a Brandes-algoritmust:
from collections import defaultdict, deque
def brandes(graph):
centrality = defaultdict(float)
for s in graph:
# BFS előkészítése
stack =
pred = {v: for v in graph}
sigma = dict.fromkeys(graph, 0.0)
dist = dict.fromkeys(graph, -1)
sigma = 1
dist = 0
# BFS futtatása
queue = deque()
while queue:
v = queue.popleft()
stack.append(v)
for w in graph:
if dist < 0: # w még nem látogatott
queue.append(w)
dist = dist + 1
if dist == dist + 1: # w egy szomszédos csúcs
sigma += sigma
pred.append(v)
# Központosság kiszámítása
delta = dict.fromkeys(graph, 0.0)
while stack:
w = stack.pop()
for v in pred:
delta += (sigma / sigma) * (1 + delta)
if w != s:
centrality += delta
return centrality
# Példa gráf
graph = {
'A': ,
'B': ,
'C': ,
'D':
}
centrality = brandes(graph)
for node, value in centrality.items():
print(f"{node}: {value:.2f}")
Kimenet:
A: 0.00 B: 2.00 C: 2.00 D: 0.00
#include <iostream>
#include <vector>
#include <queue>
#include <unordered_map>
#include <stack>
using namespace std;
void brandes(const unordered_map<int, vector<int>>& graph, unordered_map<int, double>& centrality) {
for (auto& pair : graph) {
int s = pair.first;
stack<int> S;
unordered_map<int, vector<int>> pred;
unordered_map<int, double> sigma, delta;
unordered_map<int, int> dist;
for (auto& p : graph) {
sigma = 0.0;
delta = 0.0;
dist = -1;
}
sigma = 1.0;
dist = 0;
queue<int> Q;
Q.push(s);
while (!Q.empty()) {
int v = Q.front();
Q.pop();
S.push(v);
for (int w : graph.at(v)) {
if (dist < 0) {
Q.push(w);
dist = dist + 1;
}
if (dist == dist + 1) {
sigma += sigma;
pred.push_back(v);
}
}
}
while (!S.empty()) {
int w = S.top();
S.pop();
for (int v : pred) {
delta += (sigma / sigma) * (1 + delta);
}
if (w != s) {
centrality += delta;
}
}
}
}
int main() {
unordered_map<int, vector<int>> graph = {
{1, {2, 3}},
{2, {1, 3, 4}},
{3, {1, 2, 4}},
{4, {2, 3}}
};
unordered_map<int, double> centrality;
brandes(graph, centrality);
for (const auto& pair : centrality) {
cout << "Csúcs " << pair.first << ": " << pair.second << endl;
}
return 0;
}
Kimenet:
Csúcs 1: 0 Csúcs 2: 2 Csúcs 3: 2 Csúcs 4: 0
A Brandes-algoritmus hatékony eszköz a gráfok központosságának kiszámítására, különösen nagy és összetett hálózatok esetén. Hatékonysága és széles körű alkalmazási lehetőségei miatt alapvető eszköz a hálózatelemzésben.