Algorithm 是否有一种调度算法可以优化;制造商';s附表;?

Algorithm 是否有一种调度算法可以优化;制造商';s附表;?,algorithm,scheduling,Algorithm,Scheduling,你可能熟悉保罗·格雷厄姆的文章,。这篇文章的关键是,对于创意和技术专业人士来说,会议是对生产力的诅咒,因为会议往往会导致“日程分散”,将空闲时间分成小块,太小,无法集中精力解决难题 在我的公司里,我们已经看到最大限度地减少造成的中断带来了巨大的好处,但我们用来确定日程安排的蛮力算法不够复杂,无法很好地处理大群体的日程安排。(*) 我要寻找的是,在N家制造商和管理者中,是否有任何著名的算法可以最大限度地减少这种生产力中断 在我们的模型中 有N个人 每个人都是制造者(Mk)或管理者(Mg) 每个人

你可能熟悉保罗·格雷厄姆的文章,。这篇文章的关键是,对于创意和技术专业人士来说,会议是对生产力的诅咒,因为会议往往会导致“日程分散”,将空闲时间分成小块,太小,无法集中精力解决难题

在我的公司里,我们已经看到最大限度地减少造成的中断带来了巨大的好处,但我们用来确定日程安排的蛮力算法不够复杂,无法很好地处理大群体的日程安排。(*)

我要寻找的是,在N家制造商和管理者中,是否有任何著名的算法可以最大限度地减少这种生产力中断

在我们的模型中

  • 有N个人
  • 每个人都是制造者(Mk)或管理者(Mg)
  • 每个人都有一个时间表
  • 每个人的日程都是H小时
  • 时间表由一系列不重叠的间隔si=[h1,…,hj]组成
  • 间隔时间不是空闲就是忙碌。两个相邻的自由区间相当于跨越两个区间的单个自由区间
  • 每个人的生产率P是一个介于0和1之间的值。
    • 当自由时间间隔的数量最小化时,制造商的生产率最大化
    • 制造商的生产率等于1/(最大值[1,自由间隔数])
    • 当空闲时间的总长度最大化时,经理的工作效率最大化,但他们更喜欢会议之间的长时间休息,而不是短暂休息
    • 经理的生产率等于每个自由时间间隔长度的平方和与一天的比例。即,(h1/si)2+(h2/si)2+,其中每个间隔都是自由间隔
  • 目标:最大化团队的总体生产力
请注意,如果没有会议,制造商和管理者都会体验到最佳生产率。如果必须安排会议,那么决策者更喜欢会议背靠背进行,而管理者不在乎会议去哪里。请注意,由于所有中断都被视为对制作者同样有害,因此如果将可用的空闲时间分段,则持续1秒的会议与持续3小时的会议之间没有区别

问题是决定如何安排M个不同的会议,涉及任意数量的N个人,其中给定会议中的每个人必须在他们的日程安排中安排一个繁忙的时间间隔,这样它就不会和任何其他繁忙的时间间隔重叠。对于每次会议,所有各方的繁忙时间间隔的开始时间必须相同

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



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

这个问题看起来很难,足以成为NP,但我认为它允许一些合理的近似

特别是,我认为您可以通过会议规模优化合理地管理会议,您可以以最佳方式安排最大规模的会议(就必须参加会议的制作人数量而言,因为他们是您尽量不打扰的人),然后通过较小的会议依次安排会议。为了在同样长度的小型会议中打破联系,你可以根据被邀请参加会议的制作人的会议负荷来衡量会议的权重(这样你就有机会优化会议,而不会让他们的生活变得更糟)

现在,您已经将问题分解为安排一次会议,因为任何已经安排好的会议都会有效地缩短一个人的日程。而且解决方案非常简单:最佳解决方案是与制造商时间表的最大数量的边对齐,这样每个人都可以挤出时间。你应该能够解决这个问题,即使使用蛮力,比如
O((k+g)*k*n)
其中
k
是制造商的数量,
g
是管理者的数量,
n
是制造商计划中的典型间隔数


唯一的问题是,这种直截了当的方法是否会导致无法令人满意的会议。在这种情况下,您可以将该会议的优先级提高一个或多个时段,然后重试。

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

使用遗传算法可以很好地近似这一点

编写一个函数,创建1000个随机计划示例,随机分配决策者和管理者

编写另一个函数(健身函数),为有问题的日程安排分配缺点(人们在同一时间工作,没有足够的决策者,没有足够的管理者,有人工作不够,有人工作太多)

foreach schedule分配计算适应度,并参考得分最低(最佳)的时间表。
while(最佳计划>最小适应值)
foreach schedule s在计划的总体中
每个时隙
如果(随机<.5)
从最佳时间表中选择值
其他的
从明细表s中选择值
如果结束
端部foreach
具有适应度函数的评分表
端部foreach
结束时
虽然这种方法不会产生一个最优的时间表
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
S' = Starting Schedule
S = S'    
while( Fitness( S ) < Minimum Fitness ) 
{
    NS = Neighbor( S )
    if( Fitness( NS ) > Fitness( F ) )
    {
         S = NS
    }
}
Return( S )