正拓扑排序


45

假设我有一个有向无环图,其顶点具有实数权重。我想找到DAG的拓扑顺序,其中对于拓扑顺序的每个前缀,权重的总和为非负数。或者,如果您更喜欢顺序理论术语,则我有一个加权偏序,并且我想要一个线性扩展,这样每个前缀的权重都为非负数。对这个问题了解多少?在多项式时间内是NP完全的还是可解的?


4
在此图上尝试贪婪算法:1-> 2-> 3,1-> 4-> 5,顶点权重为1:+2、2:-2、3:+3、4:-1 ,5:-2。贪婪算法将从v1开始,然后选择v4,然后陷入困境。正确的顺序是v1,v2,v3,v4,v5。
罗宾·科塔里

2
“ JeffE和其他人一直在研究Frechet距离问题” –很好的抽象!为了其他人的利益,这里有一个版本:假设您得到了一个边缘加权的平面图G,以及两个顶点s和tn在外面。您想通过一系列基本移动将一个边界路径从s转换为t,再转换为另一边界路径。每次移动都会以其具有一些面边界的对称差异替换当前路径。我们能多快找到最小化进化路径最大长度的mve序列?
Jeffε

3
Tsuyoshi,对此感到抱歉,我试图在评论时添加换行符,这导致我的评论被切断。因此,您的想法是,您的手腕上绑有一根细绳,您想知道是否可以松开它。您的手腕以多边形网格表示,其网格是部分顺序的元素(顺序更接近字符串,顺序更接近末端)。单元的重量是其内部边界和外部边界之间的长度差。
David Eppstein 2010年

1
@David:谢谢您的解释。这次我可以理解它与当前问题的关系,这很有趣!
伊藤刚(Tsuyoshi Ito)2010年

3
一个不太有用但有趣的观察:该问题等效于具有截止日期和优先级约束的单机排序问题,其中每个作业的处理时间可能为负。对于非负处理时间,此问题在P中(Lawler和Mooer 1969 jstor.org/stable/2628367),并且如果存在解决方案,则存在与处理时间无关的解决方案。如果某些作业的处理时间为负数,这显然会中断。
伊藤刚(Tsuyoshi Ito)2010年

Answers:


18

这个问题似乎与最小化最大累积成本的序列化(Garey&Johnson中的问题[SS7])非常相似。以机智:

实例:Set 任务,偏序的Ť中,“成本” Ç ž每个Ť(如果Ç < 0,它可以被看作是一个“利润”),和一个恒定ķ žTTc(t)ZtTc(t)<0KZ

问:是否有一个处理器时间表牛逼的是服从优先约束,并且具有这样的性质,每个任务牛逼牛逼,所有任务的成本的总和牛逼'σ 牛逼'σ t 最多为KσTtTtσ(t)σ(t)K

我不确定问题是否保持NP完全时固定为0 G&J提及的是,问题仍然存在NP完全如果Ç { - 1 0 1 }的所有ŤKc(t){1,0,1}tT


7
看起来不错 然后,我觉得可以采取不失一般性,否则添加具有不受约束的工作Ç -值- ķ(或ķ的工作Ç -值- 1)。K=0c-ķķC-1个
daveagp 2010年

@mhum:我正在撰写有关相关结果的技术报告,并希望引用您。你能给我你的真实姓名吗?如果您愿意,可以通过电子邮件将其发送给我,或者只是保持匿名...
domotorp 2012年

9

好吧,我的回答是我的问题,从这个问题中可以发现,如果您可以在P中解决此问题,那么您还可以解决另一个未解决的问题: 正拓扑排序,取3

编辑:这个问题也被证明是NP完全的,所以如果您的DAG只有两个级别,即如果没有带两个边的定向路径,那么您的问题就已经是NP完全的了。


3

如果我对问题的理解正确,我认为可以将优先约束单机调度问题减至最小,以使完成时间的加权总和(1 | prec | \ sum wc)减少到您感兴趣的问题。在问题1 | prec | \ sum wc中,我们有n个作业,每个作业的权重和处理时间均为非负数,在作业上具有一定的坐姿,我们希望线性地扩展作业,以使作业完成时间的加权总和为最小化。即使我们假设每个作业的处理时间等于1,问题仍然是NP完全的。这有意义吗?


这绝对是一个有趣的可能性。但是,如何以使优化标准(最小化完成时间之和)转化为约束(非负前缀)的方式进行归约呢?
David Eppstein 2010年

我不知道调度问题的NP完全性结果,但是我认为它是指决定是否存在线性扩展以使工作完成时间的加权总和最多为K的决策问题,因此我不认为优化标准和约束之间的区别在这里很重要。但是,我还不了解如何在当前问题中表示对完成时间的加权总和的约束。
伊藤刚(Tsuyoshi Ito)2010年

我认为减少工作并不像开始时那样容易。我不确定我的答案了。
monaldo 2010年

我在先前的评论中刚刚发现一个错误。当我发布它时,我认为对未加权和表示约束很容易(因此强调了加权),但这是完全错误的。
伊藤刚(Tsuyoshi Ito)2010年

2

如果我们总是以最小的权重取最大的元素(按部分顺序)怎么办。耗尽元素后,我们以相反的顺序返回它们作为输出。


在逆转部分排序和取消所有权重的转换下,问题是不变的。因此,我看不出这与前向贪婪算法Robin K在评论中给出的反例有何不同。
David Eppstein 2010年

但是这种方法适用于他的示例:首先选择顶点5,然后选择顶点4,然后选择3、2,最后选择1。所以最终顺序将是1、2、3、4、5。实际上,我不知道认为很难证明这种方法有效。假设您有一个解决方案,在最后一个位置没有最小重量的最大元素(接收器)。然后,您可以找到另一个具有此属性的解决方案,只需将此类元素的位置更改为last,然后保留其余元素不变。通过对剩下的内容进行归纳,您将获得正式的证明。
丹尼尔·马丁

是的...它不起作用... 1-> 2-> 3,1-> 4分别具有权重4,-7,6,3。
丹尼尔·马丁

1

这个问题使我想起了很多决策树。我会考虑这种解决方案,它试图始终选择最有前途的途径,但是要看整个子图:

从接收器节点开始,朝着源的方向工作,一次一层。在执行此操作时,给每个边缘赋予权重。此权重应表示您必须“支付”的最低金额,否则您将通过从边缘指向的节点开始遍历子图来“获利”。假设我们处于i + 1级别,而我们正在上升至i级别。这就是我要为指向级别为i的节点的边缘分配权重的方法:

  1. edge_weight =指向节点的权重。
  2. 查找具有最大权重的,从“指向节点”开始的边。将此权重设为next_edge_weight。
  3. edge_weight + = next_edge_weight

然后,如下构建订单:

  1. 令S为搜索边界,即下一步要选择的节点集。
  2. 选择节点,以使(node_weight + maximum_edge_weight)最大化。
  3. 从图形和S中删除该节点。将节点的“子级”添加到S。
  4. 如果图形不为空,请转到步骤1。
  5. 停。

想法是先遍历那些子图,这些子图将首先获得尽可能多的收益,以便以后能够承担负权重子图的成本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.