Ý tưởng phương pháp tham lam Các giải thuật tối ưu hóa thường đi qua một số bước với một tập các khả năng lựa chọn tại mỗi bước.. Sơ đồ chung của giải thuật tham lamDạng các bài toán g
Trang 1CÁC CHIẾN LƯỢC
THIẾT KẾ GIẢI THUẬT
1
CHƯƠNG 5
Trang 2Nội dung
Giải thuật tham lam
Giải thuật quay lui (backtracking)
Giải thuật nhánh và cận
2
Trang 3Giải thuật tham lam (Greedy Algorithm)
Ý tưởng phương pháp
Lược đồ giải thuật
Các ví dụ
Trang 4Ý tưởng phương pháp tham lam
Các giải thuật tối ưu hóa thường đi qua một số bước
với một tập các khả năng lựa chọn tại mỗi bước Một giải thuật tham lam thường chọn một khả năng mà xem như tốt nhất tại lúc đó
Tức là, giải thuật chọn một khả năng tối ưu cục bộ với
hy vọng sẽ dẫn đến một lời giải tối ưu toàn cục
Vài thí dụ của giải thuật tham lam:
- Giải thuật Prim để tính cây bao trùm tối thiểu
- Giải thuật Dijkstra để giải bài tóan những lối đi ngắn nhất
từ một đỉnh nguồn (single-source shortest paths problem).
Trang 5Ý tưởng phương pháp tham lam
Lưu ý
Phương pháp tham lam thường được áp dụng rộng
rãi trong các bài toán tối ưu
Trong một số trường hợp, không tìm được nghiệm
đúng bài toán mà chỉ là nghiệm “tốt”.
Việc giải bài toán theo phương pháp tham lam
tránh được bùng nổ tổ hợp và khá hiệu quả
Trang 6Sơ đồ chung của giải thuật tham lam
Dạng các bài toán giải bằng giải thuật Tham Lam
Giả sử ta phải chọn một tập con R của các phần tử của một tập
S = (s1, s2, ,sn )
sao cho :
Tập R thỏa mãn một điều kiện ràng buộc W(R) nào đó;
Một hàm mục tiêu Z(R) đạt giá trị tối ưu (cực đại hoặc cực
tiểu)
Trang 7Sơ đồ
Bước 1: Chọn một phần tử s có lợi nhất cho lời giải trong bước đó sao cho phần tử này cùng với lời giải tối ưu của bài toán với tập con S−{s} với ràng buộc W(R−{s }) và hàm mục tiêu Z(R−{s}) là lời giải tối ưu của bài toán
Bước 2: Tiếp tục tìm phần tử tiếp theo có lợi nhất với tập con
S = S−{s} với ràng buộc W=W(R−{s}) và hàm mục tiêu Z
= Z(R−{s}) Cho đến khi không thể tìm được phần tử như vậy hoặc tập S = φ
Trang 8Lược đồ giải thuật –bỏ
Greedy(A, S) // A is the candidate set, S is the solution
Trang 9Các ví dụ:Bài toán lựa chọn công việc
Bài toán:
Giả sử rằng ta có một tập S = { 1,2, n} của n công việc sử dụng cùng một tài nguyên, ví dụ như một phòng họp, tại một thời điểm chỉ có một công việc được tiến hành Các công việc i được bắt đầu tại thời điểm si và kết thúc tại thời điểm fi với si ≤ fi Nếu được chọn, công việc i sẽ chiếm khoảng thời gian là [si, fi)
Hãy lựa chọn các công việc không mâu thuẫn nhau (nghĩa là hoạt
động i và j là tương thích nếu khoảng thời gian [si,fi] và [sj, fj]
không phủ lấp lên nhau(tức là i và j là tương thích nếu si >= fj hay
sj >= fi) sao cho số các công việc được chọn là nhiều nhất.
INPUT: Thời gian khởi đầu s[1 n]; Thời gian kết thúc f[1 n]
Trang 10Tính chất lời giải
Giả sử dãy công việc sắp xếp tăng dần theo thời điểm kết thúc :
f1 ≤ f2 ≤ ≤ fn
1. Luôn tồn tại một lời giải tối ưu chứa công việc thứ nhất
2. Nếu A ⊂ S là lời giải tối của bài toán có chứa việc 1 thì A – {1} là lời giải tối ưu của bài toán với tập S’ gồm các công việc bắt đầu từ thời điểm f1 trở đi
Trang 11Bài toán xếp lịch hoạt động
Thời gian bắt đầu và kết thúc của mội công việc
• Các hoạt động tương thích tối đa mà có thể hoàn thành là:
• {a3, a9, a11} chứa các hoạt động tương thích với nhau nhưng chưa phải là tập con tối đa
• {a1, a4, a8’ a11} là tập con tối đa nhưng không phải duy nhất
• Vì {a2, a4, a9’ a11} cũng chứa các hoạt động tương thích
Trang 120 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Trang 16Các bước của thuật giải tham lam
1. Xác định cấu trúc tối ưu của bài toán
2. Xây dựng lời giải đệ qui
3. Chứng minh với bất kỳ lời gọi đệ qui, một lựa chọn
tối ưu là một lựa chọn tham lam Vì vậy nó luôn đảm bảo để tạo một lựa chọn tham lam
4. Chỉ ra rằng duy nhất một bài toán con sau khi chọn
tham lam là khác rỗng
5. Phát triển lời giải đệ qui để thực hiện giải thuật
tham lam
Trang 17Bước 1: Xây dựng cấu trúc tối ưu
Tìm Optimal structure để xây dựng 1 lời giải tối ưu cho bài toán từ những lời giải tối ưu của các bài toán con
Gọi Sij là tập con của các hoạt động trong S có thể bắt đầu sau khi hoạt động ai kết thúc và trước khi hoạt động aj bắt đầu
Sij chứa các hoạt động tương thích với ai và aj và cũng tương thích với tất cả các hoạt động kết thúc không muộn hơn và bắt đầu không sớm hơn bắt đầu của aj
Trang 18 Giả sử các hoạt động được sắp xếp theo thứ tự tăng thời gian kết thúc của các hoạt động
Để tìm cấu trúc con cho bài toán xếp lịch, khảo sát các bài toán con Sij khác rỗng và giả thuyết lời giải Sij chứa một số hoạt động ak sao cho fi<sk<fk<sj
Từ ak có thể chia thành 2 bài toán con: Sik và Skj, mỗi bài toán con chứa 1 tập con các hoạt động Sij Lời giải cho Sij là tổ hợp của lời giải Sik và Skj cùng với chính hoạt động ak
Giả sử có một lời giải tối ưu Aij cho tập Sij (có chứa hoạt động ak) Khi đó các lời giải aik của tập Sik và akjcủa tập Skj mà được dùng cho lời giải tối ưu cho tập Sij cũng phải tối ưu
Bước 1: Xây dựng cấu trúc tối ưu
Trang 19Bước 2: Lời Giải Đệ Qui
Tìm các tập con kích cỡ tối đa Aik và Akj chứa các hoạt động tương thích nhau cho mỗi bài toán con
Tạo tập kích cỡ tối đa Aij chứa các hoạt động tương thích
Trang 20 Chọn hoạt động am trong Sij có thời gian hoàn thành sớm nhất, rồi tìm lời giải cho bài toán con Smj Hoạt động được chọn theo cách tham lam nghĩa là nó làm tối đa thời gian còn lại chưa được xếp lịch để được xếp lịch cho nhiều hoạt động khác.
Loại bỏ những hoạt động chưa được xếp lịch (bị trùng lắp)
Lặp lại quá trình trên
Bước 2: Lời Giải Đệ Qui
Trang 210 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Trang 28Xây dựng Thuật giải Greedy
Trang 29Thủ tục Greedy-activity-selector
• Hoạt động được chọn bởi thủ tục
GREEDY-ACTIVITY-SELECTER thường là hoạt động với thời điểm kết thúc sớm
nhất mà có thể được xếp lịch một cách hợp lệ Hoạt động
được chọn theo cách “tham lam” theo nghĩa nó sẽ để lại cơ hội để xếp lịch cho được nhiều hoạt động khác
• Giải thuật tham lam không nhất thiết đem lại lời giải tối ưu
Tuy nhiên thủ tục GREEDY-ACTIVITY-SELECTOR thường tìm được một lời giải tối ưu cho một thể hiện của bài toán xếp lịch các hoạt động
Trang 30Bư ớ c 3: Chứ ng minh tính tối ư u
• Chứng minh giải thuật sử dụng hai thuộc tính sau:
• Bài toán có cấu trúc tối ưu (optimal
structure)
• Thuật giải thỏa mãn thuộc tính chọn
tham lam (greedy-choice)
Chứng minh bài toán có 2 thuộc tính này , có thể dùng giải thuật tham lam đẻ giải quyết
Trang 31Optimal Substructures
Một bài toán thể hiện cấu trúc tối ưu
( optimal substructure) nếu lời giải tối ưu của bài toán lớn luôn chứa trong nó những lời giải tối ưu của bài toán con
Nếu A ⊂ S là lời giải tối của bài toán có chứa
việc 1 thì A’ = A – {1} là lời giải tối ưu của bài toán với tập S’ gồm các công việc bắt đầu từ thời điểm f1 trở đi (nghĩa là S’={i ∈ S: si ≥ f1})
Trang 32Thuộc tính Greedy-Choice
Tạo lựa chọn tốt nhất tại một thời điểm, giải các bài
toán con được phát sinh từ lựa chọn đó
Lựa chọn được tạo ra bởi giải thuật tham lam có thể phụ thuộc vào những lựa chọn ở xa nhưng nó không thể phụ thuộc vào bất kỳ lựa chọn sẽ được phát sinh hay những lời giải của bài toán con
Dạng top-down mỗi lần chọn tham lam một cái
làm bài toán nhỏ đi
Trang 33Optimal Substructures
Trang 34Bài toán cái túi dạng phân số
(Fractional knapsack problem)
Trong bài toán cái túi dạng phân số, tình tiết cũng như vậy, nhưng
kẻ trộm có thể lấy đi một phần của một món hàng
Cả hai bài toán đều có tính chất tiểu cấu trúc tối ưu
• Đối với bài toán cái túi dạng 0-1, xét một tổ hợp nặng M ký mà
đem lại giá trị cực đại Nếu ta lấy món hàng thứ j ra khỏi túi,
những món hàng còn lại cũng là tổ hợp đem lại giá trị lớn nhất ứng với trọng lượng tối đa M - wj mà kẻ trộm có thể lấy đi từ n-1 loại mặt hàng trừ mặt hàng thứ j.
• Đối với bài toán cái túi dạng phân số, xét trường hợp khi ta lấy
ra khỏi túi w j -w ký của mặt hàng thứ j, những món hàng còn lại cũng là tổ hợp đem lại giá trị lớn nhất ứng với trọng lượng M – (w j –w) mà kẻ trộm có thể lấy đi từ n-1 loại mặt hàng trừ mặt hàng thứ
j.
Trang 35Bài toán cái túi dạng phân số (tt.)
Ta dùng giải thuật tham lam cho bài toán cái túi dạng phân số
và qui hoạch động cho bài toán cái túi dạng 1-0
Trang 36Bài toán cái túi dạng phân số (tt.)
• Để giải bài toán cái túi dạng phân số, trước tiên ta tính
hệ số giá trị tiền trên một đơn vị trọng lượng (vi/wi) của từng mặt hàng
• Kẻ trộm bắt đầu bằng cách lấy càng nhiều càng tốt mặt hàng có hệ số vi/wi lớn nhất Khi loại mặt hàng này đã cạn mà kẻ trộm còn có thể mang thêm được nữa thì y
sẽ lấy càng nhiều càng tốt mặt hàng có hệ số vi/wi lớn nhì và cứ như thể cho đến khi y không còn có thể mang thêm nữa
Trang 37Bài toán cái túi dạng phân số (tt.)
v i /w i =60/10=6
v i /w i =100/20=5
v i /w i =120/30=4
Trang 38procedure GREEDY_KNAPSACK(V, W, M, X, n);
/* V, W are the arrays contain the values and weights of n objects
ordered so that Vi/Wi ≥ Vi+1/Wi+1 M is the knapsack capacity and X is solution vector */
Bỏ qua thời gian sắp thứ tự các món hàng, giải thuật này có độ phức tạp O(n)
var rc: real; i: integer;
Trang 39Mã nén Huffman
Mã Huffman được sử dụng rộng rãi và là một kỹ thuật rất hiệu quả đối với việc nén dữ liệu Nó có thể tiết kiệm được tới 20% − 90% tùy theo từng file bị nén
Huffman đề xuất một thuật toán tham lam sử dụng một bảng tần suất xuất hiện của các ký tự để xây dựng lên một sơ đồ tốt nhất biểu diễn các ký tự bằng một xâu nhị phân.
Trang 40Nội dung
Mã tiền tố
Mã tiền tố tối ưu
Giải thuật của Huffman xây dựng cây biểu diễn
mã tiền tố tối ưu
Các kỹ thuật khi cài đặt thủ tục sinh bộ mã
Huffman
Trang 41Mã tiền tố
Mã tiền tố của một bộ n kí tự là bộ mã nhị phân của các kí tự đó sao cho từ mã của kí tự này không phải
là tiền tố của từ mã một kí tự khác.
Ví dụ: từ mã của A=‘001’, B=‘0010’ thì từ mã của
A là tiền tố của từ mã của B không thỏa mãn định nghĩa mã tiền tố.
Trang 42Biểu diễn mã tiền tố bằng cây nhị phân
Mỗi bộ mã nhị phân tiền tố của n kí tự có thể biểu diễn bằng một cây nhị phân n lá
Khi đó mỗi kí tự được đặt vào một lá của cây sao cho nếu gán nhãn cho các cạnh trái của cây bởi
‘0’, cạnh phải bởi ‘1’, thì từ mã của mỗi kí tự là dãy các nhãn nằm trên đường đi từ gốc của cây nhị phân tới mỗi lá đặt kí tự ấy.
Trang 43Mã tiền tố biểu diễn bởi cây nhị phân
1 0
0
HONGHAI → 00|01|100|101|00|110|111
Trang 44Mã tiền tố tối ưu
Giả sử một văn bản dùng n ký tự khác nhau c[1 n], trong đó kí tự c[i] xuất hiện k[i] lần
Giả sử bộ mã tiền tố m[1 n] mã hóa kí tự c[i] bằng từ
mã m[i] có độ dài d[i] (bít)
Tổng số bít để mã hóa toàn bộ văn bản là
k
w
1
] [
* ] [
W gọi là giá của bộ mã m[1 n]
Bộ mã có giá nhỏ nhất được gọi là mã tiền tố tối ưu
Trang 47Ví dụ 2 x 1000 lần
cần 300.000 bits để mã hóa cả file
Trang 48Giải thuật của Huffman xây dựng cây biểu diễn mã tiền tố tối ưu
Trang 49Giải thuật
1. Khởi tạo: Tạo một rừng gồm n cây, có trọng số tại các
đỉnh, mỗi cây có một nút ứng với một ký tự với trọng số bằng tần số của ký tự đó
Trang 50Giả mã c ho g iải thuật Huffman
Q là hàng đợi ưu tiê n theo tần s ố nhỏ của các kí tự.
Thủ tục ExtracMin(Q) lấy phần tử có tần s ố nhỏ nhất của Q ra khỏi
Q.
Thủ tục Insert(Q,z) chè n phần tử z vào hàng đợi ưu tiê n Q
Trang 51Độ phức tạp thời gian của giải
thuật
Việc tạo hàng đợi ưu tiên Q dưới dạng đống
cực tiểu mất O(n) thời gian;
Vòng lặp For gồm n-1 bước
Mỗi bước trong vòng For thực hiện việc xuất
phần tử nhỏ nhất và vun lại đống mất O(ln n)
thời gian
Do đó vòng For mất O(n lg n) thời gian
Độ phức tạp thời gian là O(n lg n)
Trang 52Building the Encoding Tree
Trang 57Ví dụ minh họa giải thuật Huffman
Xây dựng cây mã Huffman để mã hóa từ:
N 3
H 2
A
1
G 1
G 1
H 2
N 3
D 3
A 1
I 2
Trang 58Bước 1 D
3
I 2
N 3
H 2 A
1
G 1
7 2
D 3
N 3
H 2
I 2 A
1
G 1
7 2
8 4
Bước 2
Bước 1: Sắp xếp theo trọng số, Nút A
và G có trọng số nhỏ nhấtthêm vào nút mới là 7 có trọng số là 1+1 =2
Bước 2: nút mới thêm là nút sô 8,
trọng số là 2+2 =4
Trang 59Bư ớ c 3
N
3
Bư ớ c 4
I 2 A
1
G 1
7
2
8 4
D 3
H 2
9 5
D 3
H 2
9 5
N 3
I 2 A
1
G 1
7 2
8 4
10 7
Bước 3: nút mới thêm là nút
sô 9, trọng số là 2+3 = 5 Bước 4: nút mới thêm là nút
sô 10, trọng số là 3+4 = 7
Trang 60Kết quả
H=00 D=01 N=10 A=1100 G=1101 I=111
Bư ớ c
5
D 3
I 2 A
1
G 1
7 2
8 4
10 7
11 12
Trang 61Các kỹ thuật khi cài đặt thủ tục mã Huffman
Biểu diễn cây nhị phân bằng mảng theo quan hệ con
Trang 62Biểu diễn cây nhị phân bằng mảng
Cây mã Huffman, lúc đầu là một rừng gồm n lá, ở mỗi bước xây dựng cây ta hợp hai cây thành một cây,sau n-1 bước ta chỉ còn một cây Vì mỗi bước ta thêm một nút mới, nên tổng cộng ta thêm n-1 nút, do vậy cây Huffman cuối cùng có 2n-1 nút Ta dùng một mảng gồm 2n-1 phần tử để lưu cấu trúc cây này
Trong ví dụ đã làm với n=6, cây Huffman có 2*6-1=11 nút, các nút đã có (là lá trong cây Huffman) được đánh số từ 1 đến 6, mỗi lần sinh thêm một nút ta đánh số thứ tự tiếp theo
từ 7 đến 11
Trang 63Lưu trữ cấu trúc cây Huffman vào mảng Huff
Ta dùng một mảng đặt tên là Huff[1 11] lưu trữ cấu trúc của cây
Ở bước 1 trong ví dụ ta lấy hai nút số 1(A) và số 3(G), thêm nút mới là nút số 7, nút số 1(A) là con trái của nút số 7, nút số 3(G) là con phải của nút số 7 Để ghi lại tình trạng này ta đặt
Huff[1]:= -7, Huff[3]:= 7 Hai nút này cùng cha nhưng nút trái ứng với giá trị âm của chỉ số nút cha, nút phải ứng với giá trị dương
Trang 64Xây dựng mảng Huff
D 3
H 2
9 5
N 3
I 2 A
1
G 1
7 2
8 4
10 7
11 12
Trang 65Dựa vào mảng Huff xây dựng bộ
mã Huffman tương ứng
Gọi từ mã của ký tự thứ i là BiCode[i]
Chẳng hạn với i=1 ta tìm từ mã BiCo[1] như sau:
Vì Huff[1]=-7<0 nên đỉnh 1 là con trái của đỉnh 7, vì thế bít tận cùng bên phải của từ mã là 0, nghĩa là BiCode[1]=‘*0’ Tiếp theo, Huff[7]=-8<0, nên bít thứ hai bên phải của từ mã vẫn là 0, nghiã là BiCode[1]=‘*00’ Tiếp theo Huff[8]:= 10>0, nên bít thứ ba từ phải là 1, vậy từ mã là Bicode[1]=‘*100’ Tiếp theo Huff[10]=11>0 nên bít thứ tư từ phải là 1, vậy BiCode[1]=‘*1100’ Đến đây 11 là đỉnh gốc của cây Huffman nên quá trình dừng lại, ta có BiCode[1]=‘1100’
i 1 2 3 4 5 6 7 8 9 10 11 Huff -7 9 7 -9 8 -10 -8 10 -11 11
Trang 66Thủ tục lập bảng mã Huffman từ mảng Huff[1 2n-1]
Pro c e dure Co ding;
Trang 67Chọn phần tử nhỏ nhất
Trong giải thuật Huffman, ở mỗi bước ta chọn ra hai cây con
có trọng số ở gốc nhỏ nhất để hợp lại thành một cây Nếu chọn theo phương pháp bình thường nhất n phép so sánh, do
đó riêng việc chọn phần tử nhỏ nhất mất:
n+2(n-1)+2(n-1)+2(n-3)+ +2.2+2=n+(n-1)(n-2)/2 = O(n2) phép so sánh
Để giảm độ phức tạp tính toán ta xây dựng một đống (HEAP) cực tiểu (đống có trọng số mỗi nút không lớn hơn trọng số các con của nút ấy)
Trang 68Tao một đống
cực tiểu
Từ cây theo thứ tự tự nhiên bên trái, vun thành đống cực tiểu bên phải
Ch A D G H I N Count 1 3 1 2 2 3
1 A
3
D
1 G
1 A
2
H
1 G
Trang 69Khai báo một mảng Heap[1 n]
Thủ tục vun lại đống tại đỉnh k, vớ i Heap c ó h phần tử
Proc edure DownHeap(k,h);
v:=Heap(k); w=Count[j]; i:=k;
while 2*i<= h do
begin j:=2*i;
if j<n and Count[j] > Count[j+1] then j:=j+1;
if v> Count[j] then Heap[i]:= Heap[j] else break ;
i:= j
end;
Heap(i):=v;
Thủ tục tạo đống
Proc edure MakeHeap;
For i:=1 to n do Heap[i]:=i;
For k:=int(n/2) down to 1 do DownHeap(k,n);
Mã để tạo một đống cực tiểu