Cân đối tài nguyên

Một phần của tài liệu (LUẬN văn THẠC sĩ) bài toán lập, điều khiển tiến độ công việc trong quản lí dự án và ứng dụng (Trang 58 - 63)

Tương ứng với biểu đồ công việc, ta dễ dàng tính được số lượng tài nguyên nhân lực trong từng khoảng thời gian, giúp người quản lý theo dõi được tiến độ, đồng thời biết số mức nhân lực yêu cầu. Mục sau đây trình bày thuật toán đưa ra mức tài nguyên ban đầu.

Thuật toán đưa ra mức tài nguyên ban đầu

Input: Mảng công việc T[], mảng sự kiện s[], ma trận B[][] của đồ thị sự kiện.

Output: Mảng Rs[] lưu mức sử dụng tài nguyên trong từng thời điểm và mảng Tg[] lưu thời gian tương ứng với Rs[], mảngc[] lưu mốc thời gian đánh dấu thời điểm có ít nhất một công việc bắt đầu hay kết thúc

Trong thuật toán này ta sử dụng mảng T1[]làm trung gian để xét các công việc có cùng thời gian khởi sớm.

23 Ngõ¬i T 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 17 18 19 20 21 22 0 1 2 3 4 7 8 9 5 6 0 3 (15) (5) 3 (12) 3 (10) 3 (20) 2 (10) 5 (5) 3 (10) 3 (15) 2 (8) 3 (10) 2 (10) 2 (8) 2 0 23 10 20 30 (20)

Void Tai_nguyen_ban_dau(); {

int d1=0; //số phần tử của mảng T1[] .

int d=1; //số phần tử của mảng Tg[] và Rs[].

int khs[50]; //mảng lưu thời gian khởi sớm của mỗi công việc.

Khởi tạo T1[]=0;

Tính các giá trị thời gian khởi sớm khs[] cho từng công việc; i=1;

T1[1]=T[1]; c[1]=0;

while (i<=nT) //khi nào vẫn còn những công việc chưa được

xét

{

Chép từ T[] vào T1[] những côngviệc có cùng thời gian khởi sớm khs[i] và lưu lại chỉ số của công việc lần cuối cùng được chép từ T[] sang T1[] vào biến luu;

Đặt một mốc c[j] = khs[i], với mỗi công thời điểm kết thúc một công việc, ta tạo thêm một mốc c[k] = khs[i] + T[k].tgian

}

d1=1; i=luu+1; T1[1]=T[i];

i++; //Sang công việc tiếp theo

}

Sắp xếp các mốc c[] theo chiều tăng dần. Giữ lại các mốc khác nhau trong mảng c[], ta được m mốc

Tổng thời gian thực hiện là Tgd = c[m], số khoảng phân biệt là m- 1.

J=1

While (j<m) {

Tính tổng tài nguyên các công việc đang được thực hiện trong đoạn (c[j], c[j+1]), đưa vào Rs[j]

} }

Thuật toán cân đối tài nguyên

Ta dùng phương pháp song song để cân đối tài nguyên. Giả thiết: mỗi công việc được tiến hành liên tục, tức là một công việc khi đã bắt đầu sẽ được làm cho tới khi hoàn thành, không bị dừng lại nửa chừng. Để cân đối tài nguyên, ta chia thành hai giai đoạn:

Giai đoạn 1: Đưa mức yêu cầu tài nguyên xuống dưới mức cung cấp, tiến hành từ trái sang phải bằng cách làm chậm một số công việc và theo quy tắc sau đây:

1.Các công việc đã được tiến hành trong khoảng thời gian trước vẫn được tiến hành trong khoảng thời gian đang xét.

2. Đẩy lùi thời điểm bắt đầu sang khoảng thời gian sau của công việc có dư trữ lớn nhất, tức là ưu tiên các công việc có dự trữ nhỏ nhất được tiến hành trước.

3. Nếu nhiếu công việc có cùng dự trữ thời gian thì đẩy lùi công việc không găng độc lập trước và lựa chọn đẩy lùi số công việc là ít nhất mà giảm mức tài nguyên là lớn nhất.

Giai đoạn 2 : Nâng mức yêu cầu tài nguyên gần mức cung cấp nhằm thu ngắn nhất thời gian thực hiện dự án.

Sau giai đoạn 1, nếu thời gian xây dựng dự án không bị kéo dài hơn so với trước thì phương án sau giai đoạn 1 là tốt nhất. Nhưng thường thì thời gian thực hiện dự án sẽ bị kéo dài thêm. Vì vậy phải cố gắng thu ngắn thời gian trở lại dự án ban đầu theo hai lần:

Lần thứ nhất : Xét các khoản thời gian từ phải sang trái, khoảng nào có thể tăng mức yêu cầu tài nguyên trong phạm vi mức cung cấp thì dịch chuyển các công việc kế cận gần nhất. Sau lần 1, nếu thời gian toàn bộ không rút ngắn được, ta kết luận không thể rút ngắn được nữa. trái lại thì ta phải tiến hành lần thứ 2.

Lần thứ 2: Xét các khoảng thời gian từ phải sang trái, tăng mức yêu cầu tài nguyên trong phạm vi mức cung cấp. Tiếp tục làm như lần thứ nhất cho đến khi xuất hiện hai tình huống:

1. Không rút ngắn được thời gian hoàn thành dự án.

2. Thời gian hoàn thành dự án bằng hoặc nhỏ hơn thời gian hoàn thành phương án đầu. Ta dừng lại, đó chính là phương án tối ưu.

Sau khi đưa ra mức tài nguyên ban đầu nếu mức yêu cầu của dự án vượt quá mức cung cấp thì ta tiến hành cân đối tài nguyên sao cho mảng Rs[] không có giá trị nào lớn hơn mức giới hạn tài nguyên Rmax.

Xét trường hợp tổng quát, người quản lý có thể cân đối tài nguyên bắtđầu từ một thờiđiểm nàođó trong quá trình dữánđang diễn ra. Nếu cần cân đối tài nguyên cho toàn bộ dựa án thì mốc cân đối là thờiđiểm dựán bắtđầu: mốc = 0.

Thuật toán: Cân đối tài nguyên

In put: Mảng công việc T[], mức tài nguyên cung cấpRmax, mảng lưu thờiđiểm khởi sớm của các công việcKhs[], mốc thời gian cần cân đối Moccd, hai mảng lưu khoảng thời gian và tài nguyên tương ứng trước khi thực hiện cân đối làTg[] vàRs[]

Output: Hai mảng lưu khoảng thời gian và tài nguyên tương ứngTg[]

vàRs[], thời gian hoàn thành dự ánTgd.

Trong thuật toán này sử dụng: mảngSt[] lưu trạng thái mỗi công việc.

Mảng DT[] lưu thời gian dự trữ của mỗi công việc, mảng Tgcon[] lưu khoảng thời gian chưa được xét của mỗi công việc.

1 nếu công việc i chưa được thực hiện.

0 nếu công việc i đang tiến hành. -1 nếu công việc i đã kết thúc.

void Can_doi_tai_nguyen();

{Lưu giữ lại các đoạn Tg[i], Rs[i] không thực hiện cân đối tài nguyên.

Khi đó:

Nếu công việc k có Kh[k]+T[k].Tgian < Moccd thì Tgcon[k]=0 Ngược lại: Tgcon[i]=Khs[i]+T[i].tgian - Moccd

Moc1=Mocd

/*T1: Lưu các công việc đang thực được làm tại bước đó T2: Lưu các công việc có cùng khởi sớm tại bước đang xét. T3: Lưu các công việc bắt đầu sau mốc đang xét nhưng cùng đang diễn ra với các công việc đang được xét*/

Lặp đến khi hoàn thành dự án

{ danglam=0, d1=0, d2=0, d3=0 ,R1=0:số lượng phần tử của T1, T2, T3

- Đưa công việc đang làm vào T1[], tính tổng tài nguyên của các công việc đang làm R1

- Đưa các công việc có khởi sớm = Moccd vào T2[],

- Sắp xếp trong T2[] theo thời gian dự trữ tăng dần

- Với mỗi công việc k trong T2: nếu R1+ T[T2[k].tt].tn<=Rmax thì

R1=R1+T[T2[k].tt]tn St[T2[k].tt]=0

Đưa công việc k này vào T1

- Tìm khoảng thời gian Tgcon[k] nhỏ nhất trong T1[]: Tgmin

- Đưa các công việc bắtđầu sau Moccd nhưng trước Moccd +Tgmin vào T3, và tính tổng tài nguyên của chúng R2.

- Sắp xếp các công việc trong T3 theo khởi sớm tăng dần

- Nếu T[T[3k].tt].Tgian + R1 <=Rmax thì Bổ sung công việc này vàođoạnđang xét, Ngược lại, đẩy lùi công việc này

*) Xét xem công việc nào đã làm xong trong đoạn này.

- Trong T1[]: Nếu Tgcon(T1[k].tt) = Tgmin thì công việc nàyđã kết thúc

nễu Tgcon[T1[k].tt]>Tgmin thì Tgcon[T1[k].tt]=Tgcon[T1[k].tt]- Tgmin

- Xét xem trong T2[], nếu công việc chưa làm [St[T2[k].tt]=1 ] trong đoạn này thì đẩy lùi chúng một khoảng Tgmin:

}

}//Can_coi_tai_nguyen

Một phần của tài liệu (LUẬN văn THẠC sĩ) bài toán lập, điều khiển tiến độ công việc trong quản lí dự án và ứng dụng (Trang 58 - 63)

Tải bản đầy đủ (PDF)

(84 trang)