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 - Fatal编程技术网

Algorithm 堆叠事件/项目的算法

Algorithm 堆叠事件/项目的算法,algorithm,Algorithm,我希望构建一个伪甘特图,除了一个事件可以在同一条线上,只要它们不重叠,就像这样: M T W R F S U M T W R F S U M T W R F S U Category 1: |Event 1| |Event 2| |------Event 3--| |---------Event 4-----------| |-Event 5-| 我正在寻找一种算法来有效地打包这些事件。我知道我可以使用事件的长度和开始日

我希望构建一个伪甘特图,除了一个事件可以在同一条线上,只要它们不重叠,就像这样:

               M T W R F S U M T W R F S U M T W R F S U
Category 1:   |Event 1|     |Event 2| |------Event 3--|
                |---------Event 4-----------| |-Event 5-|
我正在寻找一种算法来有效地打包这些事件。我知道我可以使用事件的长度和开始日期来确定重叠,但我希望有某种起点


出于好奇,我想了解一下SharePoint 2007中甘特图日历视图的局限性。我们的用户喜欢这个视图,但不希望每行有一个任务。

我的第一次尝试是按开始时间/日期对任务进行排序。然后我会一次一个地把它们放在第一行,它们的开始时间还没有被占用。我(根本)不确定它是否能给出最佳结果(即始终使用尽可能少的行数),但它至少应该是合理的一半

然而,我越想它,我就越觉得它实际上可能是最优的。优化问题通常是困难的,因为组合的数量比项目的数量增长得非常快。然而,在这种情况下,你不会得到这样的组合爆炸,因为你不能重新排列项目——至少我假设它们的开始时间都是预先设定的,所以它们不能被重新排列


编辑:澄清一下:这里我假设这个问题只涉及显示一个事件的时间表,它的开始时间和持续时间是已知的,所以优化仅仅意味着尽可能“紧凑”地显示数据。我不是说试图创建时间表本身(即,试图弄清楚什么时候安排什么事件)。根据所涉及的约束条件,这通常是一个困难得多的问题。只要你唯一的约束是任务间的依赖关系,这就相当容易了,但当你添加诸如最大人力利用率和受限资源之类的东西时(例如,任务X只能由A、B或C人执行,任务Y只能由B、C或D人执行等),情况很快就会变得更加困难。

我无法提供任何证据,但我的直觉是,找到一个最优的解决方案(我将其定义为具有尽可能少的非计划时间的解决方案)是一个NP难问题。请看:@erickson:他并不想安排活动时间来优化时间使用。他只是希望事件(具有已知的开始/结束时间)出现在尽可能少的行中。@StriplingWarrior-你能想出一个最佳时间使用不会产生最少行数的例子吗?@erickson:我的观点是,他正在寻找的算法无法重新配置事件时间以优化时间使用。事件将在设置为发生时发生。该算法只选择垂直放置事件的行,因为它们的水平位置是预先确定的。因此,它不是NP难的,Jerry发布的简单贪婪算法将找到一个最优解。啊,所以他正在寻找优化时间使用的方法。这并不像我想的那么难。是的,我认为这是最好的。为了便于说明,设c(t)为在给定时间t“活动”的事件数。那么c(t)的最大值(对于所有t)将是这种显示所需的最小行数。另一方面,通过这个答案中概述的“扫描线”算法,我认为我们可以保证我们总是精确地使用c(t)线(对于任何t)。我们在计算机科学课上研究了这个问题,并确定这个贪婪算法是最优的。我在一个房间调度产品中使用了它,它对我们非常有效。我打算使用这个算法,只是没有考虑到它可能已经是最优的。谢谢你,杰瑞!