Phương pháp tham lam giải bài toán lập lịch công việc
1. SEMINAR
Sử dụng phương pháp tham lam để giải quyết
bài toán lập lịch công việc.
SVTH: Nguyễn Danh Thanh
2. Nội Dung
1 Phát biểu bài toán
2 Giải quyết bài toán
3 Chứng minh tính đúng đắn
4 Tính toán độ phức tạp
5 Giới thiệu chương trình
6 Ứng dụng thực tế
3. 1. Phát biểu bài toán
1.1 Bài toán
Cho n việc cần phải hoàn thành, mỗi việc
thực hiện trong 1 đơn vị thời gian. Việc i sẽ đem
lại wi tiền thưởng nếu hoàn thành đúng hạn di .
[?].Tìm cách thực hiện các công việc để có lợi
nhuận cao nhất mà thời gian thực hiện là ít nhất.
4. 1. Phát biểu bài toán
1.2 Ví dụ
Làm việc nào trước đây
!!!!......
5. 1. Phát biểu bài toán
1.3 Input/Output
Input: n bộ {i , di , wi }
i = 1…n; di € N+ ; wi € Z+.
Output: B, T.
i: Công việc thứ i.
di: Thời điểm kết thúc công việc i.
wi: Số tiền được thưởng nếu hoàn thành công việc i.
B: Lịch thực hiện công việc sao cho T là lớn nhất.
T: Tổng số tiền được thưởng.
6. 2. Giải quyết bài toán
2.1 Ý tưởng 30s
Bước 1: Xác định tất cả các lịch có thể tạo ra từ n công việc.
Bước 2: Tính tổng số phần thưởng ở mỗi lịch.
Bước 3: So sánh tổng phần thưởng ở các lịch -> Đưa ra lịch cần tìm
và tổng tiền thưởng tương ứng.
7. 2. Giải quyết bài toán
2.2 Ý tưởng 30s
Xếp n công việc vào n thời điểm ta có n! cách -> có n! lịch.
Với n = 3 -> 3! = 6
n = 10 -> 10! = 3 628 800
n = 60 -> 60! = 8.32 x 1081
……………………………
n = 10000 ?
Có cách khác không ?
8. 2. Giải quyết bài toán
2.3 Sử dụng phương pháp tham lam
- Sắp xếp lại lịch theo chiều không tăng của phần thưởng wi. Thay đổi
i và di tương ứng.
- Xét trục thời gian B[m]. m = max(di), k=0.
+ Nếu giờ b[di] trên B rỗi thì gán b[di] = i.
+ Nếu giờ b[di] trên B đã bận thì tìm giờ b[j] (j< di) rỗi gần b(di)
nhất.
Nếu tồn tại giờ b[j] thì gán b[j] = i.
Ngược lại c[k++]= i.
- Dồn các việc i trên B để tạo lịch làm việc trù mật.
- Bổ xung các việc trên C vào B.
9. 2. Giải quyết bài toán
2.3 Sử dụng phương pháp tham lam !
Thời gian(h) 1 2 3 4 5 6 7 8 9
Công việc
Tiền thưởng ($)
Công việc (i)
Thời hạn (di)
Tiền thưởng (wi)
5
3
90
6
7
60
3
4
50
4
6
40
2
2
40
8
2
30
1
4
20
7
9
10
1
4
20
2 5 3 4 6 7
30 40 90 50 40 60 10
8 1
20
Tổng tiền thưởng : T = 320!
10. 2. Giải quyết bài toán
2.4 Giải thuật:
1. Sort W, wi > =wj . vs j > i. and change ai ,di
2. T = 0; m = max(di); B[i] = 0, i = 0…m, k = 0.
For i = 1 to n do
j = di
while B[j] > 0 do - - j.
if j = 0 then C[k++] = ai .
else
B[j] = ai .
T += wi .
Exit for
3. f0 = 0,
For i = 1 to m do
if B[i] > 0 then B[f0++] = B[i].
4. B = B +C.
Return B, T.
11. 3. Chứng minh tính đúng đắn
1.Thời gian thực hiện n công việc là ít nhất.
Lịch làm việc trù mật.
Thời điểm bj thực hiện chỉ công việc i.
N công việc.
=> Thời gian thực hiện là n đvtg.
2.Phần thưởng nhận được là lớn nhất.
Xét {ci}. i =1…n ci > cj .
Tại mỗi bước chọn pi, wi đạt max.
Tổng phần thưởng nhận được là lớn nhất
12. 4. Độ phức tạp thuật toán
4.1 Độ phức tạp thời gian
1. Sort W, wi > =wj . vs j > i. and change ai ,di
2. T = 0; m = max(di); B[i] = 0, i = 0…m, k = 0.
For i = 1 to n do
j = di
while B[j] > 0 do - - j.
if j = 0 then C[k++] = ai .
else
B[j] = ai .
T += wi .
Exit for
3. f0 = 0,
For i = 1 to m do
if B[i] > 0 then B[f0++] = B[i].
4. B = B +C.
Return B, T.
O(n.m)
O(m)
Độ phức tạp O(n.m)
O(nlogn)
13. 4. Độ phức tạp thuật toán
4.2 Độ phức tạp không gian
1 mảng lưu n thời hạn kết thúc O(n)
1 mảng lưu n phần thưởng tương ứng O(n)
1 mảng trục thời gian m O(m)
1 mảng lưu công việc trễ k=|m-n| O(k)
Độ phức tạp không gian: O(n)
14. 5. Giới thiệu chương trình
• Ngôn ngữ lập trình C++
• Dữ liệu đầu vào
• Đầu ra
15. 5. Giới thiệu chương trình
5.2 So sánh kết quả
Thời gian mili giây
16. 6. Ứng dụng thực tế
• Xếp thời gian biểu
• Lập lịch cho CPU