簡體   English   中英

子圖選擇算法問題(動態規划或 NP)

[英]Sub-graph Selection Algorithm Problem (Dynamic Programming or NP)

我們手頭有一個算法問題,請您寫下您對此的想法,謝謝!

有 N 多個節點有 K 個不同的 colors。 有些節點彼此之間有直接連接,有些則沒有。 我們想從這 N 個節點中找到 select M 個節點,但是這 M 個節點必須是連接的。 此外,我們選擇的 M 個節點組必須具有最少數量的不同顏色的鄰居。 可能有不止一個最佳組合,找到其中任何一個都是目標。

例如,我們選擇了 M 個節點,這些 M 個節點總共有以下鄰居:5 個紅色,3 個藍色,1 個綠色。 在這種情況下,我們計算唯一的 colors,因此在這種情況下,不同顏色的鄰居的數量是 3。我們希望通過選擇 M 個節點的最佳可能組合來最小化這個數量。

圖形可視化示例:

圖形

在此示例中,假設 M = 4,則節點的最佳可能組合將是 {9, 10, 11, 12},因為該組只有一個黃色鄰居。 如果我們選擇{0, 1, 3, 5},這個組合的鄰居是{2, 4, 6},由2個紅色鄰居和1個綠色鄰居組成; 由於我們尋找不同數量的彩色鄰居,因此得分為 2。

這個算法問題是 NP 完全的嗎? 我們應該如何着手? 如果這不是 NP 完全的,我們可以用來解決這個問題的最佳算法是什么? 我們可以結合圖算法,如 Prim、Kruskal、Floyd Warshall 或遍歷算法嗎?

子圖 { 4 3 5 6 } 也是有一個紅色鄰居的好答案。

我發現這個子圖運行了一個叫做 subs 的小程序。

C:\Users\James\code\subs>subs
l 0 1 1
l 0 6 1
l 0 5 1
l 0 2 1
l 2 7 1
l 3 5 1
l 3 4 1
l 4 6 1
l 4 5 1
l 7 8 1
l 8 9 1
l 9 10 1
l 9 11 1
l 9 12 1
l 11 12 1
n 0 yellow
n 1 red
n 2 green
n 3 yellow
n 4 red
n 5 green
n 6 red
n 7 blue
n 8 yellow
n 9 red
n 10 yellow
n 11 red
n 12 green
<-cPathFinder::read
n1 n0 n6 n5  colors 3
n1 n0 n6 n2  colors 3
n1 n0 n6 n4  colors 2
n1 n0 n5 n2  colors 3
n1 n0 n5 n3  colors 2
n1 n0 n5 n4  colors 3
n1 n0 n2 n7  colors 3
n0 n6 n5 n2  colors 3
n0 n6 n5 n3  colors 2
n0 n6 n5 n4  colors 3
n0 n6 n2 n7  colors 3
n0 n6 n2 n4  colors 4
n0 n6 n3 n4  colors 2
n0 n5 n2 n7  colors 2
n0 n5 n2 n3  colors 2
n0 n5 n2 n4  colors 3
n0 n5 n3 n4  colors 2
n0 n2 n7 n8  colors 2
n6 n5 n3 n4  colors 1
n2 n7 n8 n9  colors 3
n7 n8 n9 n10  colors 2
n7 n8 n9 n11  colors 2
n7 n8 n9 n12  colors 3
n8 n9 n10 n11  colors 2
n8 n9 n10 n12  colors 2
n8 n9 n11 n12  colors 2
n9 n10 n11 n12  colors 1
n0 n6 n5 n2  colors 3
n0 n6 n5 n3  colors 2
n0 n6 n5 n4  colors 3
n0 n6 n2 n7  colors 3
n0 n6 n2 n4  colors 4
n0 n6 n3 n4  colors 2
n0 n5 n2 n7  colors 2
n0 n5 n2 n3  colors 2
n0 n5 n2 n4  colors 3
n0 n5 n3 n4  colors 2
n0 n2 n7 n8  colors 2
n6 n5 n3 n4  colors 1
n2 n7 n8 n9  colors 3
n7 n8 n9 n10  colors 2
n7 n8 n9 n11  colors 2
n7 n8 n9 n12  colors 3
n8 n9 n10 n11  colors 2
n8 n9 n10 n12  colors 2
n8 n9 n11 n12  colors 2
n9 n10 n11 n12  colors 1
n6 n5 n3 n4  colors 1
n2 n7 n8 n9  colors 3
n7 n8 n9 n10  colors 2
n7 n8 n9 n11  colors 2
n7 n8 n9 n12  colors 3
n8 n9 n10 n11  colors 2
n8 n9 n10 n12  colors 2
n8 n9 n11 n12  colors 2
n9 n10 n11 n12  colors 1
n2 n7 n8 n9  colors 3
n7 n8 n9 n10  colors 2
n7 n8 n9 n11  colors 2
n7 n8 n9 n12  colors 3
n8 n9 n10 n11  colors 2
n8 n9 n10 n12  colors 2
n8 n9 n11 n12  colors 2
n9 n10 n11 n12  colors 1
n2 n7 n8 n9  colors 3
n7 n8 n9 n10  colors 2
n7 n8 n9 n11  colors 2
n7 n8 n9 n12  colors 3
n8 n9 n10 n11  colors 2
n8 n9 n10 n12  colors 2
n8 n9 n11 n12  colors 2
n9 n10 n11 n12  colors 1
n7 n8 n9 n10  colors 2
n7 n8 n9 n11  colors 2
n7 n8 n9 n12  colors 3
n8 n9 n10 n11  colors 2
n8 n9 n10 n12  colors 2
n8 n9 n11 n12  colors 2
n9 n10 n11 n12  colors 1
n8 n9 n10 n11  colors 2
n8 n9 n10 n12  colors 2
n8 n9 n11 n12  colors 2
n9 n10 n11 n12  colors 1
n8 n9 n10 n11  colors 2
n8 n9 n10 n12  colors 2
n8 n9 n11 n12  colors 2
n9 n10 n11 n12  colors 1
n8 n9 n10 n11  colors 2
n8 n9 n10 n12  colors 2
n8 n9 n11 n12  colors 2
n9 n10 n11 n12  colors 1
n9 n10 n11 n12  colors 1

subgraph n6, n5, n3, n4,   has 1 differently colored neighbours

潛艇沒有什么聰明的。 它生成子圖並通過它們搜索具有最少唯一顏色鄰居的連接子圖。 有很多嵌套循環,所以當有數千個節點時它不會做得很好。

代碼位於https://gist.github.com/JamesBremner/5a3965cc725c54dcaabd4beb44f9104f

我想到了一個優化,如果 go 對處理大圖有很長的路要走。 假設整個圖是連通的(每個節點都可以從其他節點到達),那么每個子圖必須至少有一個鄰居(否則子圖中的節點無法到達子圖外的節點)。 因此,唯一顏色鄰居的最佳可能數量是 1 且不少於。 因此,一旦找到具有唯一顏色鄰居的第一個子圖,該算法就可以停止,因為不存在更好的結果。

如果這是一個 NP 問題,您可以使用ASP來解決它。 給定instance.lp

color(0,yellow).
color(3,yellow).
color(8,yellow).
color(10,yellow).
color(2,green).
color(5,green).
color(12,green).
color(7,blue).
color(1,red).
color(4,red).
color(6,red).
color(9,red).
color(11,red).

edge(0,5).
edge(0,1).
edge(0,2).
edge(0,6).
edge(5,3).
edge(5,4).
edge(6,4).
edge(3,4).
edge(2,7).
edge(7,8).
edge(8,9).
edge(5,3).
edge(9,10).
edge(9,11).
edge(9,12).
edge(11,12).

edge(B,A) :- edge(A,B).

encoding.lp

node(X) :- color(X,_).

%select exactly one start node
1 {start(X) : node(X)} 1.

% start node is in sub graph
sub(X) :- start(X).
% for any node in the sub graph you can add any connected node
{sub(Y) : edge(X,Y)} :- sub(X).

% it is wrong if we do not have exactly m nodes in the sub graph
:- not m = #sum {1,X: sub(X)}.

#minimize {1,C : sub(X), edge(X,Y), not sub(Y), color(Y,C)}.

#show sub/1.

調用clingo encoding.lp instance.lp --const m=4為您提供最佳解決方案:

sub(3) sub(5) sub(4) sub(6)

調用clingo encoding.lp instance.lp --const m=4 --opt-mode=optN --project為您提供所有最佳解決方案。 這些工具可以在https://potassco.org/找到

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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