一、 总体结构
任务排程
全局变量
Map per (key=pk value=前置任务列表)// 前置任务列表
Map prix(key=pk value=后置任务列表)// 后置任务列表
List
List allTasks;//全任务列表
firstTask //初始任务列表
private UFDate startDate;排程开始时间
private UFDate endDate;排程结束时间
private int type;//排程类型
1. 获得末级任务
a) 获得末级所有任务,并将他们的排程时间置为空。
Task[] getLastLevelTask()
{
Buildsql();//拼写 SQL
allTask s =Query()//查询
}
b) 获得所有末级任务的前置任务列表。
getRelatedTasks(){//获得任务的前置任务和后置任务列表
}
c)
2. 根据末级任务获得网络图
a) 获得所有没有前置任务的任务列表,作为网络图的起始点。
getNoPerTask()
{
//根据 map per 中没有 KEY 的取值
Return firstTask;
}
b) 计算网络图
计算方法:从起始任务列表中获得一个任务 ,然后获得它的前置任务和后置任
务,然后对它的前置任务和后置任务分别找它们的前置任务和后置任务,再依
次找他们的前置任务和后置任务,直到找不到新的前置任务和后置任务(没有
前置后置任务或前置后置任务在前面查找前置后置任务时已经被查到。)。如果
找到的任务在起始任务列表中,该任务则不在作为起始任务计算网络图。
做完上面工作后从起始任务列表中重复上面的工作直到起始任务都执行。
List InterNetMap()
//获得一条网络图并存储到 InternetMap 中,并将放到网络图中的 task 从
leavetasks 中删除,获得网络图方法为获得 firstTask 相关联的所有前置任务和后
置任务(如果计算某个任务的前置任务和后置任务都不存在于 leavetasks 中,计
算完毕,否则把找到的任务从 leavetasks 删除,并计算找到任务的前置任务和后
置任务列表,进行刚才的判断。如果找到任务在 firstTask 中,从 firstTask 删除此
任务)
{
leavetasks//没有放到网络图的 task
InternetMap//存储网络图的 List
List
List
For(firstTask)
{
List InternetList=new ArrayList();
If(tasks(前置或后置任务中))
{
InternetList.add(task);
Leavetasks.remove(task);
}
InternetMap.add(InternetList);
}
Return InternetMap;
}
3. 根据网络图进行排程
排程的方法为对每个网络图进行排程,排程的方法为从网络图中拿到根结点任务列
表以它为起点进行排程。当某一结点有前置任务时,先算别的路径的任务,直到任
务到达这个结点。
Void queueTasks(InternetMap)
{
根据排程类型判断排程方式
If(type)
{
}
Else
{
}
……..
}
}
Void perqueueTasks(InternetMap)
{
For (InternetMap)//计算没一条路径的排程时间
{
FirstList=getFirstList()//获得该网络的开始任务列表
While(InternetMap.get(i)中 task 为空)
{
For(FirstList)
{
执行每个 FirstList 下可执行的任务
}
}
排程的方法为从网络图中拿到根结点任务列表以它为起点进行排程。当某一结点有
前置任务时,先算别的路径的任务,直到任务到达这个结点。根据我们使用的排程
方式比较获得需要的时间
记录时间
获得 endtime
If(getEndTime>endtime)
{
Endtime= getEndTime;//取所有网络图最早结束时间最晚的为最早结束时间。
}
}
4. 获得关键路径
根据排程获得的时间对网络图根据时间进行倒推,获得关键路径。
List perqueueTaskRoad()//以正排为例
{
根据 endDate 根据时间寻找前一个任务
}
二、 情景数据推演
1.正排
2.倒排
3.排程锁定
4.未完成参与正排
5.未完成参与倒排