Một phương án phân phối áocho các học sinh có độ lệch cực tiểu là chọn áo có kích thước vai nhỏ nhấtphát cho học sinh có kích thước vai nhỏ nhất.. − Ý tưởng 2 Thuật toán tham lam + Tìm h
Trang 1
-BÀI TẬP LỚNBài toán phân phối áo áp dụng phương
Trang 2Mục lục
LỜI NÓI ĐẦU 2
I PHƯƠNG PHÁP XẤP XỈ 2
1 Tỷ lệ xấp xỉ 2
2 Yêu cầu của thuật toán xấp xỉ: 2
II TÊN ĐỀ TÀI (Đề số 23) 2
III PHÂN TÍCH BÀI TOÁN 2
1 Các vấn đề của bài toán 2
2 Các ví dụ minh họa 2
3 Cách xây dựng các phương án phân phối áo 2
IV THUẬT TOÁN 2
1 Thuật giải cơ bản 2
2 Thuật giải mở rộng 2
3 Chứng minh tính đúng đắn 2
V ĐÁNH GIÁ, BÌNH LUẬN 2
1 Đánh giá thuật toán 2
2 Độ phức tạp thuật toán 2
3 Bình luận 2
VI THỬ NGHIỆM 2
1 Chương trình thử nghiệm 2
2 Các ví dụ thử nghiệm 2
VII KẾT LUẬN 2
TÀI LIỆU THAM KHẢO 2
Trang 3LỜI NÓI ĐẦU
Phân tích và đánh giá thuật toán là một trong những nhân tố quantrọng xác định được hiệu năng hệ thống khi giải quyết bài toán tin học đặt
ra Có nhiều bài toán (thuật toán) được đưa ra chỉ tốt ở một mức độ nào đóchấp nhận được Việc tính toán cho phép chấp nhận một sai số nào đó Vìvậy, thời gian gần đây phương pháp xấp xỉ được quan tâm và phát triểntrong một số ứng dụng Có rất nhiều bài toán mà ta có thể giải bằng phươngpháp này Trong đó phải đề cấp đến bài toán phân phối áo, đây là một bàitoán tối ưu hóa Bài toán được đặt tên từ vấn đề lựa chọn cách phân phối áosao cho kết quả thu được là độ lệch cực tiểu
Liên quan đến việc giải quyết bài toán này chúng ta có rất nhiềuphương án khác nhau như: Phương pháp sắp xếp (vun đống), phương pháptham lam …
Ở mỗi phương pháp đều có những ưu nhược điểm khác nhau Tuynhiên tất cả chỉ là những phương án tốt chứ chưa phải là phương án tối ưunhất
Trang 4I PHƯƠNG PHÁP XẤP XỈ
Thuật toán cho kết quả gần với kết quả tối ưu được gọi là thuật toán xấp xỉ
1 Tỷ lệ xấp xỉ
− Bài toán có thể có nhiều giải pháp
− Cần tối ưu hóa một hàm mục tiêu
− Giải pháp tối ưu là giải pháp mà cực đại (hoặc cực tiểu) hóa hàm mụctiêu
Đặt:
− C là giá trị của hàm mục tiêu của giải pháp xấp xỉ
− C* là giá trị của hàm mục tiêu của giải pháp tối ưu
Một thuật toán xấp xỉ có tỷ lệ xấp xỉ, ký hiệu (n), với bất kỳ dữ liệu vàokích thước n là:
max(C
C¿, C
¿
C )≤ρ(n)
+ Bài toán cực tiểu hóa: C ≥ C* > 0, khi đó (n)=C/C*C/C*
+ Bài toán cực đại hóa: C* ≥ C > 0, khi đó (n)=C/C*C*/C
Một thuật toán với tỷ lệ xấp xỉ (n) được gọi là thuật toán xấp xỉ-(n)
Ta luôn có: (n) ≥ 1
Nếu (n) càng nhỏ thì giải pháp xấp xỉ càng gần với giải pháp tối ưu.Thuật toán xấp xỉ-1 cho giải pháp tối ưu (nghĩa là (n)=C/C*1)
2 Yêu cầu của thuật toán xấp xỉ:
Một thuật toán xấp xỉ phải thoả mãn các yêu cầu sau đây:
− Dễ tính, dễ chương trình hoá
− Ước lượng được sai số gặp phải
− Tính được thời gian chạy của thuật toán
− Chứng minh được tính đúng đắn của thuật toán
Trang 5II TÊN ĐỀ TÀI (Đề số 23)
Người ta may sẵn n cái áo với các kích thước vai V(1), V(2), …, V(n)
cho n học sinh Các học sinh này được đánh số từ 1 tới n và có kích thước
vai là p(1), p(2), …, p(n) Nếu học sinh i nhận được áo j thì độ lệch vai cho trường hợp này sẽ là |V(i)-p(j)| Một phương án phân phối áo cho các học sinh 1,2, n được mô tả như một hoán vị 1 , 2 , …, n với hàm ý học sinh i
nhận được áo i Độ lệnh phương án này được định nghĩa bằng:
max {|V(i) – p( i )|, i=1,2, ,n}
Hãy xây dựng thuật toán phân phối áo cho các học sinh sao cho độ lệnh
là cực tiểu Đánh giá độ phức tạp của thuật toán xây dựng được
III PHÂN TÍCH BÀI TOÁN
1 Các vấn đề của bài toán
− Dữ liệu đầu vào là hai dãy số V(1), V(2), …, V(n) và p(1), p(2), …, p(n) tương ứng với kích thước vai áo và kích thước vai của n học
sinh
− Đầu ra bài toán là đưa ra phương án phân phối áo cho học sinh với độlệnh là cực tiểu
− Giải pháp phân phối áo cho học sinh như thế nào
− Cách tính độ lệnh cực tiểu của các phương án
− Xây dựng thuật toán phân phối áo cho các học sinh sao cho độ lệnh làcực tiểu
− Đánh giá được độ phức tạp của thuật toán
− Khả năng nâng cao số phần tử tối đa của hai mảng dữ liệu đầu vào cóthể lên đến 1.000.000 phần tử Do vậy, bài toán phải tính đến khảnăng không thể chứa hết trong bộ nhớ quy ước
2 Các ví dụ minh họa
Ví dụ 1:
Kích thước vai áo có số thứ tự là: V(1,2…8) =C/C* {19, 8, 6, 11, 9, 13, 5, 14} Kích thước vai học sinh có số thứ tự là: p(1,2 8) =C/C* {15, 4, 3, 2, 6, 5, 1, 10}
Trang 6Phương án 1:
Phân phối các áo có kích thước vai V 1 , V 2 , V 8 tương ứng với các học
sinh kích thước vai p 1 , p 2 , p 8
Khi đó độ lệnh của phương án phân phối là
d1 =C/C* max {|V(i) – p( i )|, i=1,2, ,8}
d1 =C/C* max {(19–15), (8–4), (6–3), (11–2), (9–6), (13–5), (5–1), (14–10)} =C/C* 9 Phương án 2:
Sắp xếp kích thước vai áo, vai học sinh theo thứ tự tăng dần và đánh
số lại theo thứ tự, ta có:
Kích thước vai áo có số thứ tự là: V(1,2…8)=C/C* { 5, 6, 8, 9, 11, 13, 14, 19} Kích thước vai học sinh có số thứ tự là: p(1,2 8)=C/C* { 1, 2, 3, 4, 5, 6, 10, 15}
Phân phối các áo có kích thước vai V 1 , V 2 , V 8 tương ứng với các học
sinh kích thước vai p 1 , p 2 , p 8
Khi đó độ lệnh của phương án phân phối là :
d2 =C/C* max {|V(i) – p( i )|, i=1,2, ,8}
d2 =C/C* max {(5–1), (6–2), (8–3), (9–4), (11–5), (13–6), (14–10), (19–15)} =C/C* 7 Phương án 3 :
Tìm áo có kích thước nhỏ nhất trong dãy V1 V8 =C/C* Vmin1=C/C* 5
Tìm học sinh có kích thước vai nhỏ nhất trong dãy p1…p8 =C/C* pmin1=C/C* 1
Phát áo có kích thước Vmin 1 cho học sinh có kích thước vai pmin 1
Thực hiện tương tự với các dãy còn lại có kết quả :
Trang 7Khi đó độ lệnh của phương án phân phối là :
d3=C/C* max {|V(i) – p( i )|, i=1,2, ,8} = max {|Vmin(α) – pmin(α)|, α=1,2, ,8}
Phân phối các áo có kích thước vai V 1 , V 2 , V 10 tương ứng với các
học sinh kích thước vai p 1 , p 2 , p 10
Khi đó độ lệnh của phương án phân phối là
d1 =C/C* max {|V(i) – p( i )|, i=1,2, ,10}
d1 =C/C* max {(12–2), (8–5), (10–3), (17–6), (13–11), (27–23), (33–16), (42–20), (19–9), (22–19)} =C/C* 22
Trang 8Khi đó độ lệnh của phương án phân phối là:
d2 =C/C* max {|V(i) – p( i )|, i=1,2, ,10}
d2 =C/C* max {(3–2), (8–5), (10–6), (11–9), (17–12), (19–13), (19–16), (27–20),(33–22), (42–23)} =C/C* 19
Phương án 3 :
Tìm áo có kích thước nhỏ nhất trong dãy V1 V10 =C/C* Vmin1=C/C* 2
Tìm học sinh có kích thước vai nhỏ nhất trong dãy p1…p10 =C/C* pmin1=C/C* 3
Phát áo có kích thước Vmin 1 cho học sinh có kích thước vai pmin 1
Thực hiện tương tự với các dãy còn lại có kết quả :
Khi đó độ lệnh của phương án phân phối là :
d3=C/C* max {|V(i) – p( i )|, i=1,2, ,10} = max {|Vmin(α) – pmin(α)|, α=1,2, ,10}
d3=C/C* max {|2 - 3|, |8 -5|, |10 -6|, |11 -9|, |17 -12|, |19 -13|,|19 - 16|, |27 - 20|, |33-22|, |42 -23|} =C/C* 19
Nhận xét: Trong phương án trên thì phương án 2 (phương án sắp xếp lại hai
dãy theo thứ tự tăng dần (không giảm)) và phương án 3 (phương pháp thamlam) là phương án cho kết quả có độ lệnh nhỏ hơn
3 Cách xây dựng các phương án phân phối áo
Sắp xếp n cái áo theo chiều không giảm của kích cỡ vai, sắp xếp các họcsinh theo chiều không giảm của kích cỡ vai Một phương án phân phối áocho các học sinh có độ lệch cực tiểu là chọn áo có kích thước vai nhỏ nhấtphát cho học sinh có kích thước vai nhỏ nhất Sau đó tiến hành tương tự vớicác áo và học sinh còn lại
Trang 9IV THUẬT TOÁN
1 Thuật giải cơ bản
Lần lượt phát áo cho học sinh theo quy tắc:
- Học sinh thứ 1 được nhận áo thứ 1;
- Học sinh thứ 2 được nhận áo thứ 2;
- ………
- Học sinh thứ n nhận áo thứ n
Tính độ lệch của phương án
− Ý tưởng 2 (Thuật toán tham lam)
+ Tìm học sinh có kích thước vai nhỏ nhất trong n học sinh
+ Tìm chiếc áo có kích thước vai nhỏ nhất trong n chiếc áo
+ Phát chiếc áo vừa tìm được cho học sinh vừa tìm được
+ Tìm học sinh có kích thước vai nhỏ nhất trong n-1 học sinh còn lại+ Tìm chiếc áo có kích thước vai nhỏ nhất trong n-1 chiếc áo còn lại+ Phát chiếc áo vừa tìm được cho học sinh vừa tìm được
+ Thực hiện các bước trên cho đến khi không còn học sinh & áo
1.2 Thuật giải bằng lời cho ý tưởng 1:
− Input: Hai dãy số nguyên V1, V2, V3,… Vn; p1, p2, p3,…pn;
− Ouput: Độ lệnh cực tiểu d; mảng đã được sắp xếp tương ứng với
phương pháp phân phối áo
Trang 104 Bước 4: Tính độ lệch của từng học sinh, tính độ lệch lớn nhất
(độ lệch của phương án phân phối áo)
1.3 Thuật giải giả mã cho ý tưởng 1:
* Input: mảng số nguyên V[1 n],p[1 n] số nguyên n
* Output: mảng số nguyên đã săp xếp V[1 n],p[1 n] độ lệnh d;
{Sử dụng thuật toán Sắp xếp vun đống(HeapSort) để sắp xếp hai mảng kích thước của vai áo và vai học sinh vì thuật toán vun đống được đánh giá là có
Trang 11proc Build_Initial_Heap( X:mang, n: tri so)
Trang 12Output
d; V[1],p[1]; V[2],p[2]; …; V[n],p[n];
− Input: Hai dãy số nguyên V 1 , V 2 , V 3 ,… V n ; p 1 , p 2 , p 3 ,…p n;
− Ouput: Độ lệnh cực tiểu d; Phương án phân phối áo V(1),p(1); V(2),p(2); … V(n),p(n) (kết quả này đã đánh thứ tự lại số thứ tự của học
sinh)
Thuật toán:
1 Bước 1: Tìm áo có kích thước vai áo nhỏ nhất.
2 Bước 2: Tìm học sinh có kích thước vai nhỏ nhất.
3 Bước 3: Tính độ lệch vai áo của cặp áo và kích thước vai tìm
được
4 Bước 4: Thực hiện tương tự với số áo và học sinh còn lại.
1.5 Thuật giải giả mã cho ý tưởng 2:
* Input: Mảng số nguyên V[1 n],p[1 n] số nguyên n
* Output: Độ lệnh cực tiểu d; Phương án phân phối áo V(1),p(1); V(2),p(2);
…; V(n),p(n) (kết quả này đã đánh thứ tự lại số thứ tự của học sinh).
Trang 137.Greedy(X,Y,n-1);
Output d;
2 Thuật giải mở rộng
Đối với thuật toán 1: Thuật toán cơ bản áp dụng khi toàn bộ dữ liệu
của mảng V[ ] và mảng p[ ] có thể chứa được trong toàn bộ bộ nhớ quy ước
(640KB) Trong trường hợp số phần tử của X lớn hơn khả năng chứa của bộnhớ này (ví dụ n 1.000.000), thì việc sắp xếp với dữ liệu đầu vào là dãy
V[ ] và p[ ] với số lượng n lớn thì khi đó chúng ta không thể áp dụng thuần
túy thuật giải cơ bản được, mà sẽ phải mở rộng thuật giải sắp xếp cho hai
mảng V[ ] và mảng p[ ].
Thuật giải mở rộng này chủ yếu liên quan đến cách thức tải dữ liệu từ file ra
bộ nhớ và sắp xếp Ý tưởng chính sẽ là chia dãy V và p thành các dãy con
có độ dài MAXP (max length of part) thỏa mãn: bộ nhớ quy ước đủ chứatoàn bộ mỗi dãy con Khi đó, ta sẽ áp dụng thuật giải HeapSort cho các dãycon này
Đối với ý tưởng 2: Thuật toán có thể giải quyết được với số lượng lớn
của bộ dữ liệu đầu vào bằng việc xét từng phần tử Tuy nhiên thuật toán sẽphải trả giá bằng độ phức tạp lớn hơn
Nhận xét: Qua hai thuật toán xây dựng được thì việc giải quyết bài toán tùy
thuộc vào đặc thù bài toán cụ thể đặt ra, dữ liệu đầu vào ta có thể chọn thuậttoán cho phù hợp Xét về độ phức tạp của thuật toán thì thuật toán 1 xâydựng được có độ phức tạp nhỏ hơn so với thuật toán 2
3 Chứng minh tính đúng đắn
Sắp xếp tập p và V theo thứ tự tăng dần (không giảm).
Không mất tính tổng quát, giả sử theo thứ tự p(i), V(i), i=C/C*1…n là thứ tự sau
Trang 14d =C/C* max{|V(i)- p( i )|, i=1,2}.
Ta có các độ lệch vai tương ứng như sau:
d1=C/C* max{|V(1)- p(1) |,|V(2)- p(2) |} và d2=C/C* Max{|V(2)- p(1) |,|V(1)- p(2) |}Giả sử p(1) ≤ p(2) và V(1)≤ V(2) thì ta chứng minh được: d1 ≤ d2 trong mọitrường hợp
Trang 15Nhận xét: Như vậy trong tất cả các trường hợp thì ta luôn được d1 ≤ d 2.
3.2 Xét các phương án phân phối áo với n nghĩa là cho áo có kích thước
V(1),V(2)…V(n) và học sinh có kích thước vai là p(1), p(2),…,p(n) và
ta có độ lệch.
Gọi độ lệch của phương án sắp xếp hai mảng kích thước áo và kích
thước vai áo là d= max{|V(i)- p(i)|, k=1,n}=|V(k)-p(k)|.Giả sử tồn tại một phương án phân phối áo khác mà cho ta giá trị d’=C/C* max{|V(i)- p(i)|, k=1,n}=V(j)-p(j) nhỏ hơn d như vậy theo chứng minh trên thì chỉ V(k),V(j)
và p(k),p(j) cùng tăng hoặc cùng giảm (V(k)≤ V(j) và p(k)≤p(j) hoặc V(j)≤ V(k) và p(j)≤p(k)) Mặt khác d’ là trường hợp khác không phải là trường
hợp được sắp xếp vậy điều giả sử là sai Như vậy phương pháp sắp xếp cho
ta lời giải tối ưu
Việc chọn chiếc áo có kích thước nhỏ nhất cho người có kích thướcvai nhỏ nhất sẽ cho độ lệch nhỏ nhất mà học sinh có kích thước vai nhỏ nhất
có thể nhận đươc áo Tiến hành tương tự cho đến hết n học sinh thì cho tamột dãy các độ lệch kích thước áo và vai áo nhỏ nhất Vì thế mà chọn giá trịlớn nhất của các giá trị độ lệch ấy sẽ cho ta độ lệch phương án nhỏ nhấtnhận đươc
Nhận xét: Vậy thuật toán đã xây dựng đúng đắn.
Trang 16V ĐÁNH GIÁ, BÌNH LUẬN
1 Đánh giá thuật toán
− Input: Dữ liệu đầu vào của thuật toán là hai dãy số nguyên với kích thước n được xác định trước, số n là một số nguyên không lớn hơn
1.000.000
− Output: Dữ liệu đầu ra của thuật toán này là tìm được độ lệch và
phương án phân phối các áo
− Tính xác định: Mỗi bước của thuật toán được thực hiện đơn giản và
chỉ bao gồm 3 phép toán: phép so sánh, phép gán và phép trừ Đó làcác phép so sánh để sắp xếp các dãy số nguyên, tính độ lệch củaphương án sắp xếp
− Tính khả khi: Các phép toán của thuật toán chỉ sử dụng phép gán,
phép so sánh và phép trừ trên tập số nguyên, đều là những phép toánthông thường
− Tính dừng: Dữ liệu vào là dãy số nguyên có kích thước n thì theo cả
thuật toán trình bày ở trên ta luôn đưa ra kết quả
2 Độ phức tạp thuật toán
Trong thuật giải 1, Thuật toán gồm 2 bước chính là sắp xếp dãy số không
giảm (2 dãy) và so sánh giá trị phần tử thứ k của dãy 1 với phần tử thứ k
của dãy 2 (k =C/C*1,2,… n)
Để giảm độ phức tạp của thuật toán, ta chọn phương pháp sắp xếp vun đống
(Heapsort) với số phép so sánh đối với mỗi dãy là =C/C* nlog 2 n
Trang 17Trong thuật giải thuật 2, ta thấy rằng phép chủ yếu số phép so sánh
Qua 2 thuật toán xây dựng được, thì thuật toán 1 (sắp xếp) được cải thiện
về độ phức tạp tính toán hơn thuật toán số 2 (tham lam)
Trang 18VI THỬ NGHIỆM
1 Chương trình thử nghiệm
Chương trình thử nghiệm cài đặt trên ngôn ngữ C++
Chương trình thử nghiệm gồm:
− File mã nguồn chương trình: PhanPhoiAo.dev
− File chạy chương trình: PhanPhoiAo.exe
− Các file dữ liệu đầu vào được tạo sẵn để thử nghiệm: 10.txt, 20.txt,
50.txt, 100.txt, 500.txt, 1000.txt, 10000.txt, 100000.txt
Cách chạy chương trình như sau:
− Chạy file PhanPhoiAo.exemàn hình chương trình như sau:
− Chọn chức năng: Nhấn phím 1 để phân phối áo dựa trên 1 file lưu
trữ kích thước vai áo và kích thước vai học sinh có sẵn bằng thuậttoán 1 (*.txt)
− Chọn chức năng:Nhấn phím 2 phân phối áo dựa trên thuật toán 1 cho
bộ dữ liệu ngẫu nhiên với kích thước được nhập từ bàn phím
− Chọn chức năng:Nhấn phím 3 để phân phối áo dựa trên 1 file lưu trữ
kích thước vai áo và kích thước vai học sinh có sẵn bằng thuật toán 2(*.txt)
− Chọn chức năng:Nhấn phím 4 phân phối áo dựa trên thuật toán 2 cho
bộ dữ liệu ngẫu nhiên với kích thước được nhập từ bàn phím
− Chọn chức năng: Nhấn phím 5 để thoát chương trình.
Trang 19− Các dòng tiếp theo là các giá trị V[i],p[i]; i = 2,3, … n.
Cách phân phối áo sẽ được in ra màn hình và độ lệch của phân phối áo đócùng thời gian thực hiện
Môi trường thử nghiệm:Intel® Core ™ i5, 8GB RAM, Windows 7 x64
Trang 20Chọn chức năng: 1 - File: 100.txt (Thời gian chạy 152ms)
Trang 21Chọn chức năng: 1 - File: 100000.txt (Thời gian chạy 46220ms)
Trang 23Chọn chức năng: 2 - Nhập 20 (Thời gian chạy 18ms)
Trang 24Chọn chức năng: 2 - Nhập 100 (Thời gian chạy 150ms)
Trang 26Chọn chức năng: 2 - Nhập 100000 (Thời gian chạy 40963ms)
Trang 28Chọn chức năng: 2 - Nhập 1000000 (Thời gian chạy 452258ms)
Trang 29Chọn chức năng: 3 - File: 20.txt (Thời gian chạy 21ms)
Trang 30Chọn chức năng: 3 - File: 100.txt (Thời gian chạy 158ms)