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

Algorithm 甘特图问题的算法/编程方法

Algorithm 甘特图问题的算法/编程方法,algorithm,gantt-chart,Algorithm,Gantt Chart,我有6个进程P1、P2、P3、P4、P5和P6。问题中也给出了它们的开始时间和持续时间 process# start duration 1 1 1 2 3 1 3 0 6 4 5 2 5 5 4 6 8 1 现在我必须找出完全不重叠过程的最大数量。如果一个过程在任何时间点都不与另一个过程重叠,那么这两个过程是完全不重叠的 所以我做了一个甘特图,很容易看出答案是4。

我有6个进程P1、P2、P3、P4、P5和P6。问题中也给出了它们的开始时间和持续时间

process# start duration
1        1     1
2        3     1
3        0     6
4        5     2
5        5     4
6        8     1
现在我必须找出完全不重叠过程的最大数量。如果一个过程在任何时间点都不与另一个过程重叠,那么这两个过程是完全不重叠的

所以我做了一个甘特图,很容易看出答案是4。 P1、P2、P4和P6完全不重叠。

现在我必须写一个程序来计算这个。在甘特图上,我可以很容易地“看到”解决方案。 在我的程序的算法中,我不知道如何最小化时间复杂性:目前我正在考虑采用每个进程,并将其开始和结束时间与其他进程进行比较,但这大致使其为O(n^2)。 如果我将过程从6放大到1000,O(n^2)将花费大量时间


有没有标准的方法来解决这些问题?我的意思是,像甘特图这样的问题很容易被可视化?否则,我该如何改进该算法,有什么建议吗?

您可以采用不同的方法来找到解决方案,以下是一些没有特定顺序的方法

  • 这已经是网络上的解决方案了吗
最重要的一点是,甘特图字符基本上是间隔

  • 这可能是一个图形问题吗
假设每个间隔都是一个节点,将开始节点映射为0(零),并将所有节点连接到所有晚于其结束时间开始的节点。使用Dijkstra或类似的方法来找到解决方案

  • 这可能是一个动态规划问题吗
是否存在子问题,是,添加或不添加间隔,重复

  • 我知道用于此类问题的数据结构吗

是的,也许可以用它来解决这个问题。

恐怕这只是经验,是从与类似问题的搏斗中积累起来的。提示:一个过程越快完成,对你的目的来说就越好。我想维基百科上说这是一个强NP难问题。@Neil:有一个O(n logn)贪婪算法可以最优地解决这个问题。算法本身简单;有趣的是,为什么它产生的答案是最优的。这不是最大独立顶点集问题的同态吗?@Neil:你是说通过用间隔表示顶点和用重叠表示边来将is实例转化为这个问题的实例吗?不可能以这种方式表示每个IS实例。例如,假设我们的IS实例由5个顶点a、b、c、d、e和边ab、bc、cd、de组成。有两种方法来表示这一点:a、c、e按该顺序是不相交的间隔(b、d按该顺序是不相交的间隔),或镜像(e、c、a)。如果我们再添加一个顶点f和边af和ef,就无法表示问题。