1. Trang chủ
  2. » Luận Văn - Báo Cáo

Phát triển các kỹ thuật nhánh cận và ứng dụng

80 183 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 80
Dung lượng 1,04 MB

Nội dung

Việc truyền đạt các kiến thức về một số giải thuật như: quay lui,nhánh cận, quy hoạch động, tham lam, các giải thuật trên đồ thị … là rất cầnthiết cho học sinh trường Chuyên cũng như tro

Trang 1

ĐẠI HỌC THÁI NGUYÊN

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG

Phạm Chí Hiếu

PHÁT TRIỂN CÁC KĨ THUẬT NHÁNH CẬN VÀ ỨNG DỤNG

Chuyên ngành: Khoa học máy tính

Mã số: 60.48.01

LUẬN VĂN THẠC SĨ KHOA HỌC MÁY TÍNH

NGƯỜI HƯỚNG DẪN KHOA HỌC:

PGS TSKH Nguyễn Xuân Huy

Thái Nguyên – 2014

Trang 2

LỜI CAM ĐOAN

Tôi xin cam đoan đây là công trình nghiên cứu của riêng tôi Các kết quảtrong luận văn là trung thực, và chưa từng được ai công bố trong bất kỳ tàiliệu nào khác

Tôi xin cam đoàn rằng mọi sự giúp đỡ để hoàn thành luận văn này đãđược cảm ơn Các thông tin trích dẫn trong luận văn đã được ghi rõ nguồngốc

Học viên thực hiện luận văn

Phạm Chí Hiếu

Trang 3

MỤC LỤC

LỜI CAM ĐOAN i

DANH MỤC CÁC HÌNH iv

MỞ ĐẦU 1

1 Đặt vấn đề 1

2 Đối tượng và phạm vi nghiên cứu 2

3 Hướng nghiên cứu của đề tài 2

LỜI CẢM ƠN 3

CHƯƠNG 1 TỔNG QUAN KĨ THUẬT NHÁNH CẬN 4

1.1 Giới thiệu chung 4

1.2 Ý tưởng của thuật toán 5

1.3 Kĩ thuật tỉa nhánh 10

1.4 Kết hợp thuật toán nhánh cận vào thuật toán quay lui 11

1.5 Kết luận 13

CHƯƠNG II ÁP DỤNG KĨ THUẬT NHÁNH CẬN CHO MỘT SỐ BÀI TOÁN 14

2.1 Các bài toán khó

14 2.2 Bài toán Ba lô 16

2.2.1 Bài toán: 16

2.2.2 Phân tích bài toán Ba lô 17

2.2.3 Chương trình minh họa 22

2.3 Bài toán người du lịch (TSP) 25

2.3.1 Bài toán 25

2.3.2 Phân tích bài toán TSP 26

2.3.3 Chương trình minh họa 27

2.3.4 Cải tiến 29

Trang 4

ii2.4 Bài toán đổi tiền (ATM) 35

Trang 5

2.4.1 Bài toán 35

2.4.2 Phân tích bài ATM 35

2.4.3 Chương trình minh họa 36

2.5 Bài toán dãy ABC 40

2.5.1 Bài toán 40

2.5.2 Phân tích bài toán 40

2.5.3 Chương trình minh họa 41

2.6 Kết luận 44

CHƯƠNG 3 ỨNG DỤNG PHÁT TRIỂN NHÁNH CẬN

45 3.1 Thủ tục rút gọn

46 3.2 Thủ tục chọn cạnh phân nhánh (r,c)

50 3.3 Mô hình thuật toán 53

KẾT LUẬN 55

TÀI LIỆU THAM KHẢO 56

Trang 6

DANH MỤC CÁC HÌNH

Hình 1 Giải bài toán ba lô bằng nhánh cận 21

Hình 2 Giải bài toán người du lịch 31

Hình 3 Mô hình phân nhánh 46

Hình 4 Minh họa rút gọn hành trình 49

Hình 5 Minh họa rút gọn hành trình 2 51

Trang 7

Với học sinh phổ thông ở trường chuyên phải được trang bị các kiếnthức cơ sở về các loại cấu trúc dữ liệu và trang bị các kiến thức tiên tiến nhất

về giải thuật Việc truyền đạt các kiến thức về một số giải thuật như: quay lui,nhánh cận, quy hoạch động, tham lam, các giải thuật trên đồ thị … là rất cầnthiết cho học sinh trường Chuyên cũng như trong việc bồi dưỡng học sinhgiỏi các trường THPT (trung học phổ thông) để phát triển tư duy và lập trìnhgiải các bài toán tin học Hình thành những nét cơ bản của nghệ thuật đoánnhận giải thuật và nghệ thuật lập trình Tạo lập và củng cố lòng say mê tìmhiểu và khám phá cho học sinh khi giải các bài toán tin

Để giải một bài toán thông thường có nhiều cách tiếp cận Mỗi cách tiếpcận khác nhau cho kết quả với độ tối ưu khác nhau Với nhiều bài toán việctìm ra giải thuật tối ưu không phải việc đơn giản, do đó một kĩ năng cần thiết

để giải được một bài toán hoàn chỉnh là phải giải được bài toán ở kích thước

dữ liệu vừa phải Đây là sẽ những bộ dữ liệu thử mang tính định hướng chiếnlược cho việc giải bài toán Có rất nhiều bài toán, đặc biệt là bài toán tối ưu,

Trang 8

có thể giải ngay bằng thuật toán duyệt toàn bộ hoặc một phần của một bàitoán lớn Với phương pháp duyệt toàn bộ, điển hình là thuật toán quay lui cómột nhược điểm đó là độ phức tạp bài toán thường lớn, do đó kích thước bàitoán giải được rất hạn chế Để khắc phục nhược điểm chúng ta thường phải ápdụng kết hợp kĩ thuật nhánh cận (nhánh và cận)

Việc áp dụng kĩ thuật nhánh cận vào các bài toán bài toán thường khá

trừu tượng và khó hiểu với học sinh THPT Làm thế nào để có thể xây dựng

được một “cận” để có thể đánh giá được “độ tốt” của “nhánh” đang xét ? Làm thế nào có thể kết hợp kĩ thuật nhánh cận vào các bài toán duyệt quay lui hiệu quả ? Do đó tôi thấy việc phân tích, đánh giá và định hướng cách

tiếp cận một bài toán bằng kĩ thuật nhánh cận là rất cần thiết Từ đó nâng caochất lượng của việc dạy và học cho học sinh

Trong khuôn khổ luận văn thạc sĩ, tôi chọn đề tài nghiên cứu: “Phát triển các kĩ thuật nhánh cận và ứng dụng”.

2 Đối tượng và phạm vi nghiên cứu

Kĩ thuật nhánh cận và ứng dụng để giải một số bài toán liệt kê và tìmphương án tối ưu

3 Hướng nghiên cứu của đề tài

- Giới thiệu tổng quan kĩ thuật nhánh cận và các kỹ thuật liên quan

- Tổ chức bài toàn theo kĩ thuật nhánh cận

- Cách đánh giá cận của các bài toán khác nhau

- Cài đặt chương trình cho một số bài toán

Trang 9

3

Trang 10

để em học thêm được nhiều kinh nghiệm và sẽ hoàn thành tốt hơn.

Em xin chân thành cảm ơn!

Trang 11

CHƯƠNG 1 TỔNG QUAN KĨ THUẬT NHÁNH CẬN

1.1 Giới thiệu chung

Một trong những bài toán đặt ra trong thực tế là việc tìm ra một nghiệmthoả mãn một số điều kiện nào đó, và nghiệm đó là tốt nhất theo một chỉ tiêu

cụ thể, nghiên cứu lời giải các lớp bài toán tối ưu thuộc về lĩnh vực quyhoạch toán học Tuy nhiên cũng cần phải nói rằng trong nhiều trường hợpchúng ta chưa thể xây dựng một thuật toán nào thực sự hữu hiệu để giải bàitoán, mà cho tới nay việc tìm nghiệm của chúng vẫn phải dựa trên mô hìnhliệt kê toàn bộ các cấu hình có thể và đánh giá, tìm ra cấu hình tốt nhất Việcliệt kê cấu hình có thể cài đặt bằng các phương pháp liệt kê: Sinh tuần tự vàtìm kiếm quay lui

Thuật toán quay lui (backtracking) là chiến lược tìm nghiệm bài toán

bằng cách xét tất cả các phương án có thể Đó là một quá trình tìm kiếm theo

độ sâu trong một tập hợp các lời giải Trong quá trình tìm kiếm, nếu ta gặpmột hướng lựa chọn không thỏa mãn, ta quay lui về điểm lựa chọn nơi có cáchướng khác và thử hướng lựa chọn tiếp theo Khi đã thử hết các lựa chọnxuất phát từ điểm lựa chọn đó, ta quay lại điểm lựa chọn trước đó và thửhướng lựa chọn tiếp theo tại đó Quá trình tìm kiếm thất bại khi không cònđiểm lựa chọn nào nữa Đây là một thuật toán có thể áp dụng để giải rấtnhiều bài toán với kích thước dữ liệu thích hợp Ưu điểm của thuật toán làđảm bảo tìm ra nghiệm đúng chính xác Tuy nhiên, hạn chế là độ phức tạpthường lớn

Mô hình thuật toán quay lui là tìm kiếm trên một cây phân cấp Nếu giảthiết rằng ứng với mỗi nút tương ứng với một giá trị được chọn cho x[i] sẽứng với chỉ 2 nút tương ứng với 2 giá trị mà x[i+1] có thể nhận thì cây n cấp

sẽ có tới 2n nút lá, con số này lớn hơn rất nhiều lần so với dữ liệu đầu vào n

Trang 12

Chính vì vậy mà nếu như ta có thao tác thừa trong việc chọn x[i] thì sẽ phảitrả giá rất lớn về chi phí thực thi thuật toán bởi quá trình tìm kiếm lòng vòng

vô nghĩa trong các bước chọn kế tiếp x[i+1], x[i+2], … Khi đó, một vấn đềđặt ra là trong quá trình liệt kê lời giải ta cần tận dụng những thông tin đã tìmđược để loại bỏ sớm những phương án chắc chắn không phải tối ưu Kỹ thuật

đó gọi là kỹ thuật đánh giá nhánh cận trong tiến trình quay lui

Kĩ thuật Nhánh cận (Nhánh và cận – Branch and Bound) giúp chúng ta

đánh giá được nghiệm, do có thể cắt bỏ đi những phương án (nhánh) khôngcần thiết, việc tìm nghiệm tối ưu sẽ nhanh hơn, cải thiện được độ phức tạpthuật toán

Những bài toán tìm một nghiệm, liệt kê hoặc bài toán tối ưu là nhữnglớp bài toán có thể giải bằng Kĩ thuật Nhánh cận

1.2 Ý tưởng của thuật toán

Nhánh cận là kỹ thuật xây dựng cây tìm kiếm phương án tối ưu, nhưngkhông xây dựng toàn bộ cây mà sử dụng giá trị cận để hạn chế bớt các nhánh.Phương án là các khả năng có thể của bài toán, những phương án thỏayêu cầu được gọi là nghiệm của bài toán

Trong quá trình duyệt qua tất cả các phương án của bài toán, từ một nút

có thể phát sinh ra nhiều nút con khác nhau, mỗi nút con này có thể có nhiềunút con khác nữa Do đó, mỗi nút con này sẽ lại là gốc của một cây con Quátrình tìm kiếm này sẽ tạo ra một cây tìm kiếm Nếu ta có thể đánh giá để cắt

bỏ đi một nhánh con không khả thi thì số lượng phương án phải duyệt sẽ giảm

đi đáng kể

Với mỗi nút trên cây ta sẽ xác định một giá trị cận Giá trị cận là một giátrị gần với giá của các phương án Với bài toán tìm Min ta sẽ xác định cận

Trang 13

dưới, còn với bài toán tìm Max ta sẽ xác định cận trên Cận dưới là giá trị nhỏhơn hoặc bằng giá của phương án, ngược lại cận trên là giá trị lớn hơn hoặcbằng giá của phương án.

 Để giải bài toán tốt ta phải xác định cận càng sớm càng tốt

Ta sẽ mô tả chi tiết tư tưởng của thuận toán trên mô hình bài toán tối ưu

Với giả thiết về tập D ở trên, ta có thể sử dụng thuật toán quay lui để liệt

kê các phương án của bài toán Trong quá trình liệt kê theo thuật toán quaylui, ta sẽ xây dựng dần các thành phần của phương án Một bộ k thành phần(a1, a2, …, ak) xuất hiện trong quá trình thực hiện thuật toán sẽ gọi là phương

án bộ phận cấp k – Tiền tố của phương án

Thuật toán nhánh cận có thể áp dụng để giải bài toán đặt ra nếu như có

thể tìm được một hàm g xác định trên tập tất cả các phương án bộ phận của

bài toán thỏa mãn bất đẳng thức sau:

g(a 1 , a 2 , …, a k ) min {f(x): x D, x i = a i , i = 1, 2, …, k} (*)

với mọi lời giải bộ phận (a1, a2, …, ak) và với mọi k = 1, 2, …

Bât đẳng thức (*) có nghĩa là giá trị của hàm g tại phương án bộ phận(a1, a2, …, ak) là không vượt quá giá trị nhỏ nhất của hàm mục tiêu của bài

Trang 14

toán trên tập con các phương án Hay nói một cách khác, g(a 1 , a 2 , …, a k ) là cận dưới của giá trị hàm mục tiêu trên tập D(a 1 , a 2 , …, a k ) Do đó, hàm g

được gọi là hàm cận dưới, và giá trị g(a 1 , a 2 , …, a k ) được gọi là cận dưới của

tập D(a 1 , a 2 , …, a k ) Do có thể đồng nhất tập D(a 1 , a 2 , …, a k ) với phương án

bộ phận (a 1 , a 2 , …, a k ) nên ta cũng gọi g(a 1 , a 2 , …, a k ) là cận dưới của

phương án bộ phận (a 1 , a 2 , …, a k ).

Giả sử rằng đã có hàm g Ta xét cách sử dụng hàm này để giảm bớt khốilượng duyệt trong quá trình liệt kê các cấu hình tổ hợp (các phương án) củabài toán theo thuật toán quay lui Trong quá trình liệt kê các phương án có thể

đã thu được một số phương án của bài toán Gọi x là phương án với giá trị hàm mục tiêu nhỏ nhất trong số các phương án đã tìm được, kí hiệu f = f( x ).

Ta gọi x là phương án tốt nhất hiện có, còn f là kỷ lục Giả sử đã có f , khi

đó nếu g(a 1 , a 2 , , a k ) > f thì từ bất đẳng thức (*) ta suy ra:

f < g(a 1 , a 2 , …, a k ) min {f(x): x D, x i = a i , i = 1, 2, …, k}

Vì thế tập con các phương án của bài toán D(a 1 , a 2 , …, a k ) chắc chắn không

phải là phương án tối ưu Trong trường hợp này ta không cần tiếp tục phát

triển phương án (a 1 , a 2 , …, a k ), nói cách khác là ta có thể bỏ qua các phương

án trong tập D(a 1 , a 2 , …, a k ) trong quá trình tìm kiếm.

Để dễ hình dung, ta giả sử nghiệm của bài toán có thể biểu diễn dưới

dạng một vectơ (x 1 , x 2 , , x n ), mỗi thành phần x i (i = 1,2, , n) được chọn ra từ

tập S i Mỗi nghiệm của bài toán x = (x 1 , x 2 , ,x n ) được xác định “độ tốt” bằng

một hàm f(x) và mục tiêu cần tìm nghiệm có giá trị f(x) đạt giá trị nhỏ nhất

(hoặc đạt giá trị lớn nhất)

Trang 15

Tư tưởng của phương pháp nhánh và cận như sau: Giả sử, đã xây dựng

được k thành phần (x 1 , x 2 , ,x k ) của nghiệm và khi mở rộng nghiệm (x 1 , x 2 , ,x k+1 ), nếu biết rằng tất cả các nghiệm mở rộng của nó (x 1 , x 2 , ,x k+1, …) đều không tốt bằng nghiệm tốt nhất đã biết ở thời điểm đó, thì ta không cần

Việc đánh giá các nghiệm mở rộng đề cập ở trên chính là việc ta xây

dựng hàm g trong bất đẳng thức (*) Việc xây dựng này sẽ phụ thuộc vào từng

bài toán tối ưu tổ hợp cụ thể Thông thường ta sẽ cố gắng xây dựng nó saocho:

- Việc tính giá trị của g phải đơn giản hơn việc giải bài toán tối ưu tổ

hợp ở về phải của (*)

- Giá trị của g(a 1 , a 2 , …, a k ) phải sát với giá trị vế phải của (*)

Thuật toán nhánh cận có thể mô tả bằng mô hình đệ quy sau:

procedure BranchBound (i);

begin

<Đánh giá khả năng mở rộng các nghiệm>;

If (các phương án mở rộng đều không tốt hơn BestSol) then exit;

<Xác định S i >;

for X i S i do begin

Trang 16

<ghi nhận thành phần thứ i>;

if (tìm thấy nghiệm) then

<Cập nhật BestSol>

Trang 17

else BranchBound(i+1);

nghiệm mới tìm được

Hoặc với một cách khác như sau: [2]

Procedure Init;

Begin

<Khởi tạo một cấu hình xuất phát>;

end;

{Thủ tục này thử chọn cho x[i] tất cả các giá trị nó có thể nhận}

procedure Try(i: Integer);

Trang 19

end;

end;

<Ghi nhận việc thử x[i] = V nếu cần>;

Try(i + 1); {Gọi đệ quy, chọn tiếp x[i+1]}

<Bỏ ghi nhận việc thử cho x[i] = V (nếu cần)>;

đệ quy tìm tiếp hay ghi nhận kết quả làm gì Nghiệm của bài toán sẽ được làmtốt dần, bởi khi tìm ra một cấu hình mới (tốt hơn BestSolution ), ta không inkết quả ngay mà sẽ cập nhật BestSolution bằng cấu hình mới vừa tìm được

1.3 Kĩ thuật tỉa nhánh

Để có thể tỉa bớt nhánh (loại bỏ những hướng đi, trường hợp) của mộtbài toán liệt kê bằng đệ quy ta có nhiều phương pháp khác Nhưng chủ yếu làdựa vào những dữ liệu đã biết, kết hợp với việc phán đoán để có thể địnhlượng cho các giá trị cụ thể trong từng trường hợp

Định lượng để đánh giá độ tối ưu của một hướng đi (một nhánh) là mộtviệc khó của kĩ thuật nhánh cận Người lập trình chỉ có thể đánh giá được cận

Trang 20

của nhiều bài toán khi đã làm nhiều bài tập, từ đó đúc rút kinh nghiệm trong quá trình tìm cận.

Trong chương 2, một số bài toán sẽ được đưa ra để phân tích, tìm hiểucách đánh giá cận và phương pháp cài đặt Nhưng bài toán này sẽ mang tínhđịnh hướng phương pháp đánh giá cận cho nhiều bài toán sau

1.4 Kết hợp thuật toán nhánh cận vào thuật toán quay lui.

Mô hình chung của kỹ thuật cài đặt đệ quy quay lui [1]

Procedure Try(i); //xây dựng thành phần thứ i

Với mô hình đệ quy quay lui như trên ta có thể dễ dàng nhận ra đây là

mô hình liệt kê tất cả các cấu hình nghiệm có thể của nghiệm X = (x1, x2, … ,

xn), với mỗi thành phần xi thuộc tập Si Sau khi thực hiện thử giá trị cho thànhphần xi, mô hình trên sẽ tiến hành thử tiếp tất cả các giá trị cho thành phần

xi+1 Để tránh việc rẽ nhánh quá trình mà không hiệu quả ta hoàn toàn có thểtìm cách đánh giá việc đi tiếp (điền giá trị cho xi+1) có hiệu quả không tại vị trítrước dòng lệnh (1) hoặc trước dòng lệnh (2) Cụ thể như sau:

Trang 21

Procedure Try(i); //xây dựng thành phần thứ i [1]

Trang 22

1.5 Kết luận

Kĩ thuật nhánh cận, cũng như nhiều kĩ thuật khác trong lập trình nó chỉmang tính định hướng chiến lược để giải bài toán Đây là không phải là mộtcông cụ siêu việt để có thể giải tất cả các bài toán tìm nghiệm tối ưu hay liệt

kê Do đó, khi áp dụng, đòi hỏi người lập trình phải linh hoạt kết hợp thêmnhiều kĩ thuật, thuật toán khác nhau thì mới có thể đem lại kết quả tốt nhất

Trang 23

CHƯƠNG II ÁP DỤNG KĨ THUẬT NHÁNH CẬN CHO MỘT SỐ BÀI TOÁN

2.1 Các bài toán khó

Hiện này có nhiều bài toán có thể giải bằng các thuật toán trong thời gian đa

thức theo kích thước dữ liệu Ví dụ như:

- Bài toán Tìm cây khung ngắn nhất, giải bằng thuật toán Prim có độ phức tạp thuật toán là O(n2)

- Bài toán Tìm đường đi ngắn nhất trong đồ thị, giải bằng thuật toán

Hàm mũ có dạng: an với a>1 và n là kích thước dữ liệu của bài toán

Với những bài toán phải giải bằng các thuật toán với độ phức tạp là hàm mũ

thì thời gian giải tăng rất nhanh theo kích thước dữ liệu của bài toán

Mặc dù bất kì lời giải nào cho mỗi bài toán đều có thể được kiểmchứng nhanh chóng, nhưng hiện chưa có cách nào tìm ra được lời giải đó mộtcách hiệu quả Thời gian thực thi của tất cả các thuật toán hiện tại cho nhữngbài toán khó đều tăng rất nhanh theo kích thước bài toán Vì vậy ngay cả nhữngtrường hợp có kích thước tương đối lớn đã đòi hỏi thời gian hàng tỷ năm để giải

Trang 24

Do đó, việc xác định xem những bài toán này có thể được giải quyết nhanhchóng hay không là một trong những bài toán mở của khoa học máy tính hiệnnay.

Trang 25

Một số bài toán khó tiêu biểu với độ phức tạp là hàm mũ như:

1 Bài toán bè cực đại (MaxClique): Cho một đồ thị vô hướng G = (V, E)

V là tập các đỉnh, E là tập các cạnh tương ứng các đỉnh trong V Cần tìm bè lớnnhất của G Bè là tập các đỉnh trong đồ thị mà đôi một có cạnh nối với nhau (làmột đồ thị con đầy đủ trong đồ thị G)

2 Bài toán tập độc lập (Independent set): Cho đồ thị vô hướng G = (V, E)

và số nguyên K, hỏi có thể tìm được tập độc lập S với |S| ≥ K Tập độc lập làtập các đỉnh trong đồ thị mà chúng đôi một không có cạnh nối với nhau

3 Bài toán phủ đỉnh (Vertex cover): Ta gọi một phủ đỉnh của đồ thị vôhướng G = (V, E) là một tập con các đỉnh của đồ thị S V sao cho mỗi cạnhcủa đồ thị có ít nhất một đầu mút trong S Bài toán đặt ra là: Cho đồ thị vôhướng G = (V, E) và số nguyên k Hỏi G có phủ đỉnh với kích thước k haykhông?

Trang 26

Sau đây là cách áp dụng các kĩ thuật nhánh cận và tổ chức dữ liệu chomột số bài toán điển hình Những bài toán dưới đây mang tính chất tiêu biểucho lớp bài toán mà nó đại diện Từ đó giúp minh họa việc áp dụng các kĩthuật nhánh cận vào các bài toán thực tế Hơn nữa, giúp chúng ta sẽ có cáinhìn tổng quát hơn cho những bài toán có thể áp dụng các kĩ thuật nhánh cận.

2.2 Bài toán Ba lô

Bài toán Ba lô (Knapsack Problem) hay còn gọi là bài toán cái túi đãđược biết đến hơn một thế kỷ Nhưng đến thập niên 50 của thế kỷ XX, bàitoán này mới được nhà toán học Tobias Dantzig (1884–1956) định nghĩa đầy

đủ [7]

Bài toán này là một bài toán khó, chưa có thuật toán giải trong thời gian

đa thức theo kích thước của bài toán

2.2.1 Bài toán:

Cho một cái ba lô có thể đựng một trọng lượng b Có n đồ vật, mỗi đồ vật i có một số lượng không hạn chế, một trọng lượng a i nhất định và một giátrị ci nào đó Tìm một cách chọn lựa các đồ vật sao cho tổng trọng lượng của

các đồ vật không vượt quá b và có tổng giá trị là lớn nhất.

Dữ liệu: cho từ tệp văn bản BAG.INP

- Dòng đầu chứa 2 số nguyên dương n và b (n<100, b<32000)

- Dòng thứ hai chứa n số nguyên lần lươt là c1, c2, …, cn

- Dòng thứ ba chứa n số nguyên lần lượt là a1, a2, …, an

Các số trên cùng dòng cách nhau ít nhất 1 dấu cách

Kết quả: ghi ra tệp văn bản BAG.OUT gồm 2 dòng

- Dòng đầu ghi 1 số nguyên dương là tổng giá trị các đồ vật trong ba lô

Trang 27

- Dòng thứ hai ghi n số nguyên lần lượt là số lượng các đồ vật 1, 2, …,n.

2.2.2 Phân tích bài toán Ba lô

Nếu chấp nhận một kết quả gần đúng, ta hoàn toàn có thể giải bài toánnày theo phương pháp tham lam Và rất dễ thấy, tiêu chuẩn để chọn là giá đơn

vị cao Ta duyệt cao vật theo giá đơn vị từ cao xuống thấp Vật được chọn ta

sẽ lấy tối đa [3]

Với cách giải như trên, tùy vào từng trường hợp của dữ liệu, đôi khi ta

sẽ thu được kết quả tuyệt đối của bài toán

Trang 28

, j

1 j 1 max{ f ( x) c n n j x j : a j x j b, x j Z 1, 2, ,

Sau đây ta sẽ phân tích bài toán để tìm phương án áp dụng kĩ thuật nhánh

Mô hình toán học của bài toán có dạng sau: Tìm

f * , (1)

j

Trong đó :

Z+ là tập các số nguyên không âm

: là tổng giá trị của các đồ vật được chọn.

Trang 29

Để đảm bảo tính tổng quát ta giả thiết rằng các đồ vật được đánh số saocho bất đẳng thức sau được thỏa mãn:

Trang 30

c2

c n

1 j 1 max{ f ( x) c n n j x j : a j x j b, x j 0, j 1, 2, ,

(x1, x2

b , x2 x3 x n 0

c1 b

c1

a x , j 1, 2, , n j j a

c

a1 a2 a n

(Sắp xếp giảm theo giá của một đơn vị đồ vật)

Để dễ dàng xây dựng hàm tính cận trên của bài toán (1), ta xét bài toán

có biên liên tục sau: Tìm

g* (3)

j

Trong đó: (xj ≥ 0, xj R)

Mệnh đề: [5]

Phương án tối ưu của bài toán (3) là vectơ x

phần được xác định bởi công thức:

Trang 32

trị cho xk+1 ta sẽ duyệt các giá trị đề cử theo giá trị giảm dần.

Ví dụ: Giải bài toán ba lô theo thuật toán nhánh cận ở trên vừa trình bày

với dữ liệu như sau:

- Các thành phần của phương án theo đúng thứ tự

Trang 33

- là giá trị đồ vật đang có trong ba lô.

- w là trọng lượng còn lại của ba lô

- g là cận trên

Trang 34

x1 = 1

Gốc: f*=-∞

x1 = 0(1); = 10

f* = 15 Thu được phương án của bài toán

Hình 1 Giải bài toán ba lô bằng nhánh cậnKết thúc thuật toán, ta thu được phương án tối ưu là x* = (1,1,0,0) và giá trị tối ưu là f* = 15

Trang 35

2.2.3 Chương trình minh họa

arr1 = array [1 nmax] of integer;

arr2 = array [1 nmax] of real;

t:=a[i]; a[i]:=a[j]; a[j]:=t;

tg:=ind[i]; ind[i] :=ind[j]; ind[j]:=tg;end;

Trang 37

if ind[i] > ind[j] then begin

t:=ind[i]; ind[i]:=ind[j]; ind[j] := t;t:=xopt[i];xopt[i]:=xopt[j];xopt[j]:= t;end;

Trang 38

2.3 Bài toán người du lịch (TSP)

Nguồn gốc của bài toán TSP vẫn chưa được biết rõ Một cuốn sổ taydành cho người bán hàng xuất bản năm 1832 có đề cập đến bài toán này và có

ví dụ cho chu trình trong nước Đức và Thụy Sĩ, nhưng không chứa bất kì nộidung toán học nào [7]

Bài toán TSP được định nghĩa trong thế kỉ 19 bởi nhà toán học Ai-LenWilliam Rowan Hamilton và nhà toán học Anh Thomas Kirkman Nhưngtrường hợp tổng quát của TSP có thể được nghiên cứu lần đầu tiên bởi cácnhà toán học ở Vienna (Áo) và Harvard (Mỹ) trong những năm 1930, đặc biệt

là Karl Menger, người đã định nghĩa bài toán, xem xét thuật toán hiển nhiênnhất cho bài toán [7]

2.3.1 Bài toán

Cho n thành phố đánh số từ 1 đến n và các tuyến đường giao thông haichiều giữa chúng, mạng lưới giao thông này được thể hiện trên một ma trậnđối xứng C[l n,l n], ở đây Cij = Cji là chi phí đi đoạn đường trực tiếp từ thànhphố i đến thành phố j

Một người du lịch xuất phát từ thành phố 1, muốn đi thăm tất cả cácthành phố còn lại mỗi thành phố đúng 1 lần và cuối cùng quay lại thành phố

1 Hãy chỉ ra cho người đó hành trình với chi phí ít nhất

Bài toán được gọi là bài toán người du lịch hay bài toán người bán hàng(Travelling Salesman Problem - TSP)

Input: Tệp “TSP.INP” có dạng:

o Dòng đầu chứa số n (1< n < 20), là số thành phố

o n dòng tiếp theo, mỗi dòng n số mô tả ma trận đối xứng C

Output: Tệp “TSP.OUT” có dạng:

Trang 39

2.3.2 Phân tích bài toán TSP

Hành trình cần tìm có dạng x[1 n + 1] trong đó x[1] = x[n + 1] = 1 ởđây giữa x[i] và x[i+1]: hai thành phố liên tiếp trong hành trình phải có đường

đi trực tiếp (C[i, j] ≠ +∞) và ngoại trừ thành phố 1, không thành phố nào đượclặp lại hai lần Có nghĩa là dãy x[1 n] lập thành 1 hoán vị của (1, 2, , n)

Duyệt quay lui: x[2] có thể chọn một trong các thành phố mà x[1] cóđường đi tới (trực tiếp), với mỗi cách thử chọn x[2] như vậy thì x[3] có thểchọn một trong các thành phố mà x[2] có đường đi tới (ngoài x[1]) Tổngquát: x[i] có thể chọn 1 trong các thành phố chưa đi qua mà từ x[i-1] cóđường đi trực tiếp tới (1 < i < n)

Nhánh cận:

- Khởi tạo cấu hình BestSolution có chi phí = +∞

- Với mỗi bước thử chọn x[i], ta xét:

Nếu chi phí đường đi cho tới lúc đó có < Chi phí của cấu hình

Trang 40

BestSolution thì xét tiếp, còn nếu không nhỏ hơn thì thử giá trị khác ngay bởi có đi tiếp cũng chỉ tốn thêm.

- Khi thử được một giá trị x[n] ta kiểm tra xem x[n] có đường đi trựctiếp về 1 không ? Nếu có đánh giá chi phí đi từ thành phố 1 đếnthành phố x[n] cộng với chi phí từ x[n] đi trực tiếp về 1, nếu nhỏhơn chi phí của đường đi BestSolution thì cập nhật lại BestSolutionbằng cách đi mới

Sau thủ tục tìm kiếm quay lui mà chi phí của BestSolution vẫn bằng +∞thì có nghĩa là nó không tìm thấy một hành trình nào thoả mãn điều kiện đềbài để cập nhật BestSolution, bài toán không có lời giải, còn nếu chi phí củaBestSolution < +∞ thì in ra cấu hình BestSolution - đó là hành trình ít tốnkém nhất tìm được

2.3.3 Chương trình minh họa [1]

var c :array[1 MAX, 1 MAX] of longint;

X, bestSolution :array[1 MAX] of longint;

d : array [1 MAX] of longint;

Ngày đăng: 18/02/2019, 01:01

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
[1] Hồ Sĩ Đàm (chủ biên), Đỗ Đức Đông, Lê Minh Hoàng, Nguyễn Thanh Hùng, Tài liệu giáo khoa chuyên tin, NXB Giáo dục, 2009 Sách, tạp chí
Tiêu đề: Tài liệu giáo khoa chuyên tin
Nhà XB: NXB Giáo dục
[2] Lê Minh Hoàng, Giải thuật và lập trình, http: / / www.jaist . a c .jp / ~h o a n g l e / , 2006 Sách, tạp chí
Tiêu đề: Giải thuật và lập trình
[3] Nguyễn Xuân Huy, Sáng tạo trong thuật toán và lập trình, NXB Thông tin và truyền thông, 2011 Sách, tạp chí
Tiêu đề: Sáng tạo trong thuật toán và lập trình
Nhà XB: NXB Thôngtin và truyền thông
[4] Nguyễn Xuân My (chủ biên), Hồ Sĩ Đàm, Trần Đỗ Hùng, Lê Sĩ Quang, Một số vấn đề chọn lọc trong môn tin học, NXB Giáo dục, 2002 Sách, tạp chí
Tiêu đề: Một số vấn đề chọn lọc trong môn tin học
Nhà XB: NXB Giáo dục
[5] Nguyễn Đức Nghĩa, Nguyễn Tô Thành, Toán rời rạc, NXB ĐH Quốc gia Hà Nội, 2004 Sách, tạp chí
Tiêu đề: Toán rời rạc
Nhà XB: NXB ĐH Quốc giaHà Nội
[6] Tài liệu hội thảo phát triển chuyên môn giáo viên tin học trường THPT Chuyên (tài liệu lưu hành nội bộ), Bộ giáo dục và đào tạo, 2011 Sách, tạp chí
Tiêu đề: Tài liệu hội thảo phát triển chuyên môn giáo viên tin học trường THPTChuyên
[7] Một số thông tin, tài liệu trên website h t t p ://Wikiped i a . o r gThái nguyên, ngày 24 tháng 6 năm 2014 Học viên Sách, tạp chí
Tiêu đề: Thái nguyên, ngày 24 tháng 6 năm 2014

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w