簡體   English   中英

SciPy-從有向圖導出的約束最小化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM