我正在編寫一個程序來生成一個圖並檢查它是否連接。以下是代碼。這裏有一些解釋:我在隨機位置的飛機上生成了許多點。然後我連接節點,而不是僅基於接近度。我的意思是說節點更可能連接到更近的節點,這是由我在代碼(h_sq)和距離中使用的隨機變量確定的。因此,我生成了所有鏈接(對稱的,即,如果我可以與j對話,反之亦然),然後檢查BFS以查看圖形是否已連接。
我的問題是代碼似乎正常工作。然而,當節點數量大於2000時,它非常慢,爲了模擬目的,我需要多次運行這個函數。我甚至試圖用其他庫來繪製圖形,但性能是一樣的。 有誰知道我怎麼可能加快一切?提高圖連通性計算的性能
感謝,
int Graph::gen_links() {
if(save == true) { // in case I want to store the structure of the graph
links.clear();
links.resize(xy.size());
}
double h_sq, d;
vector< vector<luint> > neighbors(xy.size());
// generate links
double tmp = snr_lin/gamma_0_lin;
// xy is a std vector of pairs containing the nodes' locations
for(luint i = 0; i < xy.size(); i++) {
for(luint j = i+1; j < xy.size(); j++) {
// generate |h|^2
d = distance(i, j);
if(d < d_crit) // for sim purposes
d = 1.0;
h_sq = pow(mrand.randNorm(0, 1), 2.0) + pow(mrand.randNorm(0, 1), 2.0);
if(h_sq * tmp >= pow(d, alpha)) {
// there exists a link between i and j
neighbors[i].push_back(j);
neighbors[j].push_back(i);
// options
if(save == true)
links.push_back(make_pair(i, j));
}
}
if(neighbors[i].empty() && save == false ) {
// graph not connected. since save=false i dont need to store the structure,
// hence I exit
connected = 0;
return 1;
}
}
// here I do BFS to check whether the graph is connected or not, using neighbors
// BFS code...
return 1;
}
UPDATE: 的主要問題似乎是循環內內的的push_back調用。在這種情況下,這是大部分時間需要花費的部分。我應該使用reserve()來提高效率嗎?
即使我固定的位置,該算法的不同運行產生不同的鏈路配置,所以我不能預先計算。 BFS引入了額外的複雜性,但如果我想檢查圖形是否連接,則無法避免它。然而,通過使用代碼玩一下,似乎這兩個for循環佔用了大部分時間,原因是平均而言,如果圖形斷開連接,BFS可能會終止 – Bob 2011-04-15 07:41:46