是否有一种优化“制造商的时间表”的调度算法?

时间:2010-04-20 17:23:01

标签: algorithm scheduling

您可能熟悉Paul Graham的文章 "Maker's Schedule, Manager's Schedule" 。文章的关键在于,对于创意和技术专业人士来说,会议是对生产力的诅咒,因为他们倾向于导致“计划碎片化”,将自由时间分解成太小而无法获得解决困难问题所需的焦点的块。

在我的公司,我们通过最大限度地减少造成的破坏数量看到了显着的好处,但我们用来决定时间表的蛮力算法并不够复杂,无法很好地处理大群人。 (*)

我正在寻找的是,在一群 N 制造商和管理者中,是否有任何众所周知的算法可以最大限度地减少这种生产力中断。

在我们的模型中,

  • N 人。
  • 每个人 p i 制造商 Mk )或经理 Mg )。
  • 每个人都有一个时间表 s i
  • 每个人的日程安排 H 小时。
  • 时间表由一系列非重叠区间组成 s i = [ h 1 ,. .., h j ]。
  • 间隔为免费。两个相邻的自由间隔相当于跨越两者的单个自由间隔。
  • 每个人的生产力 P 是0到1之间的值。
    • 当空闲间隔的数量最小化时,制造商的生产力最大化。
    • 制造商的生产力等于1 /(最大[1,空闲间隔数])。
    • 当空闲时间的总长度最大化时,经理的工作效率最大化,但他们喜欢会议之间的长时间而不是短暂休息。
    • 经理的生产力等于每个自由区间长度的平方和作为一天的比例。也就是说,( h 1 / s i 2 +( h 2 < / sub> / s i 2 + ...,其中每个间隔是一个空闲间隔。
  • 目标:最大限度地提高团队的总体工作效率。

请注意,如果没有会议,制造商和经理都会体验到最佳的生产力。如果必须安排会议,那么制造商更喜欢会议背靠背,而管理人员并不关心会议的进展。请注意,因为所有中断都被视为对制造商同样有害,所以持续1秒的会议与持续3小时的会议之间没有区别,如果它划分可用的空闲时间。

问题是决定如何安排 M 涉及任意数量的 N 人的不同会议,其中特定会议中的每个人都必须放置进入其计划的时间间隔,使其不与任何其他 busy 间隔重叠。对于每次会议 M t busy 间隔的开始时间对于所有各方必须相同。

是否存在解决此问题或类似问题的算法?我的第一个想法是,这看起来非常类似于碎片整理(最小化不同块的数量),并且有很多算法。但碎片整理与调度没有多大关系。想法?


(*)实际上这并不是一个真正的问题,因为我们很少同时与超过5人会面,所以可能性很小。

4 个答案:

答案 0 :(得分:11)

通过使用遗传算法可以得到很好的近似值。

编写一个函数来创建1000个样本随机计划,随机分配制造商和经理。

编写另一个功能(适应性功能),将缺陷分配给有问题的时间表(人们在同一时间工作,没有足够的制造者,没有足够的经理,有人工作不够,有人工作太多)。

foreach schedule assign calculate fitness keeping a reference to the lowest scoring (best) schedule.

while (best schedule > minimum fitness value)
    foreach schedule s in population of schedules
        foreach time slot
           if (random < .5)
               choose value from best schedule
           else
               choose value from schedule s
           end if
       end foreach
       score schedule s with fitness function
    end foreach
end while

虽然这种方法不会产生最佳时间表,但有可能找到当地最小值。它将始终生成一个计划,您可以随时为健身功能添加更多约束,以适应您不希望看到的任何情况。这种类型的算法可以处理许多不同类型的约束满足问题。

我个人使用类似的算法在我的笔记本电脑上用大约两个小时安排我的Wifes Co-Op幼儿园全年。

答案 1 :(得分:1)

这个问题看起来很难成为NP,但我认为它承认了一些不错的近似值。

特别是,我认为你可以通过会议规模优化来合理地管理,在那里你可以最佳地安排最大的会议(就必须参加的制作人数而言,因为他们是那些你试图不要破坏的东西,然后在较小的会议上连续这样做。为了在相同长度的小型会议中打破联系,您可以通过要求参与的制造商的会议负荷来加权会议(这样您将有机会优化他们而不会让他们的生活变得更糟)。 / p>

现在,您已经解决了问题以安排单个会议,因为任何已安排的会议实际上只会将一个人的日程安排缩短。解决方案非常简单:最佳解决方案是与制造商的最大计划边数对齐的解决方案,以便每个人都可以花时间。你应该能够解决这个问题,即使是O((k+g)*k*n)之类的蛮力,其中k是制造商数量,g经理人数,n典型制造商时间表中的间隔数。

唯一的问题是如果这种直截了当的做法会导致会议无法满足。在这种情况下,您可以通过一个或多个插槽提升该会议的优先级,然后重试。

答案 2 :(得分:0)

试着看看模拟退火。它类似于Jeremy E描述的遗传算法,但不是随机生成您的起始时间表,而是从一些有效但非最佳的时间表开始。这个想法是通过在一些会议时间内随机抽签,然后在迭代之前测试适应性来生成原始时间表的一些“邻居”。

S' = Starting Schedule
S = S'    
while( Fitness( S ) < Minimum Fitness ) 
{
    NS = Neighbor( S )
    if( Fitness( NS ) > Fitness( F ) )
    {
         S = NS
    }
}
Return( S )

您可以指定一定数量的迭代,而不是针对某些最小适应度进行测试,这样您就可以确定地判断程序何时完成执行。

关于这个算法的事情是最终结果往往看起来像起始状态,所以如果你想在一天的早些时候说一个大型会议(就制造商的规模而言),你可以这样做。

答案 3 :(得分:-1)

我记得用A *搜索算法实现了与你的问题非常相似的东西。您将很容易找到可用算法的几种实现方式,但为了将其应用于调度问题,您必须根据模型构建距离和启发式函数,并将连续时间分成块。