Tải bản đầy đủ (.doc) (17 trang)

Báo cáo môn phân tích đánh giá thuật toán

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 (623.52 KB, 17 trang )

HỌC VIỆN KỸ THUẬT QUÂN SỰ
KHOA CÔNG NGHỆ THÔNG TIN

BÁO CÁO MÔN HỌC

PHÂN TÍCH VÀ ĐÁNH GIÁ THUẬT TOÁN
Đề tài
PHƯƠNG PHÁP XẤP XỈ. BÀI TOÁN CÁI TÚI: CÓ N ĐỒ VẬT VỚI KÍCH
THƯỚC S1, ..., SN. VÀ CÁC TÚI CÓ SỨC CHỨA T. GIẢ THIẾT RẰNG SI
≤ T, ∀ I =1, 2, ...,N. TÌM CÁCH XẾP CÁC ĐỒ VẬT VÀO TÚI SAO CHO
SỐ TÚI PHẢI SỬ DỤNG LÀ ÍT NHẤT

Giáo viên hướng dẫn: PGS.TS. Đào Thanh Tĩnh
Học viên:

Phạm Thị Linh

Lớp:

Cao học CNTT-K25B

Hà Nội, 05/2014


Phương pháp xấp xỉ giải bài toán cái túi

MỤC LỤC
I.CHƯƠNG I: MÔ HÌNH BÀI TOÁN...................................................................4
1.Bài toán.............................................................................................................4
2.Ý tưởng.............................................................................................................4
3. Mô tả thuật toán...............................................................................................4


II.CHƯƠNG II: PHƯƠNG PHÁP XẤP XỈ GIẢI BÀI TOÁN CÁI TÚI...............5
1.Phát biểu bài toán.............................................................................................5
2.Một số thuật toán giải quyết bài toán...............................................................5
2.1. Phương pháp chọn theo kinh nghiệm........................................................5
2.2 Phương pháp sắp xếp theo khối lượng đồ vật.............................................6
III.CHƯƠNG III: CÀI ĐẶT CHƯƠNG TRÌNH..................................................10
1.Giới thiệu chương trình..................................................................................10
1.1.Cấu trúc chương trình...............................................................................10
1.2.Cách chạy chương trình............................................................................12
2.Một số kết quả thực nghiệm...........................................................................12

Phạm Thị Linh

2


Phương pháp xấp xỉ giải bài toán cái túi

LỜI NÓI ĐẦU
Trong những năm gần đây, các phương pháp tối ưu hoá ngày càng được áp
dụng sâu rộng và hiệu quả vào các ngành kinh tế, kỹ thuật, công nghệ thông tin
và các ngành khoa học khác. Các phương pháp tối ưu là công cụ đắc lực giúp
người làm quyết định có những giải pháp tốt nhất về định lượng và định tính
trong đó phương pháp xấp xỉ là một phương pháp tìm lời giải gần tối ưu cho một
bài toán. Thời gian gần đây, phương pháp xấp xỉ phát triển nhanh chóng liên
quan tới việc ứng dụng rộng rãi các máy tính có tốc độ cao trong các tính toán
khoa học và kĩ thuật. Có rất nhiều bài toán mà ta có thể giải bằng kĩ thuật,
phương pháp này. Trong đó phải đề cập đến bài toán cái túi (Knapsack), hay còn
gọi là bài toán xếp ba lô đây là một bài toán tối ưu hoá tổ hợp. Bài toán được đặt
tên từ vấn đề chọn những gì quan trọng có thể nhét vừa vào trong một cái túi (với

giới hạn khối lượng) để mang theo trong một chuyến đi.
Liên quan đến việc giải bài toán này chúng ta có rất nhiều phương án khác
nhau như: Phương pháp quy hoạch động, thuật toán xấp xỉ thời gian đa thức đầy
đủ, phương pháp nhánh cận, phương pháp tham lam...
Ở mỗi phương pháp đều có những ưu và nhược điểm riêng. Tuy nhiên nói
chung chúng ta chỉ đạt được một phương án tốt chứ chưa hẳn là tối ưu.
Tiểu luận môn học này của em đề cập tới “ Phương pháp xấp xỉ. Bài toán
cái túi: có n đồ vật với kích thước s1, ..., sn. và các túi có sức chứa T. Giả thiết
rằng si ≤ T, ∀ i =1, 2, ...,n. Tìm cách xếp các đồ vật vào túi sao cho số túi phải
sử dụng là ít nhất”. Tiểu luận gồm các phần chính sau đây:
Chương 1: Mô hình bài toán
Chương 2: Phương pháp xấp xỉ giải bài toán cái túi
Chương 3: Cài đặt chương trình chạy
Báo cáo đã hoàn thành các yêu cầu, nhiệm vụ đề ra. Tuy nhiên, với thời
gian có hạn, báo cáo chưa thể trình bày đầy đủ chi tiết các thuật toán xấp xỉ, rất
mong được sự đóng góp ý kiến của thầy giáo và các bạn học viên.

Phạm Thị Linh

3


Phương pháp xấp xỉ giải bài toán cái túi

I. CHƯƠNG I: MÔ HÌNH BÀI TOÁN
1. Bài toán
Cho tập A bao gồm n đối tượng A1,A2....,An (n ∈ N*), cần tìm một tập nghiệm S
⊆ A tốt nhất thỏa mãn các yêu cầu của bài toán.
2. Ý tưởng
Thực hiện qua các bước như sau:

 Bước 1: Khởi tạo S = ∅
 Bước 2: Thực hiện cho đến khi A = ∅
2.1. Chọn đối tượng {x} tốt nhất trong A.
2.2. Loại bỏ {x} khỏi A.
2.3. Kiểm tra nếu S ∪ {x} là nghiệm thì kết nạp {x} vào S.
3. Mô tả thuật toán
- Input: tập A gồm n đối tượng A1, A2…An.
- Output: tập S ⊆ A là một nghiệm của bài toán.
- Selection(A): hàm lựa chọn một đối tượng tốt nhất trong A thỏa mãn hàm mục
tiêu nào đó.
Procedure GK( A, n)
Begin
S = ∅;
While ( A ≠ ∅ ) do
Begin
x = Selection(A);
A = A /{x};
If ( S ∪ {x} là nghiệm ) then S = S ∪ {x};
End
End
Như vậy ta thấy ở mỗi bước ta cố thêm vào một đối tượng tốt nhất, kết quả
cũng như độ phức tạp của phương pháp xấp xỉ phụ thuộc chủ yếu vào hàm mục
tiêu.
Phạm Thị Linh

4


Phương pháp xấp xỉ giải bài toán cái túi


II. CHƯƠNG II: PHƯƠNG PHÁP XẤP XỈ GIẢI BÀI TOÁN
CÁI TÚI
1. Phát biểu bài toán
Có n đồ vật (n ∈ N*), mỗi đồ vật có khối lượng tương ứng là: c1, c2, ...cn
và n túi có cùng trọng tải T. Mỗi đồ vật có khối lượng không quá T. Cần xếp đồ
vật vào túi sao cho cần ít túi nhất.
2. Một số thuật toán giải quyết bài toán
2.1. Phương pháp chọn theo kinh nghiệm
a. Tư tưởng thuật toán
- Tìm vật c[i] có kích thước lớn nhất và nhỏ hơn hoặc bằng sức chứa của túi
đang có dc[j] (tức là c[i] <= dc[j]). Khi đó ta cho vật a[i] vào túi dc[j].
- Nếu vật thứ c[i+1] mà có kích thước lớn hơn kích thước túi dc[j] thì ta cho vật
vào túi dc[j+1]. Cứ như vậy cho đến khi không còn đồ vật nào cả và các túi đã
đầy.
b. Đánh giá
- Nếu n là lớn, con người không thể làm được vì mất quá nhiều thời gian.
- Kết quả: theo kinh nghiệm thì kết quả đạt mức tối ưu.
c.Ví dụ minh hoạ
Sức chứa của túi T=1. Có 8 đồ vật với kích thước tương ứng như sau:
Đồ vật thứ
Khối lượng

Phạm Thị Linh

1
0.2

2
0.2


3
0.2

4
0.2

5
0.3

6
0.4

7
0.8

8
0.5

5


Phương pháp xấp xỉ giải bài toán cái túi
0.2
0.2
0.2

0.4(6)
0.2

0.8(7)

Túi 1
Kích thước=1

0.5(8)
Túi 2 Kích
thước =0.9

0.3(5)
Túi 3
Kích thước =0.9

2.2 Phương pháp sắp xếp theo khối lượng đồ vật
2.2.1 Sắp xếp tăng dần
a. Tư tưởng thuật toán
- Sắp xếp các vật c[i] theo chiều tăng dần của khối lượng.
- Duyệt các đồ vật từ 1 đến n.
- Bắt đầu từ túi j=1, nếu túi dc[j] + c[i] <=dc[j] thì cho vật c[i] vào túi dc[j].
Ngược lại túi dc[j] + c[i] > dc[i] thì ta xét túi tiếp theo.
- Quá trình lặp lại cho đến khi (i = n) là kết thúc.
b. Mô tả thuật toán
Input:
 Cho n đồ vật
 Gọi c là mảng chứa kích thước của n đồ vật (c1, c2, …, cn) .
 Gọi T là sức chứa tối đa của 1 túi.
Output:
 Gọi dc là mảng chứa kích thước đang có của n túi (dc1, dc2, … ,
dcn).
 Gọi mảng sh là mảng lưu trữ thông tin vật nào đã được xếp vào túi
nào.
c. Thuật toán sắp xếp tăng dần

SXtangdan(c);
Phạm Thị Linh

6


Phương pháp xấp xỉ giải bài toán cái túi

j=1;
For i=1 to n
{
kt=true;
while (kt) {
If ( dc[j] + c[i] <=T) {
dc[j] = dc[j] +c[i];
sh[i] = j;
kt =false;
}
Else j++;
}
}
d.Ví dụ minh hoạ
Có 8 đồ vật, sức chứa của túi T=1.Các vật có kích thước tương ứng: 0.2, 0.2,
0.2, 0.2, 0.3, 0.4, 0.8, 0.5. Xếp các đồ vật theo thứ tự tăng dần kích thước
Đồ vật thứ
Sắp xếp các vật tăng
dần theo kích thước

1


2

3

4

5

6

7

8

0.2

0.2

0.2

0.2

0.3

0.4

0.5

0.8


0.2(4)
0.2(3)
0.4(6)
0.2(2)
0.2(1)

0.3(5)

Túi 1
Kích thước =0.8

Túi 2
Kích thước =0.7

0.5(7)
Túi 3
Kích thước =0.5

0.8(8)
Túi 4
Kích thước =0.8

e. Đánh giá thuật toán
- Với phương pháp sắp xếp tăng dần thì cho kết quả không tối ưu
- Khi n là lớn thì ta mất nhiều thời gian để sắp xếp mảng và cần bộ nhớ lớn để
lưu trữ dữ liệu.
- Độ phức tạp của thuật toán này là O(n).
2.3.2 Sắp xếp giảm dần
a. Tư tưởng thuật toán
Phạm Thị Linh


7


Phương pháp xấp xỉ giải bài toán cái túi

- Sắp xếp mảng c[ ] theo chiều giảm dần của kích thước đồ vật.
- Duyệt các vật từ 1 đến n.
+ Nếu vật c[i] mà cho được vào túi dc[j] thì thực hiện cho vào túi dc[j].
+ Nếu vật c[i] không thể thêm vào túi dc[j] thì ta xét xem túi dc[j+1]
nếu cho vào được thì ta thêm vật c[i] vào túi dc[j+1].
- Lặp đi lặp lại với các vật c[i+1] tiếp theo cho đến khi i = n.
b. Mô tả thuật toán
SX giamdan(c);
for i=1 to n
{
j = 1;
While (dc[j] + c[i] >T) do
j++;
dc[j] = dc[j] + c[i];
sh[i] = j;
}
c.Ví dụ minh hoạ (theo ví dụ trên)
Đồ vật thứ
Sắp xếp các vật giảm dần
theo kích thước

1

2


3

4

5

6

7

8

0.8

0.5

0.4

0.3

0.2

0.2

0.2

0.2

0.2(8)

0.2(7)
0.2(5)

0.4(3)
0.2(6)

0.8(1)

0.5(2)

Túi 1
Kích thước =1

Túi 2
Kích thước =0.9

0.3(4)
Túi 3
Kích thước =0.9

d. Đánh giá thuật toán
- Với phương pháp sắp xếp mảng c[ ] theo chiều giảm dần thì cho kết quả tối
ưu hơn so với thuật toán sắp xếp tăng dần.
- Thuật toán cũng mất nhiều bộ nhớ khi n là lớn.
Phạm Thị Linh

8


Phương pháp xấp xỉ giải bài toán cái túi


- Độ phức tạp của thuật toán là O(n).

Phạm Thị Linh

9


Phương pháp xấp xỉ giải bài toán cái túi

III. CHƯƠNG III: CÀI ĐẶT CHƯƠNG TRÌNH
1. Giới thiệu chương trình
1.1.

Cấu trúc chương trình

Chương trình thử nghiệm cài đặt trên ngôn ngữ Java, dùng trình biên dịch
Net Bean gồm cấu trúc thư mục như sau:

Hình 1.

Cấu trúc mã nguồn chương trình

+ File binpacking.java: File main để chạy chương trình.
+ File Bpack.java: File chứa nội dung của các thuật toán
+ Các file trong thư mục com.group22.binpacking.comarator: Các cách sắp
xếp cho các thuật toán tương ứng.
+ File Bin.java, BinItem.java: Entity của Hộp và Đồ vật.
+ File BinCapacityException.java: Bắt lỗi khi chạy chương trình


Phạm Thị Linh

10


Phương pháp xấp xỉ giải bài toán cái túi

Hình 2.

Cấu trúc thư mục chương trình chạy

+ Thư mục log: lưu file log kết quả chạy của chương trình
+ Thư mục lib: chứa thư viện của chương trình
+ File chạy chương trình: BinParking.bat, BinParking.jar
+ File input.txt là tệp dữ liệu đầu vào, gồm các tham số sau:
 Dòng đầu tiên là Sức chứa của túi: T
 Dòng thứ hai là Tham số Random: sử dụng trong trường hợp
random số lượng vật với kích thước nhỏ hơn T.
 Dòng thứ ba là kích thước của các đồ vật: các kích thước được ngăn
cách bởi dấu phẩy. Sử dụng trong trường hợp người dùng muốn tạo
dữ liệu test bằng tay.
Chú ý: Lựa chọn 1 trong 2 dòng hai và ba để nhập dữ liệu đầu vào. Đặt dấu #
đầu dòng để đánh dấu không dùng cách nhập tương ứng.
VD: File dữ liệu có nội dung như hình sau được hiểu là:
- Các túi có sức chứa T =1000
- Random danh sách 1000 đồ vật có kích thước nhỏ hơn T.

Hình 3.

Phạm Thị Linh


File dữ liệu đầu vào

11


Phương pháp xấp xỉ giải bài toán cái túi

1.2.

Cách chạy chương trình

Giải nén file BinPacking.rar
 Bước 1: Nhập dữ liệu vào file BinPacking\Group22\input.txt
 Bước 2: Chạy file BinPacking\Group22\BinParking.bat
 Bước 3: Đọc log kết quả chạy của chương trình trong thư mục
BinPacking\Group22\log\ BinPacking.log bằng trình soạn thảo hỗ trợ file
.txt

Hình 4.

Nội dung file log

2. Một số kết quả thực nghiệm
- Kích thước túi: 10
- Random: 10
- Kết quả:

Phạm Thị Linh


12


Phương pháp xấp xỉ giải bài toán cái túi

Hình 5.

File log kết quả khi túi có kích thước =10

- Kích thước túi: 100
- Random: 100
- Kết quả:

Phạm Thị Linh

13


Phương pháp xấp xỉ giải bài toán cái túi

Hình 6.

File log kết quả khi túi có kích thước =100

- Kích thước túi: 1000
- Random: 100
- Kết quả:

Phạm Thị Linh


14


Phương pháp xấp xỉ giải bài toán cái túi

Hình 7.

Phạm Thị Linh

File log kết quả khi túi có kích thước =1000

15


Phương pháp xấp xỉ giải bài toán cái túi

Phạm Thị Linh

16


Phương pháp xấp xỉ giải bài toán cái túi

KẾT LUẬN
Nghiên cứu, thiết kế giải thuật và đánh giá độ phức tạp của từng giải thuật
là một vấn đề hết sức quan trọng. Sau quá trình nghiên cứu bài toán, các thuật
toán áp dụng, em nhận thấy, thực tế không có thuật toán nào là luôn tốt nhất cả,
vấn đề là trong phạm vi Bài toán nào thì thuật toán nào đó sẽ có lợi hơn. Ngay cả
trong bài toán cái túi thuật toán được đánh giá là tốt: Phương pháp quy hoạch
động sẽ không còn tốt nếu cái túi C có sức chứa quá lớn… thì thời gian chạy của

nó là không thể chấp nhận được bởi bộ nhớ của máy tính chỉ có giới hạn. Và
phương pháp này không thể làm việc được khi C và khi các mặt hàng là những số
thực. Vì vậy khó có thể áp dụng chỉ một thuật toán cho yêu cầu trên một bài toán,
và với mỗi yêu cầu, sẽ có một hoặc một vài thuật toán sẽ tỏ ra tốt hơn so với các
thuật toán khác. Trong phạm vi bài tập này em mới chỉ tìm hiểu và nghiên cứu
được một vài phương pháp để giải bài toán cái túi.
Em xin chân thành cảm ơn Thầy giáo Đào Thanh Tĩnh đã truyền đạt những
kiến thức quý giá về thuật toán, tư duy thiết kế và kỹ thuật đánh giá độ phức tạp
của những thuật toán tưởng như đã quá quen thuộc, với một bài toán đã trở thành
kinh điển trong vấn đề Quy hoạch động.
Hà Nội, tháng 05 năm 2014
Học viên thực hiện: Phạm Thị Linh

Phạm Thị Linh

17



×