我有一大堆类似的东西(称之为小部件),我需要选择它们的一个子集。小部件可以与其他小部件冲突,并且可以“比较”[1]以查看解决冲突的“更好”。我想选择包含尽可能多的非冲突小部件的最佳子集。
我希望我的选择是健壮且确定性 - 如果我添加一些与其他许多人不相关的不相关的小部件,我不希望这些改变结果相比如果他们没有被包括在内 - 这就是我的意思,找到“确定性最佳”子集,一个独特的子集,或者每次出现一组相等的子集时最坏的相同。
我的实现看起来像这样:
Build a graph of widgets, where edges are conflicts between widgets.
While there are edges in the conflict graph:
Make a list of the edges in the conflict graph, sorted so that the most
conflicted widgets are at the front of the list.
Pick the first edge in the list, compare the two, delete the loser. (note:
this step includes tidying up the graph, which is why we need to refresh
the list of conflict edges)
Make a list, possibles, of deleted widgets that don't conflict with any in the
final set.
Call this procedure recursively on possibles in case they're conflicted with
each other.
Add back the return values from the recursive call, and return the subset.
(不要过多担心递归 - 它永远不会超过一个递归调用,因为在我的情况下,可能的子集很小。)
不幸的是,这个算法不能满足我对输入集的一些高度冲突的补充的影响!我认为这是因为我偏向于首先查看最不相关的小部件的过程,这些对于冲突图中哪些边缘留下了连锁效应。我首先删除它们的目的是尽快消除它们的影响 - 似乎这是误入歧途。
大概这个问题类似于已解决的问题 - 如果有的话,如果有人能告诉我哪一个,并且(甚至更好)简要解释他们的参考文献中的任何术语,我将不胜感激!
如果没有(或者我的解释太模糊),请让我知道要阅读的CS文献的哪些部分。
[1]比较是排序 - 适合排序(即,如果w1> w2和w2> w3,那么我们免费知道w1> w3。)但是评估一个子集整体的“适应性”不起作用,因为没有明智的方法来比较(w1,w2,w3)和(w1,w2,w4,w5)。
答案 0 :(得分:3)
这是一个NP完全问题,称为“加权独立集”问题。我不确定“确定性”是什么意思,但一个简单的定义可能是“如果向输入集添加小部件导致输出集的更改,则输出中至少包含一个添加的小部件设置“ - 也就是说,新的小部件可以通过看起来有吸引力来改变输出,但是它们不能搞砸图形中不相关部分的内容。
一个简单的近似,它满足于贪婪地识别最大分数小部件,将其添加到输出集,然后删除所有冲突的小部件。重复,直到没有未选中的小部件。不过,我不确定这是否给出了合适的近似保证。