[英]Boost Graph find neighbours of a group of vertices
我有一個undirected_unweighted_graph graph;
其定義如下:
typedef typename boost::adjacency_list<boost::vecS,boost::vecS,boost::undirectedS,boost::no_property,boost::no_property> undirected_unweighted_graph;
它有幾個頂點,通過無向邊互連。 在我的算法中,我正在搜索圖的連接子graph
,它只包含一些具有某些屬性的頂點。
我正在使用線性優化軟件包,它為我的問題提供了可能的最佳解決方案。 溶液由一組具有固定大小n個頂點的和可能是不可行的(即頂點沒有連接在對應的子圖graph
)。 我目前正在生成一個帶有解決方案頂點的新圖形,並添加了graph
中也存在的邊緣。 我正在使用boost::connected_components()
來計算連接的組件。
現在我來問我的問題:
對我而言,下一步是通過施加約束來提高生成解決方案的性能。 具體來說,我將“增長”一個解決方案,從單個節點開始,以n
節點的子圖結束。 在每個階段,通過添加其中一個鄰居來增加部分解決方案。 (這個想法是,如果部分解決方案可以擴展到完整解決方案,那么至少有一個鄰居將處於完整解決方案中。)如何識別這些鄰居?
我的方法如下:
我迭代每個組件,然后迭代boost::out_edges(v, g)
。 然后我必須檢查鄰居是否是我的組件的一部分。 如果它不是組件的一部分,我將它添加到組件鄰居組。 我想知道在boost中是否有任何方法可以迭代boost::out_edges(V, g)
以獲得頂點列表V
編輯
更具體一點:給定一個圖形,我能夠迭代給定頂點的鄰居,如下所示:
for (auto edge: boost::make_iterator_range(boost::out_edges(v, graph))) {
//do stuff
}
如果我有一個連通的組件,比如頂點std::vector<size_t> component
的向量,該怎么辦? 我想要的是組件的傳出邊緣,意味着頂點的所有傳出邊緣除了在component
兩個頂點之間的那些邊緣。 是否有一種優雅的方式來有效地獲得這些邊緣?
我不會迭代多個頂點。 相反,我會維護兩組頂點 - 一組包含當前部分解中的頂點,另一組包含與部分解相鄰(而不是)的頂點。 當線性優化包將頂點添加到局部解時,該頂點也應該從鄰接集移動到解決方案中的頂點集。 接下來,需要迭代來自新頂點的邊,但只需要迭代來自新頂點的邊。 對於與新單元相鄰的每個頂點,如果它不在部分解中,則將其添加到相鄰頂點集。
我也會嘗試類似的東西,只使用一個包含部分解決方案中的頂點和與部分解決方案相鄰的頂點。 減少開銷。 根據周圍代碼的期望,該集合可能與僅具有相鄰頂點的集合一樣有效。
這種方法的優點是可以消除重復性工作。 如果您已經查看了頂點A的所有鄰居,為什么還需要再次查看它們,因為頂點B已添加到您的集合中?
這種方法的一個缺點是,如果需要有時回溯,可能需要大量的內存開銷(考慮深度優先搜索並維護這些集合的堆棧)。 這有多糟糕取決於n
大小,平均來說,有多少邊連接到每個頂點。 即使在一個糟糕的情況下,一些聰明的冗余消除可能會挽救這種方法,但我會留待以后。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.