[英]SciPy - Constrained Minimization derived from a Directed Graph
我正在尋找以下圖形問題的解決方案,以便在Python中執行圖形分析。
基本上,我有N個節點的有向圖,我知道以下幾點:
表示為加權鄰接矩陣,我知道列總和和行總和,但不知道邊緣本身的值。 我已經意識到,沒有唯一的解決方案可以解決這個問題(鑒於上述情況,沒有人能證明這一點嗎?)。 但是,我希望至少能找到一個解決方案 ,使邊緣權重的總和最小或使邊緣權重為0或沿這些線的東西最大化(基本上,從無限選擇中,我會像最“簡單”的圖表)。
我已經考慮過將其表示為:
每個節點的最小總和(所有邊緣權重)st,其邊緣權重的總和等於這些總和的已知總和,其邊緣權重的總和等於這些總和的已知總和。 此外,進行約束以使所有權重均> = 0
我主要將其用於Scipy和Numpy中的數據分析。 但是,使用它們的約束最小化技術,我將得到來自邊緣權重和部分的大約2N ^ 2-2N約束,以及來自正部分的N個約束。 我擔心這對於大數據集將不可行。 我最多可以有500個節點。 使用SciPy的fmin_cobyla,這是否可行? 有沒有另一種方法可以解決這個問題/在Python中使用另一個更有效的求解器?
非常感謝! 關於StackOverflow的第一篇文章。
禁止自流使該問題的某些實例不可行(例如,一個節點的流入和流出流量為1)。 否則,總能找到一個稀疏的解決方案,該解決方案最多具有一個自流。 初始化兩個隊列,一個用於從最低ID到最高的正流出的節點,另一個用於從最高ID到最低的正流入的節點的隊列。 將流量從第一個隊列的前端節點添加到第二個隊列的前端節點,其數量等於前者的流出量和后者的流入量的最小值。 將流出和流入更新為它們的殘值,並從其隊列中刪除耗盡的節點。 由於第一個隊列的前端的ID增加,而第二個隊列的前端的ID減少,因此,自流的唯一節點是ID編號交叉的節點。
使總流量最小化是微不足道的; 它是恆定的。 找到最簡單的解決方案是NP難的。 子集總和減少了,其中被求和的每個元素都有一個具有該流出量的源節點,另外兩個接收器節點都有流入,其中一個等於目標總和。 當且僅當沒有源流向兩個接收器時,子集和實例才可解。 上面的算法是2近似值。
要稀疏地擺脫那個壞節點上的自流:反復獲取不涉及壞節點的流,並通過壞節點將其分成兩部分。 當我們耗盡自流時停下來。 僅當沒有剩余的不使用壞節點的流且仍然存在自流時,此操作才會失敗,在這種情況下,壞節點的流入和流出總和大於總流量,這是必要的解決方案存在的條件。 該算法的稀疏度為4近似值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.