Tải bản đầy đủ (.docx) (6 trang)

BÀI TỐN LẬP LỊCH THI CÔNG CÔNG TRÌNH

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (153.16 KB, 6 trang )

BÀI TỐN LẬP LỊCH THI CÔNG CÔNG TRÌNH
I. Bài tốn.
Việc thi công một công trình lớn được chia ra làm n công đoạn, đánh số từ 1 đến n. có
một số công đoạn mà việc thực hiện nó chỉ được tiến hành sau khi một số công đoạn nào
đó đã hồn thành. Đối với mỗi công đoạn i biết t[i] là thời gian cần thiết để hồn thành nó
(i = 1, 2, ..n).
Ta có thể xay dựng đồ thị có hướng n đỉnh biểu diễn hạn chế về trình tự thực hiện
các công việc sau: mỗi đỉnh của đồ thị tương ứng với một đồ thị, nếu công việc i phải
được thực hiện trước công đoạn j thì trên đồ thị có cung (i, j), trọng số trên cung này được
gán bằng t[i].
Thêm vào đồ 2 đỉnh 0 và n +1 tương ứng với hai sự kiện đặc biệt: đỉnh số 0 tương
ứng với công đoạn Lễ khởi công, nó phải được thực thực hiện trước tất cả các công đoạn
khác, và đỉnh n+1 tương ứng với công đoạn Cắt băng khánh thành công trình, nó phải
thực hiện sau tất cả các công đoạn, với t[0] = t[n+1] = 0 (trên thực tế chỉ cần nối đỉnh 0
với tất cả đỉnh có bán bậc vào bằng 0 và nối tất cả các đỉnh có bán bậc ra bằng 0 với đỉnh
n+1). Gọi đồ thị thu được là G. Rõ ràng bài tốn đặt ra vấn đề bài tốn tìm đường đi dài
nhất từ đỉnh 0 đến tất cả các đỉnh còn lại trên đồ thị G. Do đồ thị G rõ ràng không chứa
chu trình, nên để giả bài tốn đặt ra có thể áp dụng các thuật tốn được nêu ở trên.
1. Thí dụ: Ta có bảng các hạng mục được cho trong bảng dưới đây.
Hạng mục t[i] Hạng mục phải hồn thành trước
1
2
3
4
5
6
7
8
10
15
10


30
1 2
15
20
10
1
2,3
4
2,3
5,6
5
1 1 : 0
0 1 2 : 10
0 3 : 0
0 1 2 4 : 25
0 1 2 4 5 : 55
0 3 6 : 10
0 1 2 4 5 : 55
Đưa về bài tốn đồ thị có hướng, các đỉnh là các hạng mục như hình sau:
1 (10) 2 5
(12) 8
(0)
(10)
0 (15) (30)
(12) 9
(0) (10) (15)
(15) (20) 3
4
6
7

10 (10)
Cách giải quyết:
* Thêm hai đỉnh 0 và đỉnh 9 ta thu được một đồ thị có hướng trong đó trọng số t[i] là
cạnh xuất phát từ i
* Tìm đường đi dài nhất thì
- Đổi dấu trọng số
- Tìm đường đi ngắn nhất xuất phát từ 0
Lặp V
H
1 2 3 4 5 6 7 8 9
Ktạo 0 0,0
0,∞
0,0
0, ∞ 0, ∞ 0, ∞ 0, ∞ 0, ∞ 0, ∞
1 * 1,-10 0,0
0, ∞ 0, ∞ 0, ∞ 0, ∞ 0, ∞ 0, ∞
2 * 0,0 2,-25
0, ∞
2,-25
0, ∞ 0, ∞ 0, ∞
3 * 2,-25
0, ∞
2,-25
0, ∞ 0, ∞ 0, ∞
4 * 4,-25 2,-25
0, ∞ 0, ∞ 0, ∞
5 * 2,-25 5,-67 5,-67
0, ∞
6 * 5,-67 5,-67
0, ∞

7 * 5,-67 7,-87
8 * 7,-87
9 *
Chương trình sử dụng thuật tốn Dijkstra để tình thời gian các công việc bắt đầu và kết
thúc dự án.
Chương trình thi công công trình không sử dụng trực tiếp thuật tốn này mà còn phụ
thuộc vào các công việc làm đầu tiên, vì vậy công việc đầu tiên là ta phải xác định công
việc nào là công việc đầu tiên, việc xác định công việc đầu tiên cũng rất đơn giản, khi ta
nhập số liệu thì công việc đầu tiên thì không có công việc nào làm trước nó.
Để giải bài tốn trên ta có thể dùng nhiều phương pháp. Nhưng trong đề tài này chúng
tôi sử dụng thuật tốn Dijkstra.
II. Thuật tốn Dijkstra.
Thuật tốn Dijkstra được phát biểu như sau:
Trong trường hợp trọng số trên các cung là không âm do Dijkstra đề nghị để giải bài tốn
tìm đường đi ngắn nhất từ dỉnh s đến các đỉnh còn lại của đồ thị . Thuật tốn được xây dựng
trên cơ sở gán cho các đỉnh các nhãn tạm thời. Nhãn của mỗi đỉnh cho biết cận trên của độ
dài đường đi ngắn nhất từ s đến nó. Các nhãn này sẽ được biến đổi theo một thủ tục lặp,
mà ở mỗi bước lặp có một nhãn tạm thời trở thành nhãn cố định. Nếu nhãn của một đỉnh
nào đó trở thành cố định thì nó sẽ cho ta không phải là cận trên mà là độ dài đường đi ngắn
nhất từ đỉnh s đến nó. Thuật tốn được mô tả như sau.
Procedure Dijkstra;
(* Đầu vào: Đồ thị có hướng G=(V, E) với n đỉnh
s

V là đỉnh xuất phát a[u, v], u, v

V, ma trận trọng số
Giả thiết: a[u, v] >= 0, u, v

V

Đầu ra: khoảng cách từ d(s) đến tất cả các đỉnh còn lại d[v], v

V
Truoc [v], v

V, ghi nhận đỉnh trước v trong đường đi ngắn nhất từ s đến v
*)
Begin
(* Khởi tạo *)
for v ∈ V do
Begin
d[v] := a[s, v];
Truoc[v] := s;
End;
d[s] := 0;
T := V \ {s} (*Tập các đỉnh có nhãn tạp thời *)
(* Bước lặp*)
while T <> 0 do
Begin
Tìm đỉnh u ∈ T thỏa mãn d[u] = min { d[z]: z ∈ T}
T := T \ {u}; (*Cố định nhãn của đỉnh u*)
For v ∈ T do (*Gán nhãn lại cho các đỉnh trong T*)
If d[v] > d[u] + a[u, v] then
Begin
D[v] := d[u] + a[u, v]
Truoc [v] := u;
End;
End;
End;
Định lý 1: Thuật tốn Dijkstra tìm được đường đi ngắn nhất trên đồ thị sau thời gian cớ

O(n
2
).
Chứng minh: Trước hết ta chứng minh là thuật tốn tìm đường đi ngắn nhất từ đỉnh s
đến các đỉnh còn lại của đồ thị. Giả sử rằng ở một bước lặp nào đó các nhãn cố định cho ta
độ dài các đường đi từ s đến các đỉnh có nhãn cố định, ta sẽ chứng minh rằng ở lần lặp tiếp
theo nếu đỉnh u
*
thu được nhãn cố định d(u
*
) chính là độ dài đường đi ngắn nhất từ s đến
u
*
.
Ký hiệu S: là tập hợp có nhãn cố định còn S
2
là tập các đỉnh có nhãn tạm thời ở bước
lặp đang xét. Kết thúc mỗi bước lặp nhãn tạm thời d(v) cho ta độ dài của đường đi ngắn
nhất từ s đến v chỉ qua những đỉnh nằm hồn tồn trong tập S
1
. Giả sử rằng đường đi ngắn
nhất từ s đến u
*
không nằm trong tập S
1
, tức là nó đi qua ít nhất một đỉnh của tập S
2
. Gọi z
∈ S
2

là đỉnh đầu tiên như vậy trên đường đi này . Do trọng số trên các cung là không âm,
nên đoạn đường từ z đến u
*
có độ dài L > 0 và d(z) < d(u
*
) – L < d(u
*
).
Bất đẳng thức này là mâu thuẫn với cách xác định u
*
là đỉnh có nhãn tạm thời nhỏ nhất.
Vậy đường đi ngắn nhất từ đỉnh s đến u
*
phải nằm chọn trong S
1
, và vì thế d[u
*
] là độ dài
của nó. Do ở lầm lặp đầu tiên S
1
= {s} và sau mỗi lần lặp ta chỉ thêm vào S
1
một đỉnh u
*
nên giả thiết là d(v) cho độ dài đường đi ngắn nhất từ s đến v với mọi v ∈ S
1
là đúng với
(1)
Số phần tử:= số đỉnh -1;i:=1;
i < đnguồn

Tập đỉnh[i]:=i;Đđ-đến[i]:=kc[đnguồn, i];Đđ- trực tiếp đến[i]:=đnguồn;i:=i+1;
i:=đnguồn +1
i số đỉnh
Tập đỉnh[i]:=i;Đđ-đến[i]:=kc[đnguồn, i];Đđ- trực tiếp đến[i]:=đỉnh nguồn;i:=i+1;
Bắt Đầu
N
Y
N
Y
(1)
(3) (4)(2)
j số đỉnh -2
Min:= đđ-đến[đỉnh[1]];Vị trí :=1;
i k
Đđ-đến[đỉnh[i]] <min;
Min:= đđ-đến[đỉnh[i]];Vị trí :=i;
i:=i+1
Đỉnh xét:=đỉnh[vị trí];Đỉnh[vị trí]:=đỉnh[spt];Spt:=spt-1;i:=1
i spt
Y
N
Y
N
Y
N
Y
N
bước lặp đầu tiên. Theo qui nạp suy ra thuật tốn cho đường đi ngắn nhất từ s đến mọi đỉnh
của đồ thị.
Bây giờ ta đánh giá số phép tốn cần thực hiện theo thuật tốn. Ở mỗi bước lặp để tìm ra

đỉnh u cần thực hiện O(n) phép tốn, và để gán nhãn lại cũng phải thực hiện một số lượng
phép tốn cũng la O(n). Thuật tốn phải thực hiện n- 1 bước lặp. Vậy thời gian tính tốn của
thuật tốn là cỡ O(n
2
).
Thí dụ: Tìm đường đi ngắn nhất từ đỉnh 1 đến các đỉnh còn lại của đồ thị ở hình dưới:
(7)
2 3 6
(5) (1)
(1) (2) (1) (1)
(4)
1 (2) 4 (3) 5

Minh họa thuật tốn Dijkstra
Kết quả tính tốn được trình bày trong bảng dưới đây.
Bước lặp Đỉnh 1 Đỉnh 2 Đỉnh 3 Đỉnh 4 Đỉnh 5 Đỉnh 6
Khởi tạo 0, 1 1, 1*
∞, 1 ∞, 1 ∞, 1 ∞, 1
1 - - 6, 2 3, 2*
∞, 1
8, 2
2 - - 4, 4* - 7, 4 8, 2
3 - - - - 7, 4 5, 3
4 - - - - 6, 6 * -
5 - - - - - -
Chú ý:
1) Nếu chỉ cần tìm đường đi ngắn nhất từ s đến t nào đó thì có thể kết thúc thuật tốn
khi đỉnh t trở thành đỉnh có nhãn cố định.
* Sơ đồ thuật tốn Dijkstra.
(4)(2)

X:=đỉnh[i]
(3)
Đđ-đến[x] > Đđ-đến[đỉnh xét]+ kc[đỉnh xét,x];
Đđ-đến[x]:=Đđ-đến[đỉnh xét + kc[đỉnh xét,x]];i:=i+1;
Kết Thúc
Y
N
III. Giải quyết bài tốn.
Sau khi đưa bài tốn về dạng đồ thị có hướng, với mỗi đỉnh là một hạng mục ta có
thể tiến hành như sau:
- Chuyển thành ma trận trọng số có dạng a(i, j), với hạng mục i phải được thi công
trước hạng mục j, giá trị của a(i, j) cho biết thời gian hạng mục i làm xong.
- Đổi dấu giá trị của ma trận: ví dụ a(i, j) = -a(i, j)
- Aùp dụng thuật tốn Dijkstra.
- Kết thúc thuật tốn ta thu được d[u] .
- Đổi dấu giá trị d[u] vừa thu được: d[v] = -d[u]
- Giá trị d[v] chính là đường đi dài nhất từ 0 đến đỉnh v, khi đó d[v] cho ta thời
điểm sớm nhất có thể bắt đầu thực hiện công đoạn v, nói riêng d[n+1] là thời điểm sớm
nhất có thể cắt băng khánh thành tồn bộ công trình.
Tương tự như trên ví dụ trên khi kết thúc tồn bộ dự án, kết quả thu được như sau:
Giả sử lễ khởi công dự án là 1-1-2003
Thì sau 87 ngày (Giả sử đơn vị tính là ngày) ta có thể cắt băng khánh thành tồn bộ
dự án.
IV. Điều khiển nhân lực
Các hoạt động không găng được phép xê dịch nhất định, nhất là khi FF
ij
= TF
ij
. Có
thể sắp đặt chúng đáp ứng các yêu cầu khác nữa. Ngồi thời gian ra, chẳng hạn nhân lực,

nguyên liệu, chi phí …Về mặt tốn học xử lý yêu cầu loại nào cũng vậy. Ở đây ta nói theo
ngôn ngữ nhân lực chẳng hạn.
Thí Dụ III.1. Giả sử nhân lực cho các hoạt động của dự án ở Thí Dụ II.2 đòi hỏi như
sau:
Hoạt động Số nhân công Hoạt động số nhân công
(1, 2) 0 (4, 6) 2
(1, 3) 5 (4, 7) 1
(2, 4) 0 (5, 6) 2
(3, 4) 7 (5, 7) 5
(3, 5) 3 (6, 7) 6
Chú ý rằng tại thời điểm hai hoạt động cùng tiến hành thì số nhân lực cần là tổng hai
số công nhân. Vì vậy cần phải sắp xếp khéo các hoạt động không găng để đòi hỏi tổng
nhân công của cả dự án ít (tạm coi là mỗi người biết làm mọi việc). Việc sắp xếp tối ưu là
phức tạp, đến nay ta sử dụng biểu đồ thời gian biểu diễn thêm nhân lực để sắp xếp theo
trực quan. H.1.6 (a) biểu diễn tổng công nhân cần ở mỗi thời điểm nếu tất cả các hoạt động
không găng xếp vào lúc sớm nhất có thể, còn H.1.6 (b) là tương ứng khi xếp vào lúc muộn
nhất có thể. Hai biểu đồ này nên vẽ thẳng dưới H.1.5 nữa. Sắp đặt sớm nhất ở hình (a) cho
thấy ở mỗi thời điểm dự án cần nhiều nhất là 10 công nhân còn ở sắp đặt muộn nhất (b) là

×