Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 贪婪算法:区间着色_Algorithm_Greedy_Graph Coloring - Fatal编程技术网

Algorithm 贪婪算法:区间着色

Algorithm 贪婪算法:区间着色,algorithm,greedy,graph-coloring,Algorithm,Greedy,Graph Coloring,在区间调度中,算法是选取最早的完成时间。但在间歇着色中,前者不起作用。有没有关于为什么选择最早完成时间不适用于间隔着色的示例或解释 间隔着色问题是:
鉴于
 A.
设置
属于
间隔,
 我们
希望
到
颜色 全部的
 间隔
 所以
那个
间隔
 鉴于
 这个
 相同的
 颜色
 做
不
横断
 及
这个
目标
 是
到
尝试
到
 减少
这个
数
属于
颜色
用过。这可以被认为是区间划分问题(如果它更有意义的话) 我所指的时间间隔安排问题是:如果你去主题公园,有很多节目,每个节目的开始和结束时间

在区间调度中,算法是选取最早的完成时间。但在间歇着色中,前者不起作用。有没有关于为什么选择最早完成时间不适用于间隔着色的示例或解释

间隔着色问题是:
鉴于
 A.
设置
属于
间隔,
 我们
希望
到
颜色 全部的
 间隔
 所以
那个
间隔
 鉴于
 这个
 相同的
 颜色
 做
不
横断
 及
这个
目标
 是
到
尝试
到
 减少
这个
数
属于
颜色
用过。这可以被认为是区间划分问题(如果它更有意义的话)


我所指的时间间隔安排问题是:如果你去主题公园,有很多节目,每个节目的开始和结束时间都是一个时间间隔,你就是资源。你想参加尽可能多的演出。

这只是一个玩弄图片的例子,直到你找到一个例子。我绘制的第一张图片显示问题有以下分区:

A: (0, 2) (3, 7)
B: (1, 4) (5, 6)
--   -
 ---
   ----
如下图所示:

-- ----
 --- -
但查找最早停止时间规则会产生以下颜色:

A: (0, 2) (5, 6)
B: (1, 4)
C: (3, 7)
这是哪个分区:

A: (0, 2) (3, 7)
B: (1, 4) (5, 6)
--   -
 ---
   ----

所以这个贪婪规则在这个例子中并不是最优的。

如果你只需要一个着色贪婪算法的反例,@btilly已经提供了一个

我试图给出理由,让它更直观

首先,对于调度问题,您确实可以证明贪婪算法是有效的。这个想法是这样的:

-- ----
 --- -
如果我不选择最早结束时间的节目,我就无法获得更好的结果,让我们看看

如果有两个间隔A、B,且A的完成时间较早,则B为

  • 开始时间晚于A的完成时间,那么根本没有冲突,为什么两者都不冲突呢
  • 开始时间早于A的结束时间,存在冲突,我只能选择A或B,但是,A结束得更早,这会给以后选择更多节目的机会更高,不是吗
  • 然而,对于着色问题,它完全是另一类问题

    您必须选择所有间隔,而问题的答案是所有时间内冲突间隔的最大值

    试着这样想:一直以来,最多有5门考试同时进行,你至少要使用5间教室(颜色),对吗

    所以我们无法找到这与选择最早的完成时间,时间没有告诉你什么

    它可以帮助您决定是否选择此时间间隔(如在调度问题中),但不能告诉您所需的最小资源。它们只是不同类别的问题

    编辑:

    在重读OP的问题之后,这里是我所知道的关于着色问题的更多细节

    定义
    深度
    始终为冲突的最大值。逻辑上我们知道深度是下界,但我们必须证明它也是上界(通过矛盾)

    证明

    证明需要按开始时间升序排序间隔,或按结束时间降序排序间隔,如下所示:

    假设间隔集的
    深度
    d
    ,且答案大于
    d
    。让
    x
    成为我们使用资源
    d+1
    处理的第一个时间间隔, 由于处理顺序按开始时间升序排序,这意味着至少有
    d
    间隔在
    x
    之前开始,并且与x冲突,那么集合的
    深度
    至少是
    d+1
    ,矛盾。所以
    d
    =
    depth
    也是答案的上界,它是区间着色的最佳答案

    请注意,如果按开始时间递减或完成时间递增排序,则不能使用相同的推理

    概念/目标

    现在我们知道深度是答案,我们必须找到它。从概念上讲,无论您使用开始时间还是结束时间、升序还是降序,所有选项都可以为您提供间隔集的深度

    实施考虑

    然而,对于实现,如果必须在O(nlgn)中找到它,则必须使用贪婪方法+一些数据结构,这可能需要区间具有某种排序。但这是另一个故事,它是为了实现,从概念上讲,这并不重要,你只想找到间隔集的深度

    TL;博士


    对于区间调度问题,贪婪方法本身已经是最优策略;而对于区间着色问题,贪婪方法只能帮助证明深度是答案,并且可以在实现中使用它来查找深度(但不是以@btilly的反例所示的方式)

    实际上,您可能看到的算法版本在完成时间内可能无法对输入进行排序。这里的关键点是,在算法中,当多个颜色可用时,规则是任意分配。上面的反例说明了这一点

    如果要使用完成时间的顺序,则需要对算法进行一次更改。让我们假设对于每个现有的颜色i,在由i着色的所有间隔中,最大的完成时间是F_i。然后,当多个颜色可用时,规则是使用具有最大F_i的可用颜色对间隔进行着色

    如果进行此更改,则该算法适用于完成时间内的订单。我运行模拟,并为此编写了正式的证明

    直觉很简单,因为排序是按完成时间进行的,即您分配的当前间隔,您不希望占用太多资源。虽然可能有两种颜色可用,但您希望使用“价格较低”的颜色,以便为下一个间隔节省空间,下一个间隔可能在当前间隔之前开始,并且