摘要
资源约束项目调度问题(RCPSP)旨在通过遵守资源约束和先决条件来启动每个活动,找到最小完成时间的时间表。然而,由于该问题是NP-hard的,因此精确过程的性能受到限制,只能解决小型项目网络。在本研究中,提出了一种用于RCPSP的遗传算法。所提出的遗传算法(GA)旨在找到接近最优解,并且克服了针对大型项目网络的精确过程的性能差的问题。实验结果表明,所提出的算法优于知名商业软件。
1.背景
项目调度涉及活动的定义,个别活动持续时间的估计,活动之间的关系的建立以及进行活动所需的资源。因此,项目管理必须决定哪些资源将用于执行项目,必须确定各种资源类型的容量,并且必须估计项目活动所需的资源需求。显然,如果这些资源是充足的,那么项目就可以执行以达到预期的项目持续时间。另一方面,如果这些资源是有限的,那么项目完成时间很可能会延迟。一般的,在充分利用资源的基础上合理安排项目进度会提高企业的竞争优势。
调度问题涉及许多类型的限制。当资源的可用性受到限制时,就出现了资源约束项目调度问题(RCPSP)。对于施工项目的进度安排和规划而言,获得RCPSP的充分解决方案至关重要。由于不适当地调度资源受限的项目(RCP),资源的无效分配会大大增加项目的持续时间和成本。RCPSP的解决方案通过为每个任务分配一个开始日期来解决最短持续时间的进度安排,以满足优先级顺序和资源约束。
RCPSP是较难的优化问题,RCPSP属于NP-hard问题类别,也就意味着使用精确方法达到最优解的解决时间可能相当长。一些精确方法仅适用于小型项目,而且当项目变大或添加额外的资源约束时,获得解的时间更长。因此,大多数研究都致力于改进启发式和元启发式程序,以在可接受的计算时间内获得近似最优解。
本研究的目标是提出一种遗传算法,以在可接受的计算时间内解决RCPSP问题,生成近似最优解。所提出的算法是使用C ++编程语言构建的,并被证明可以方便地操作不同的问题集。
2.文献综述
资源约束项目调度问题(RCPSP)已经在调度领域广泛研究,导致出现了各种优化技术。许多研究已经专注于开发元启发式程序,以在合理的计算时间内生成接近最优的解。遗传算法(GA)维护一组被编码为染色体字符串的解,通过代理计算其适应度。从现有的种群开始,每次迭代通过将两个选择的父代应用操作(例如交叉和变异)来生成新的染色体(Montoye-Torres等人,2010)。遗传算法是非常重要的元启发式优化算法,但它们跳出局部解的能力有限,而且往往会出现过早收敛的问题Kolisch&Hartmann,2006)。
之前的研究(Debels&Vanhoucke,2005; Valls等,2005; Mendes等,2005; Kim&Ellis,2008; Seda等,2009)提供了解决RCPSP所采用的不同启发式方法的详细描述。近年来,结合不同遗传算法机制以提高算法性能变得流行,并且文献中提出了几种元启发式方法:散射搜索(SS)和电磁理论(Debels等,2004)、路径重连策略和禁忌搜索(Kochetov&Stolyar,2003)、粒子群优化(Zhang等,2006)、混合神经方法(Colak等,2006)。此外,(Tseng&Chen,2006)提出了一种名为ANGEL的混合元启发式过程,将蚁群优化(ACO)、遗传算法(GA)和局部搜索策略集成在一起。由(Valls等,2008)提出的混合遗传算法在GA概念方面提出了几种修改。这些修改包括:RCPSP特定的交叉算子,应用于所有生成的调度的局部增强算子,一种新的选择父代的方法,以及一个两步策略,其中第二步从第一步找到的最佳调度的邻居种群重新开始演化。由(Montoye-Torres等,2010)提出了一种替代染色体表示的多维数组面向对象模型,它利用最常见的语言的编程功能来设计决策支持系统。
本文提出了一种独特的改进遗传算法,与传统的遗传算法不同,该算法使用两个独立的种群、改进的两点交叉操作、增强的变异操作和独特的父代选择机制。与现有研究不同的是,实验结果与Primavera Project Planner (P6版本7.0)进行了比较。特别地,在最近几年中,具有300个活动的问题集还没有被广泛测试。此外,在本研究中,除了30、60和120个活动的问题集,还使用了包含300个活动的问题集对所提出的算法和Primavera Project Planner进行了测试和比较。
3.研究方法
资源约束项目调度问题可以概念化地表述如下:
在这个公式化中,考虑了虚拟起始(f1)和完成活动。变量fi表示任务的完成时间,而di表示任务的持续时间,ak表示第k个资源的可用性,rik表示活动i对资源k的需求,St表示在时间t进行的活动组,m是项目中资源类型的数量,最后,j是链中的下一个活动。
策略
在这个遗传算法中,与传统遗传算法不同的是,初始种群由两部分组成:左种群包含左对齐(向前)进度表,右种群包含右对齐(向后)进度表。基本上,该遗传算法是基于将适应度计算过程、选择过程、交叉操作、变异操作和替换过程应用于初始种群。
本研究中的终止准则是算法创建的调度方案数量,包括首个左侧对齐和右侧对齐进度以及交叉和变异后产生的调度方案。通常,在本研究中生成了1000个调度方案,而在某些问题中生成了5000个调度方案。
在整个算法过程中,每个GA周期结束时,右种群将通过使用左调整的计划进行更新,而左种群将通过使用右调整的计划进行更新。因此,右(左)调整的计划已被转换为左(右)调整的计划。通过这样做,使用了反复的正向和反向调度的优点。伪代码如下图1所示。
构建初始种群
首先,在开始创建第一代种群之前,后继活动的数量和后继活动本身被转换为前置活动的数量和前置活动本身,以便按照左侧种群的创建过程进行。
其次,使用前向(后向)调度创建左(右)种群。左(右)种群是随机生成的,其中具有0个前继(后继)的活动被放入选择池中,并选择一个活动。之后,重新计算其他活动的前继(后继)数量,并再次将具有0个前继(后继)的活动放入选择池中并选择一个活动。这个过程会一直重复,直到开始(结束)里程碑已经被启动,最终找到一种可行的活动起始顺序。
在创建了起始顺序后,可以计算活动的开始时间和完成时间。首先按照起始顺序在第一个可行时间开始分配活动,考虑到项目中的资源使用和资源约束。在分配活动的开始时间和完成时间时,必须考虑先决关系和资源使用情况。如果在整个活动持续时间内有足够的资源,活动应在其先决条件完成后立即开始。另一方面,如果活动没有前置条件,但资源不足或资源仅在几天内可用,那么可以在第一个可用的资源日开始该活动。
父母选择和交叉过程
在生成50个左方个体和50个右方个体之后,将重新审查调整调度方案的数量,接下来是计算个体的适应度值,以确保算法能够找到适当的匹配。适应度值通过以下基本公式计算。
Fitness Value = 1 / individual’s makespan
因此,更长的完成时间意味着更低的适应度值,这表明个体(调度)在项目完成时间方面不好,因为问题的目标是最小化项目完成时间。计算完个体的适应度值后,将按其适应度值对种群进行排序,适应度值较大的个体排在种群的顶部,如图2所示。
种群的前一部分(5个最佳进度)和从种群中随机选择的25个进度被放置在父代选择池中,如图3所示。
首先,从父代池中随机选择第一个父亲。接下来,通过计算资源利用率(RUR)和总资源利用(TRU),找到最佳匹配(称为父亲)进行交叉配对。资源利用率(RUR)指的是时间t的资源使用情况,计算方法如下:
在上述公式中,active(t, S) 表示t时间内 调度方案 S 中活动的集合。K 表示资源数量,k 表示资源类型,rjk 表示活动 j 对于资源类型 k 的资源需求,ak 表示资源类型 k 的可用性。
在计算出 RUR 后,资源使用较高和资源利用率较低的时间间隔也能够确定。在本论文中,t1 和 t2 被确定为 TRU 在这些点之间最大的交叉点。为此,峰值的长度 l 在工期的 (1/4) 到 (3/4) 之间随机选择,具有起始时间 t 和长度 l 的时间间隔的总资源利用率计算如下:
在这里,交叉点t1被设置为TRU(t,l,S)最大的t,其中t Є [0,makespan-l],第二个点t2被设置为t1+l。对于其余的区间,平均RUR将会较低。
在确定了根据父代定义的交叉点之后,在其余资源使用率较低的时间段内,会通过父代选择池找到最佳母代,这些时间段包括 [0, t1] 和 [t2, makespan]。
在确定父代的交叉点之后,对于RUR低的其余时间段,将通过父代选择池找到具有[0,t1]和[t2,makespan]时间段高TRU的最佳母代。然后,使用活动的随机键(RK)值应用两点交叉操作。随机键值用于基于活动信息(例如开始时间或完成时间)定义优先级列表。对于左对齐的调度方案,RK取活动的完成时间的值;在右对齐的调度方案中,RK取活动的开始时间的值。对于孩子,有3种情况:在情况1中,如果母亲的RK < t1,则孩子的RK为母亲的RK-200;在情况2中,如果t1 ≤母亲的RK ≤ t2,则孩子的RK为父亲的RK;在情况3中,如果母亲的RK > t2,则孩子的RK为母亲的RK + 200。使用较大的常数200可以防止优先级结构的歧义。因此,可以保证在资源使用方面使用母亲的最佳部分。
使用一个简单的资源约束的双跨桥问题,来演示所提出算法的应用。图4、5、6、7、表1和图8分别说明了网络图和资源使用情况、父亲和母亲的示例进度、RUR和TRU曲线、交叉计算和子进度。
该示例项目中,每种资源的资源可用性为1。彩色活动表示属于第二种情况的活动,因此父亲的RK值与孩子的RK值相同。在这个例子中,大的常数被取为200。
如表1所示,随机键值是活动的完成时间,因为父进度和母进度都是左对齐进度。此外,在这个例子中,峰值的长度l被选择为16,它应该在makespan的四分之一(6)和makespan的四分之三(18)之间。此外,最大的TRU是7,可以在图7中看到,在3和19之间出现。
最后,生成了子代进度表。父亲和母亲的进度表是左对齐进度表,因此子代进度表是右对齐进度表,其随机键值为活动的开始时间。在交叉操作之后,进度表被随机替换为非顶部部分的选择个体。
突变程序
在交叉操作之后,突变过程开始。在所提出的算法中,突变率为2%,这意味着只选择一个个体进行修改。首先,从整个种群中随机选择一个进度表。其次,在不包括开始和结束里程碑的情况下,从进度表中随机选择一个活动。第三,检测所选活动的前任和后继位置,以确保在进度表中活动之间不会出现不合适的先行关系。然后,在不改变关系的情况下,将随机选择的活动与另一个随机选择的活动进行移动。然后,找到新进度表的工期,如果新进度表的工期优于先前的进度表,则接受突变。接受的进度表将替换先前的进度表。最后,接受或拒绝进度表,种群的数量得到调整,如图9所示。
在这个例子中,随机选择的活动是6,它有一个后继活动8和一个前置活动3。根据活动6的先决条件,在开始顺序列表中,3和8之间的活动(1、4、2和5)适合进行替换。另一方面,根据活动1的先决条件,活动4是活动1的后继活动,如果进行这种替换,活动1将成为活动4的后继活动,这是不可能的。此外,根据活动5的先决条件,活动2是活动5的前置活动,如果进行这种替换,活动5将成为活动2的前置活动,这也是不可能的。因此,只有两个适合替换的活动,即活动2和活动4。
4.试验结果
本节将介绍计算试验的结果。算法使用了来自项目调度问题库(PSPLIB)的随机选择的40个问题;每个问题集中选取了30、60、120和300个活动的10个问题进行测试。为了进行比较,选定的问题集也使用Primavera Project Planner(版本7.0)进行测试,这些问题的最优解已知。
活动与其资源需求、持续时间和其他活动之间的关系一起输入到软件中,并根据五种不同的算法进行调度:活动ID、总浮动、晚完成、早开始和自由浮动。算法在升序和降序两种方式下运行,因此总共与最终算法进行比较的有10种算法,其结果在表2和表3中。
根据Primavera的结果,平均值、偏差、上届已经计算作为对照(表4和表5)。最终的算法显然优于Primavera Project Planner软件。MS Project软件使用与Primavera的总浮动(升序)和活动ID算法相同的算法,因此未测试MS Project 2010软件。
5.结论
本研究提出了一种用于解决资源受限的项目调度问题的遗传算法。所提出的算法能够解决具有30、60、120和300个活动以及4种不同资源的RCPSP。该算法同时考虑了受限资源和活动关系。
与传统遗传算法不同的是,本研究采用了两种不同的初始种群,一种是通过正向调度产生的左种群,另一种是通过反向调度产生的右种群。这样做可以保持多样性,这是进化算法的重要组成部分。此外,交叉相似种群的概率消失了,并且正向调度和反向调度的优点被融合起来。
此外,本研究提出了一种修改后的交叉算子,首次被使用。通过将左(右)对齐的进度表与右(左)对齐的进度表相结合,利用了迭代前向/后向调度的优点。在这种相结合的过程中,在交叉之前,种群根据其适应度值进行排序,并将种群中最好的前10%直接传递给下一代。在交叉时,从父代选择池中随机选择父亲,通过使用资源利用率和总资源利用参数来找到最佳的伴侣,从而选择了最佳的伴侣进度表。伴侣进度表是根据其资源利用率进行选择的。存在两个交叉点,因此项目的最长时间被分为三个部分。找到了父亲最大资源利用率的部分,将这个进度表与在其他两个部分的条件下具有最大资源利用率的母亲进行匹配。因此,父亲与在资源利用率方面最适合的母亲进行配对。
在交叉运算之后,最后,采用变异算子来向种群添加全新个体。只有在经过变异后改进的个体被接受,从而防止种群变得更糟糕。这些过程:交叉、变异和更新种群一直被应用,直到达到最大的进度表数目。
本研究通过将Primavera的结果与最终算法的结果进行比较,验证了所开发算法的效率。从每个包含30、60、120和300个活动的问题集中随机选择了10个问题,通过Primavera和最终算法分别求解。无论活动数量如何,最终算法在解决资源约束的项目调度问题方面均优于Primavera。此外,将Primavera的解与最终算法进行比较时,发现Primavera的表现不能令人满意。
对于解决30个活动的RCPSPs,Primavera的前五个最佳算法为:晚完成(升序),总浮动(升序),早开始(升序),自由浮动(升序)和早开始(降序)。对于解决60个活动的RCPSPs,Primavera的前五个最佳算法为:晚完成(升序),早开始(升序),总浮动(升序),自由浮动(升序)和活动ID(升序)。对于解决120个活动的RCPSPs,Primavera的前五个最佳算法为:晚完成(升序),早开始(升序),总浮动(升序),自由浮动(升序)和活动ID(升序)。对于解决300个活动的RCPSPs,Primavera的前五个最佳算法为:晚完成(升序),早开始(升序),总浮动(升序),自由浮动(升序)和活动ID(升序)。
根据结果,对于具有30、60、120和300个活动的所有类型问题,最佳算法是相同的。晚完成时间(升序)算法在Primavera中表现比其他所有算法都要好。此外,在Primavera中的其他启发式算法中,早期开始时间(升序)和总浮动时间(升序)算法表现相对较好。
本研究在现有研究的基础上做出了两个重要贡献。首先,提出并使用了独特的交叉操作。通过这个新的交叉操操作,特别是在大型项目中,与传统遗传算法相比,性能有所改善。其次,使用Primavera软件对30、60、120和300个活动的小型和大型项目进行了测试,并与最终算法进行了比较。因此,开发的算法的性能得到了清晰的观察。此外,观察到RCPSP的最佳Primavera算法为“后续完成(升序)”算法。
正如计算结果所显示的那样,要找到更好的解决方案,需要更多的 CPU 时间,特别是在大型项目中。作为一种迭代算法,使用更多的处理单元可以实现更好的解决方案。因此,通过使用超级计算机、并行计算或基于图形的处理单元等新技术,可以轻松提高计算性能。除了使用新技术外,改变代码结构或将遗传算法与其他元启发式方法相结合也可以提高现有研究的性能。
注: 此文为翻译文章,文中多处存在翻译不恰当之处,点击链接查看修正后的文章,或者搜索微信公众号:宇文兰孜 ,公众号里文章《资源受限型项目(RCPSP)排期算法研究》为修正后的文章。