1/已知
有如下一组活动,每个活动都有其工作时间和所需人力,在保证活动前后顺序和不超过人力资源约束的前提下,求得所有活动完成的总共最短工作时间.
已知参数如下: 说明:活动序号j ,工作时间pj ,所需人力lj ,前序活动Lj ,优先权v(j) 活动的优先权:
j |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
v(j) |
10 |
11 |
7 |
9 |
3 |
8 |
5 |
4 |
6 |
2 |
1 |
总的人力资源约束maxReaource为常量 6 ,指的是同时工作的人力数量不能超过此常量
以上数据和人力资源约束常量均为已知,活动序号不表示活动的执行顺序.
2/求解
假设为每个活动随机分配一个不重复的正整数为活动优先权,在两活动竞争执行位置时优先权高的竞争到此位置.(如活动2,3竞争执行时,由于活动3的优先权6>活动2的优先权5,所以3执行)
说明:求得结果应该如下图
j节点下标;s-正在处理下标v(j)活动j的优先权j* s中最大的优先权的活动s 已排序活动
最后一个活动的结束时间为25 3/算法:输入:节点的先后顺序,优先权,所需人力,工作时间输出:最后一个活动的结束时间beginint m=10;//活动的数量Task[] processing = new Task[m];//正在处理活动集合Task[] scheduled = new Task[m]; //已排序活动集合int startTime = 0;//初始化活动开始时间int finishTime = 0;// 初始化活动结束时间int j=0;//活动下标int maxReaource =6;while(j<m)do把后序节点加入正在处理活动集合;选择此集合中优先权最大的一个活动;活动j的最早开始时间为它所有前序任务的最晚完成时间;活动j的开始时间为最小的f,f满足(1)最早开始时间<=f (2)在时间l内可用资源数量<=maxHead(所需人力) l=f,f+1,…f+processing_time;活动j的结束时间为它的开始时间+它的处理时间;将此活动加入到已排序活动集合中;在正在处理活动集合中删除此活动;j=j+1;endoutput 最后一个活动的完成时间end 4/一些定义:活动类定义如下:public class Task{private int _task_id; private string _task_name; private int _rpoject_id; private int _task_type; private int _task_lines; private int _processing_time; private int _max_head; private Task[] _pre_tasks; private int _priority; private int _employee_id; private int _cost_on_task; private int _start_time; private int _finish_time;} public class Task_pre{ private int _task_id; private int _task_pre_id;}以上两个类的数据都保存在SQLServer数据库的数据表之中