java实现的项目管理中的关键路径的算法

基本概念: 
在关键路径法中,一般有以下一些时间参数: 

最早开始时间(Early Start)活动最早开始时间由所有前置活动中最后一个最早结束时间确定。 

最早结束时间(Early Finish)活动的最早结束时间由活动的最早开始时间加上其工期确定。 

最迟结束时间(Late Finish)一个活动在不耽误整个项目的结束时间的情况下能够最迟开始的时间。它等于所有紧后工作中最早的一个最晚开始时间。 

最迟开始时间(Late Start)一个活动在不耽误整个项目的结束时间的情况下能够最早开始的时间。它等于活动的最迟结束时间减去活动的工期。 

总时差(Total Float) 指一项活动在不影响整体计划工期的情况下最大的浮动时间。 

自由时差(Free Float)指活动在不影响其紧后工作的最早开始时间的情况下可以浮动的时间。 



算法原理-前导图(PDM)法: 
对于活动的最早开始和最早结束时间,采用正推法计算,其算法如下所示: 

1.将第一个活动的最早开始时间设置为1. 

2.在活动的最早开始时间上加上其工期,得到活动的最早结束时间。 

3.根据该活动与后置活动的逻辑关系,计算后置活动应该的最早开始时间,并与其已有的最早开始时间对比,如果其后置活动还没有设置最早开始时间,则将此时间设为其最早开始时间,如果此时间早于其后置活动已有的最早开始时间,则保留后置活动的原有最早开始时间,如果此时间迟于其后置活动已有的最早开始时间,则将此时间设置为后置活动的最迟开始时间。 

4.重复步骤2和3,直到所有活动的时间被计算完为止。 

对于以上所示的最早时间的计算过程,可以以公式的形式表示如下: 

当活动间的逻辑关系为SS,则计算如下 

ESj=max{ ESi + STS} 

当活动间的逻辑关系为FS,则计算如下 

ESj= max{ESi+ Di+ FTS} 

当活动间的逻辑关系为FF,计算如下 

ESj= max{ESi+ Di - Dj +FTF} 

当活动间的逻辑关系为SF,计算如下 

ESj=max{ ESi - Dj +STF} 

在计算出各个活动的最早开始和结束时间之后,就可以计算活动的自由时差,在计算前导图(PDM)的自由时差时应注意,由于引入了多种逻辑关系,并且活动间可以存在延时,所以其计算方法与箭线图(ADM)的计算方法不一样。 

对于前导图(PDM)的活动间,除了延时还可以存在时间间隔(LAG),一般可以按照下面的方式计算。 

当活动间的逻辑关系为SS,则计算如下 

LAGi-j= ESj- ESi- STS 

当活动间的逻辑关系为FS,则计算如下 

LAGi-j= ESj- EFi- FTS 

当活动间的逻辑关系为FF,计算如下 

LAGi-j= EFj- EFi- FTF 

当活动间的逻辑关系为SF,计算如下 

LAGi-j= EFj- ESi- STF 

则对于任意一个活动,其自由时差为 

FFi=min{ LAGi-j} 

最后一个活动的自由时差为0. 

对于总时差,终点节点的总时差为0,对于其它任意一个节点,总时差按照下式进行计算 

TFi=min{TFj+ LAGi-j} 

对于任意一个活动的最晚开始时间可以由其最早开始时间加上总时差得到,同样,其最晚开始时间可以由最早结束时间加上其总时差得到,公式表示如下 

LSi=ESi+TFi 

LFi=EFi+TFi 

代码分析:

首先根据如上概念,抽象出一些属性:

   private String taskNumber;//任务编号   
   private String logic;//任务之间的逻辑关系   
      
   private double earlyStartTime;//最早开始时间   
   private double earlyFinishTime;//最早结束时间   
   private double lateStartTime;//最晚开始时间   
   private double lateFinishTime;//最晚结束时间   
   private double dut;//执行时间   
   private double delayTime;//延迟时间   
   private double slack;//机动时间   

创建一个构造器

    /*  
     * taskNumber 任务编号  
     * logic 与前置任务的逻辑关系  
     * dut 任务执行时间  
     *delayTime 提前滞后时间  
     */  
    public Task(String taskNumber,String logic, double dut, double delayTime) {   
        super();   
        this.taskNumber = taskNumber;   
        this.logic = logic;   
        this.dut = dut;   
        this.delayTime = delayTime;   
    }   

然后是定义最早开始时间和最早结束时间,最晚开始时间和最晚结束时间的方法。

再通过一个计算类验证其正确性。

相关资料

转载于:https://www.cnblogs.com/larryzhang/archive/2012/06/20/2556228.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值