子图选择算法问题动态规划或NP

问题描述

我们手头有一个算法问题,请您写下您对此的想法,谢谢!

有 K 个不同颜色的 N 个节点。有些节点彼此之间有直接连接,有些则没有。 我们想从这N个节点中选择M个节点,但是这M个节点必须是连通的。此外,我们选择的 M 个节点组必须具有最少数量的不同颜色的邻居。可能存在多个最佳组合,找到其中任何一个都是目标。

例如,我们选择了 M 个节点,这 M 个节点总共有以下邻居:5 个红色、3 个蓝色、1 个绿色。在这种情况下,我们计算独特的颜色,因此在这种情况下,不同颜色邻居的数量是 3。我们希望通过选择 M 个节点的最佳组合来最小化这个数量

图形可视化示例:

graph

在这个例子中,我们假设 M = 4,那么最好的节点组合将是 {9,10,11,12} 因为这个组只有一个邻居是黄色的。 如果我们选择{0,1,3,5},这个组合的邻居为{2,4,6},由2个红色邻居和1个绿色邻居组成;由于我们寻找不同数量的有色邻居,因此得分为 2。

这个算法问题是 NP-complete 吗?我们应该如何进行?如果这不是 NP 完全的,那么我们可以用来解决这个问题的最佳算法是什么? 我们能否结合使用图算法,例如 Prim、Kruskal、Floyd Warshall 或遍历算法?

解决方法

如果这是一个 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/

找到这些工具