需要一些帮助来理解有关最大化图形连接性的问题

时间:2010-05-10 21:17:05

标签: algorithm language-agnostic math graph

我想知道是否有人可以帮我理解这个问题。我准备了一个小图,因为它更容易在视觉上解释它。

alt text http://img179.imageshack.us/img179/4315/pon.jpg

问题我想解决:

1。构建依赖图 给定图的连通性和确定节点依赖于另一个的程度的度量,请对依赖项进行排序。例如,我可以提出一些说法

  • 节点3依赖于节点4
  • 节点2依赖于节点3
  • 节点3依赖于节点5

但由于最终规则并非“有价值”(同样基于相同的指标),我不会将规则添加到我的系统中。

2。执行请求订单 构建依赖关系图后,按照最大化最终连接的顺序执行列表。我不确定这是否真的是一个问题,但我不知何故感觉可能存在多个订单,在这种情况下,需要选择最佳订单。

首先,我想知道我是否正确构建了问题,是否应该知道任何角落案例。其次,我能看到一个密切相关的算法吗?目前,我正在考虑像Feedback Arc SetSecretary Problem这样的东西,但我现在有点困惑。有什么建议吗?

PS:我自己对这个问题有点困惑,所以请不要为此惹火。如果需要任何澄清,我会尝试更新问题。

3 个答案:

答案 0 :(得分:2)

看起来您正在尝试确定在节点之间发送给具有依赖关系(或谷歌的“部分排序”)的节点的请求的排序。

如果你谷歌“部分顺序依赖图”,你会得到here的链接,这应该为你提供足够的信息来找出一个好的解决方案。

通常,您希望以节点跟随其依赖关系的方式对节点进行排序; AKA拓扑排序。

答案 1 :(得分:1)

我对您的订购限制与您描绘的图表有点混淆:没有任何匹配。也就是说,听起来你有软排序限制(A应该在B之前,但不是必须),违反约束的成本。 An optimal algorithm for scheduling that is NP-hard,但我敢打赌,你可以使用偏向于大重量边缘的DFS,然后删除所有后边缘来获得相当好的时间表。

答案 2 :(得分:1)

如果您事先知道每个节点的依赖关系,则可以轻松构建图层。

这很有意思,但在组织时我遇到了同样的问题...我的应用程序的不同模块的编译:)

这个想法很简单:

def buildLayers(nodes):
  layers = []
  n = nodes[:] # copy the list
  while not len(n) == 0:
    layer = _buildRec(layers, n)

    if len(layer) == 0: raise RuntimeError('Cyclic Dependency')

    for l in layer: n.remove(l)
    layers.append(layer)
  return layers

def _buildRec(layers, nodes):
  """Build the next layer by selecting nodes whose dependencies
     already appear in `layers`
  """
  result = []
  for n in nodes:
    if n.dependencies in flatten(layers): result.append(n) # not truly python
  return result

然后,您可以一次弹出一个图层,每次您都能够将请求并行发送到该图层的每个节点。

如果保留一组已选择的节点,并且依赖关系也表示为集合,则检查更有效。其他实现将使用事件传播来避免所有那些嵌套循环......

请注意,在最坏的情况下,你有O(n 3 ),但我只有30个组件并且没有那么相关:p