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/算法:

输入:节点的先后顺序,优先权,所需人力,工作时间

输出:最后一个活动的结束时间

begin

int 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;

end

output 最后一个活动的完成时间

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数据库的数据表之中

 

posted on 2008-04-23 09:43  传说中的飞  阅读(234)  评论(0编辑  收藏  举报