考虑以下问题:给定有限集列表,找到最小化的顺序。
是否有已知的算法?它的复杂性是什么?我还没有想到一种有效的最佳算法,但是在NP-Hard中也不是很明显。
考虑以下问题:给定有限集列表,找到最小化的顺序。
是否有已知的算法?它的复杂性是什么?我还没有想到一种有效的最佳算法,但是在NP-Hard中也不是很明显。
Answers:
此问题实际上与称为“优先约束调度以最小化加权完成时间”的调度问题有关。问题如下:给定一组作业,其中每个作业都有一个处理时间(p)和权重(w),并且在这些作业上定义了一个优先级图。目标是在单台计算机(非抢占式)中调度作业,以便优先级约束得以确定,加权完成时间的总和得以最小化。问题是NP困难的,并且2近似是已知的。
从最小累积总和问题简化为优先约束调度问题:对于每个元素,创建一个作业,其p = 1,w =0。同样,对于每个集合,创建一个作业,其p = 0,w =1。创建优先级图,使得如果元素,然后ē之前一定要安排小号。我认为调度问题的这种特殊情况也是NP难题。
请参阅以下链接,
Shalmoli Gupta已经解释了一般问题是NP-Hard,因此我决定研究是否有特殊情况是多项式可解的。最终,我找到了解决代表树的集合的特殊情况的解决方案,或更笼统地说,是通过子集包含而所有不可比集不相交的一系列并行顺序。
一种使事情变得容易的属性是,如果集合列表在交点下关闭。如果,然后,存在一个最优的排序,其中š 1来之前š 2。我们可以假设WLOG最佳排序是子集包含所给出的部分顺序的线性扩展。
由于集合的所有子集均按顺序出现在其前面,因此这意味着给定集合添加到运行总和的金额是固定的,无论出现在何处。如果是集列表,然后一组的增量成本是元素s中不属于S的任何子集出现在数小号。如果同一集合在S中出现多次,我们可以任意选择一个集合,让其他集合的值为0。
这意味着该问题等同于具有优先约束的单机调度中的最小加权完成时间。在这个问题中,给定一组权重为和时间为t j的作业,并对这些作业P进行部分排序,我们希望找到一个使加权总完成时间最小化的作业排序。
受优先约束。可以通过为每个集合创建一个作业来解决交集闭合集的最小累积集问题,其中每个作业的权重为1,时间等于上面定义的增量成本,P是子集包含给出的顺序。
事实证明,对于一般,这个问题也是NP-Hard 。但是,某些特殊形式的P可以在多项式时间内求解。
本文针对并行并行阶数P的情况(其中也包括树的重要情况)给出了算法。不幸的是,我无法访问该论文,因此我决定尝试独立地对其进行重新发明。这是我想出的。
为了解决该问题,需要一些观察。
首先,在没有任何优先约束的情况下,最佳解决方案是按t j递增的顺序对作业进行简单排序。为简单起见,我将其称为作业的值,缩写为v(j)。请注意,由于排序为O(nlogn),因此不可能做得比此复杂度更好。
规则1设和b是作业,使得一个< b ∈ P和b盖一个。如果v (a )< v (b ),那么我们可以删除约束a < b而不影响最佳排序或目标值。
假设在松弛问题的最佳排序中出现在a之前。由于b最初覆盖了a,这意味着在新顺序中b和a之间的所有作业都无法与a和b相提并论。但是由于b的值比a高,因此可以通过交换b和a来降低目标值。
同样,在的情况下,只要确保在按值排序之后,我们通过咨询原始(简化)问题的优先关系来打破联系,就可以删除约束。这确保了针对松弛问题找到的最优解也是对原始问题的最优解。
因此,每当B叠一个和,我们可以通过丢弃约束简化问题一< b。
规则2假设我们知道在最优解中b紧随a之后。我们可以将a和b合并到且t c = t a + t b的新节点c中,同时适当地收缩位姿P。
新问题的最佳目标值与原始目标值(具体为)存在一个常数差异,但是该常数不依赖于排序,因此,最佳排序不受影响。我们可以通过采取新的问题的最佳解决方案和更换恢复的最佳解决老问题Ç用一个b。
规则3假设在对问题实例的最佳解决方案中,紧接b且v (a )> v (b )之前。现在,假设我们创建了一个更大的问题实例,并添加了新的作业,该作业具有与原始对象串联或并联组成的新姿势。对于较大的问题,总是存在a紧接b之前的最佳解决方案。
假设否则。让最优解包含。由于P是由串联平行组合形成的,因此我们知道所有x i均与a和b无可比拟。使用规则2将所有x i节点合并到新节点x '中。现在考虑v (x ')。如果v (X ')≤ v (一)那么,我们可以交换和 a而不增加目标值。同样地,如果 v (X ')≥ v (b ),我们可以交换 X '和 b。因此, v (a )< v (x ')< v (b )。但是 v (a )> v (b )是一个矛盾。
使用规则2和规则3,我们已经可以获得简单但次优的算法。由于P是系列并行顺序,因此假设输入包含P的树表示,其中每个节点表示系列组成或并行组成,并且叶子是单独的作业。通过保持不变,即对每个子问题的最优解决方案都是价值递增的链,我们可以找到具有树的预遍历的最优解决方案。
假设是具有姿势P 1和P 2的子问题的级数组成。令最优解为C 1和C 2的阶数。P的最佳解决方案显然是这些链的串联。但是,C 2中的第一个作业可能比C 1中的最后一个作业的值低。为了保持解为排序链的不变性,我们使用规则3 +规则2合并端点,只要它们不处于排序顺序即可。
如果相反地是一个平行组成,我们只需将排序后的链S 1和S 2合并成一个新的排序后的链。由于不变量,这是有效的。
不幸的是,该算法为。为了获得O (n l o g n )算法,我们需要使用规则1延迟计算链。
具体来说,如果子问题仅包含优先约束与值顺序相同的节点,则我们可以完全忘记优先约束而仅查看值。这是由相同的不变性来确保的,该不变性确保了解决方案在先前算法中被排序为链。
我们没有为每个子问题计算一个排序的链,而是以一对Fibonacci堆,一个最小堆和一个最大堆来表示一个子问题的最佳解决方案,这两个堆都包含子问题中的所有作业。这意味着我们可以在对数时间内弹出求解的最小或最大元素。
和以前一样,我们进行预遍历。其中是级数组合,我们检查第一个堆对的最大作业和第二个堆对的最小作业。如果它们的值不规则,则将其弹出并使用规则2和3合并它们。然后,将新创建的作业与新端点进行比较,并在它们不规则时继续弹出和合并。一旦端点不再具有乱序值,我们就可以安全地忘记规则1带来的序列优先级限制。然后,我们将新创建的作业(如果有的话)推送到堆上,然后合并堆以创建表示解决方案的堆对到P本身。
对于并行组合,我们只需合并堆对。新的最小堆是每个子问题的最小堆以及最大堆的合并。请注意,斐波那契堆可以在固定时间内合并。
一旦有了代表整个问题的解决方案的堆对,我们就可以弹出最小堆直到其为空,从而找到实际的解决方案顺序。之后,我们撤消所有的规则2替换,以得到原始问题的解决方案。