1. Trang chủ
  2. » Công Nghệ Thông Tin

phương pháp nhánh cận trong kỹ thuật lập trinh

61 2,1K 6
Tài liệu đã được kiểm tra trùng lặp

Đ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

Tiêu đề Phương pháp nhánh và cận trong kỹ thuật lập trình
Tác giả Đoàn Thị Ngân, Bùi Thị Hạnh, Hoàng Thị Thu Hiền
Người hướng dẫn Thầy Lê Đắc Nhường
Trường học Trường Đại Học Hải Phòng
Chuyên ngành Công Nghệ Thông Tin
Thể loại Chuyên đề
Năm xuất bản 2013
Thành phố Hải Phòng
Định dạng
Số trang 61
Dung lượng 402,69 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

phương pháp nhánh cận

Trang 1

TRƯỜNG ĐẠI HỌC HẢI PHÒNG

Trang 2

LỜI CẢM ƠN

Lời đầu tiên cho chúng tôi gửi lời cảm ơn chân thành tới thầy

Lê Đắc Nhường đã tận tình giảng dạy và giúp đỡ chúng tôi trong suốt quá trình học tập, tìm tài liệu cũng như bổ sung và góp ý để hoàn chỉnh đề tài này Đồng thời chúng tôi cũng xin cảm ơn tới các thầy cô trong khoa Công Nghệ Thông Tin trường Đại học Hải

Phòng đã tạo điều kiện thuận lợi nhất giúp đỡ chúng tôi trong quá trình nghiên cứu.

Thân cảm ơn các bạn sinh viên lớp Công Nghệ Thông Tin K12 đã nhiệt tình giúp đỡ.

Hải Phòng ngày 10 tháng 4 năm 2013

Nhóm sinh viên:

Đoàn Thị Ngân Bùi Thị Hạnh Hoàng Thị Thu Hiền

Trang 3

II Áp dụng giải một số bài toán điển hình

1 Bài toán người du lịch

2 Bài toán cây rút tiền ATM

3 Bài toán dãy ABC

4 Bài toán cái túi

5 Kĩ thuật nhánh cận trên môi trường song song

6Bài toán dò mìn

III: Phương pháp nhánh cận trên cây nhị phân

1 Sự lựa chọn cây nhị phân

2 Thủ tục phân nhánh

3 Thủ tục tính hàm lượng giá

4 Thủ tục duyệt và phân nhánh

5 Thuật giải chính

IV Nhánh cận giải một số bài toán quy hoạch nguyên

1:Bài toán quy hoạch nguyên

2 Phương pháp nhánh cận giải một số bài toán quy hoạch nguyên

V Tài liệu tham khảo

Trang 4

Chuyên đề 6: phương pháp nhánh và cận

I: Phương pháp:

1: bài toán tối ưu:

Trong thực tế, có nhiêu bài toán yêu cầu tìm ra một phương án thoả mãn một số điều kiện nào đó, và phương án đó là tốt nhất theo một tiêu chí cụ thể Các bài toán như vậy được gọi là bài toán tối ưu Có nhiều bài toán tối ưu không có thuật toán nào thực

sự hữu hiệu để giải quyết, mà cho đến nay vẫn phải dựa trên mô hình xem xét toàn bộcác phương án, rồi đánh giá để chọn ra phương án tốt nhất

Phương pháp nhánh và cận là một dạng cải tiến của phương pháp quay lui, được

áp dụng để tìm nghiệm của bài toán tối ưu

Hai hướng tiếp cận tìm lời giải tối ưu cho bài toán:

+ Tìm từng lời giải, khi hoàn tất một lời giải thì so sánh của nó với chi phí tốt nhất hiện có Nếu tốt hơn thì cập nhật chi phí tốt nhất mới

+ Với mỗi lời giải, khi xây dựng các thành phần nghiệm luôn kiểm tra điều kiện nếu

đi tiếp theo hướng này thì có khả năng nhận được lời giải tốt hơn lời giải hiện có không? Nếu không thì thôi không đi theo hướng này nữa => Nguyên lí nhánh cận

3:Mô hình:

dạng (x1, x2, ……, xn )

Trang 5

- Mỗi cấu hình x sẽ xác định một giá trị hàm chi phí f(x)

chọn xi+1, xi+2…

+ Nếu không có một khả năng nào chấp nhận được cho xi hoặc lời giải xấu hơn thì lùi

+nếu f*< g(x) thì f* < g(x1,…,xi) min f(x) với x= 1…n

bài toán

4: thuật toán

Trang 6

For( i=1  n)

If ( chấp nhận được){

If ( g( x1,…,xi) < f*)

Try (i+1)}

// trả bài toán về trạng thái cũ}

II: Áp dụng giải quyết một số bài toán điển hình

1:Bài toán người du lịch

Đề bài : Cho n thành phố đánh số từ 1 đến n và các tuyến đường giao thông hai chiều

giữa chúng, mạng lưới giao thông này được cho bởi mảng C[1 n,1 n], ở đây Cij= Cij làchi phí đi đoạn đường trực tiếp từ thành phố i đến thành phố j

Trang 7

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ác thà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 chào hàng

+ Mô hình giải bài toán:

 Mô hình thích hợp nhất đối với bài toán này là đồ thị

 Các đỉnh của đồ thị biểu thị các thành phố cạnh cuả các đồ thị là đường nối 2 thành phố.trọng số trên cạnh thể hiện chi phí đi lại giữa 2 thành phố

+ Biểu diễn bài toán:

 Tl: chu vi Hamiton trên G có trọng số nhỏ nhất

+ Xây dựng bài toán:

 Ý tưởng

*Gọi p là một hoán vị của {1, , n} thì một thành phố thỏa mãn yêu cầu bài toán códạng : Tp(1) → Tp(2) → … → Tp(n)

Nếu ta cố định một thành phố xuất phát, chẳng hạn T1, thì có (n-1)! Hành trìnhBài toán chuyển về dạng :

Tìm Min{f(a2, , an ) : (a2, , an ) là hoán vị của {2, ,n}}

Với f(a1,…, an) = C1, a2 + Ca2,a3+…+ Can-1,an + Can,1

Cách giải bài toán sẽ kết hợp đánh giá nhánh cận trong quá trình liệt kê phương áncủa thuật toán quay lui

Input C = (Cij )

Output - x* = (x1, ,xn) // Hành trình tối ưu

- f* = f(x*) // Giá trị tối ưu

Trang 8

Cập nhập lời giải tối ưu;

có thể xác định như sau :

g ( x1 ,…, xi ) = Si + (n - i + 1)*CMin

+ Điều kiện chấp nhận được của j là thành phố Tj chưa đi qua

Ta dùng một mảng logic Daxet[] để biểu diễn trạng thài này

Daxet[ j] = 0 n ế uTj c hư a đ i qua 1 n ế u Tj đã đ i qua

Mảng Daxet[ ] phải được bằng 0 tất cả

+ Xác định xi theo j bằng câu lệnh gán : xi = j

Cập nhật trạng thái mới : Daxet[j] = 1

Cập nhật lại chi phí sau khi tìm được xi : S = S+ C

+Cập nhật lời giải tối ưu :

Tính chi phí hành trình vừa tìm được :

Tong = S + Cxn1 ;

Trang 11

//Cap nhat toi uuTong = S + C[x[n]][x[1]];

if(Tong < Gttu){

Gan(Gttu,x,n);

Gttu = Tong;

} }

else

{

g = S + (n-i+1)*Cmin; //Danh gia can

if ( g < Gttu)Try(i+1);

Trang 12

Cmin = VC // chi phí nhỏ nhất giữa 2 thành phố

for ( i=1 ; i <= n; i++ )

􀂃 đầu tiên là các thành phần của phương án

􀂃 tiếp đến S là chi phí theo hành trình bộ phận

􀂃 g là cận dưới

Trang 13

Kết thúc thuật toán, ta thu được phương án tối ưu ( 1, 2, 3, 5, 4, 1) tương ứng vớiphương án tối ưu với hành trình:

T 1 →T 2 →T 3 →T 4 →T 5 →T 6

và chi phí nhỏ nhất là 22

2:Bài toán cây rút tiền tự động ATM

Đề bài: Một máy ATM hiện có n (n<=20) tờ tiền có giá t1,t2, ,tn Hãy tìm cách trả ít

tờ nhất với số tiền đúng bằng S

Dữ liệu vào từ file “ATM.INP” có dạng:

- Dòng đầu là 2 số n và S

- Dòng thứ 2 gôm n số t1, t2,…, tn

Trang 14

Kêt quả ra file “ATM.OUT” có dạng: Nếu có the trả tiền đúng bằng S thì đưa ra số tờ

ít nhất cần trả và đưa ra cách trả, nếu không ghi -1.

Trang 15

if (i=n) then updateelse if sum<=s then branchBound(i+1);sum:=sum - x[i]*t[i];

Trang 17

c:=c - j;

end;

Trang 18

Đề bài: cho trước 1 số nguyên dương N (N<=100), hãy tìm ra 1 xâu chỉ gồm các ký tự

A,B,C thỏa nãm 3 điều kiện:

Như vậy số ký tự C trong dãy luôn luôn >= T[i] + (n- X[i]) div 4

Ta có thể dùng điều kiện này để đánh giá có nên tiếp tục lựa chọn và gọi đệ quy hay chuyển sang phương án khác

Thuật toán:

#include<iostream>

#include<fstream.h>

#define MAX 101

Trang 19

int T[MAX]; // T[i] luu so luong ky tu C tu X[1] den X[i]

int N; / Do dai cua xau can tim

//Ham same cho biet xau l ky tu ket thuc boi X[i]

//co trung voi xau l ky tu lien truoc no khong

bool Same( int i, int l )

{

int j,k;

j = i-l; //{ j la vi tri cuoi doan lien truoc no}

for( k =0; k< l;++k)

if ( X[i-k] != X[j-k]) return FALSE; // 2 xau khac nhau

return TRUE; // 2 xau giong nhau

}

bool Check( int i )

//Ham check cho biet phan tu X[i]

//co lam mat tinh khong lap cua day X[1 i] khong

{

Trang 20

int k = i >>1;

for( int l = 1;l<= k;++l)

if (Same(i,l))return FALSE; // X[i] khong thoa man

return TRUE; // X[i] thoa man

//THUAT TOAN QUAY LUI CO NHANH CAN

void Attempt( int i)

Trang 21

if( T[i] + (N-i)>>2 < MinC)

Trang 22

f.open("Giai bai toan ABC su dung ky thuat nhanh can.txt");

f>>N;

T[0] = 0;

MinC = N; //Khoi tao cau hinh toi nhat

Attempt(1); //Xet cac kha nang cua X[1];

4 :bài toán cái túi :

đề bài : Có n loại đồ vật, loại đồ vật thứ i có trọng lượng Wi và giá trị sử dụng Vi với mọi i∈(i …n) Cần chất các đồ vật này vào một cái túi có trọng lượng là m, sao cho tổng giá trị sử dụng của các đồ vật chất trong túi là lớn nhất

Cho nên ta sẽ kết hợp nhánh cận trong lời giải theo phương pháp quay lui

 Mô hình thuật toán ban đầu như sau:

Trang 23

Ghi nhận trạng thái mới

Ta chọn vật theo đơn giá giảm dần

Không mất tính tổng quát , ta gải sử các loại vật cho theo thứ tự giảm dần của đơn giá

+Đánh giá cận trên :

Giả sử đã tìm được lời giải bộ phận (x1,…,xi) Khi đó :

 Giá trị của túi xách thu được là : S = ∑

Trang 24

T = T + xivi

+ Vì vậy thao tác trả lại trả thái cũ cho bài toán là :

S = S - xivi

T = T - xivi

+ Cập nhập trạng thái tối ưu :

Khi tìm ra 1 lời giải, ta so sánh ta so sánh lời giải này với lời giải ta coi là tốt nhất vàothời điểm hiện tại để chọn lời giải tối ưu

+ Khởi tạo giá trị ban đầu như sau :

 x* = 0 // lời giải tối ưu của bài toán

 f* = f(x*) = 0 // giá trị tối ưu

 S = 0 // giá trị thu được từng bước của chiếc túi

 TL //trọng lượng xếp vào chiếc túi từng bước

x= j;

TL = TL+wi* xi;

S = S + vi*xi; if(i==n)//Cap nhat toi uu

else

Trang 25

x3=0

Trang 26

i g iải tối ư u:X

*=(

1,1 ,0 ,0 )

Tl = Tl + w[i]*x[i]; //Trong luong thu duoc

S = S + v[i]*x[i]; //Gia tri thu duoc

if(i==n) //Cap nhat toi uu

Trang 27

 Các bài toán sử dụng nhánh cận để giải quyết đều phải sử dụng khung của thuậttoán.Điều này nhấn mạnh rằng người dùng nếu giải bài toán của mình trên môitrường nào thì chỉ cần thêm một số phương thức,dữ liệu phù hợp mà không cầnsuy nghĩ đến việc phải thiết kế các bước như thế nào.

Dưới đây là khung chung của thuật toán:

1 Khởi tạo

a Tậphoạt động(tập các bài toán con chưa được duyệt)chứa bài toán ban đầu

b Giá trị kỷ lục(best solution=bs) bằng ∞

2 Lựa chọn

a Dựa trên một phương pháp nào đó(theo chiều sâu,chiều rộng,hoặc cận tốt

nhất, )để lựa chọn một bài toán con khả thi cùng cận của nó từ tập hoạt

động

b Xóa bài toán con khỏi tập hoạt động

Trang 28

(1) Bài toáncon đã được giải quyết – đi tới bước5

(2) bài toán con chưa được giả iquyết – đi tới bước 4

4 Kiểm tra tính khả thi: Đưa các bài toán con có cận nhỏ hơn kỷ lục tạm thời vào tập hoạt động

5 Dò xét kết thúc

a Bài toán con được duyệt là một lời giải khả thi khi có cận nhỏ hơn kỷ lục

và khi đó nó sẽ thay thế kỷ lục Ngược lại sẽ bị xóa

b Khi cập nhật kỷ lục mới(5a) thì tất cả các bài toán con trong tập hoạt động

có cận dưới lớn hơn hoặc bằng kỷ lục sẽ bị xóa

6 Kết thúc thuật toán

a Lặp lại các bước từ2-5nếu tập hoạt động không rỗng.Ngượclại,thì kết thúc thuật toán và lời giải tối ưu là giá trị kỷ lục

Trang 29

σ :lời giải T:lưu trữ lời giải tốt nhất Пi:cácbài toán con được sinh ra

Dưới đây là đoạn mã giả của thuật toán phân nhánh:

Trang 30

Ta có thể sử dụng cấu trúc heap và queue để lưu trữ các bài toán con chưa được giải quyết.Ở đây chúng tôi sử dụng queue bởi lí do khi số lượng các thành phố là lớn thì không gian bài toán con tăng lên rất nhiều mà heap không thể lưu trữ được.

Queuegồm3 lớpsau:

Classbbnode:Định nghĩa các nút trên cây

ClassBandbQueue:Lớp trừu tượng này miêu tả một queue

Class Branch Queue:Lớp này sử dụng trong suốt giai đoạn phân nhánh

Xây d ng kh ựng kh ung nhánh c n ận song song

Đểsong song hóa khung sử dụng kỹ thuật nhánh cận chúng ta sử dụng

chiến lượcchủ-thợ.Chiến lược này có thể được định nghĩa như sau:một bộ

xử lý chủ giữ tất cả thông tinvề không gian trạng thái,nơi mà chứa đựng sốlượng các bài toán con chưa được phân nhánh trên cây liệt kêvà nó cũnglưu giữ lời giải hiện thời.Máy chủ gửi bài toán con tới máy thợ rỗi và nhậncác bài toán con mới được phát sinh từ các máy thợ đó.Một vài máy thợđịnh giá những bài oán con và phát sinh hêm những cái mới nếu cầnthiết.Một máy thợ rỗi nhận một bài toán conchỉ khi có những bài tóan con

mà có khả năng dẫn tới một giải pháp tối ưu Chiến lược này đề xuất nhữngsựkiệncóýnghĩa

Trang 31

như là khả năng điều khiển dễ dàng và thuật toán nhánh cận song song theo phương pháp dễ hiểu và tự nhiên hơn.

- Bộ xử lí chủ:chỉ có một bộ xử lí chủ trong khung.Nó chứa tất cả thông tin về

không gian trạng thái và tình trạng của mỗi máy thợ(bận hoặc rỗi.)

- Bộxử lí thợ:Số lượng bộ xử lí thợ được xác định bởi tham số đầu vào.Nó thực

hiện tất cả những thao tác tính toán để giải quyết hoặc ước lượng một bài toán

con

Sự song song hiển thị cấu trúc trong Hình 4.Máy chủ có một hàng đợi những bàitoán chưa được giải quyết.Nó loại bỏ mọi bài toán con từ hàng đợi của nó và giao việccủa nó tới máy thợ rỗi trong giai đoạn a.Trong giai đoạn b,một tập bài toán con của máythợ đưa đến máy chủ.Trong giai đoạn c,máy chủ nhận những bài toán con và chènchúng vào trong hàng đợi của nó.Cuối cùng,máy chủ loại bỏ những bài toán con có thểthực hiện cvà gửi chúng đến máy thợ rỗi trong giai đoạn.Tiến trình kết thúc khi hàng đợimáy chủ là rỗng và lời giải tốt nhất tìm thấy đc

Trang 32

I HÌNH5:CÁCGIAIĐOẠNCỦAMÔHÌNH CHỦ-THỢ

Ta nhận thấy rằng mô hình hoạt động ở trên tương đối đơn giảnvà dễ dàngcàiđặt.Tuy nhiên nó có một nhược điểm lớn là số lượng bài toán con chỉ tập trung tại máychủ,điều đó dễ dẫn tới tràn bộ nhớ do số lượng bài toán con này là rất lớn.Thêm vào nữamáy chủ luôn phải điều động từng bài toán con tới các máy thợ dẫn tới tăng số lượngcông việc tại máy chủ cũng như lưu lượng truyền thông trên mạng là lớn.Để giải quyếtvấn đề này chúng tôi đề xuất một mô hình dữ liệu phân tán,nghĩa là trên mỗi máythợđều có một vùng nhớ để lưu các bà toán con.Và bây giờ các bài toán con được chuyển

Trang 33

một cách trực tiếp từ máy thợ bận(có nhiều bài toán con) tới máy thợ rỗi(

Trang 34

Không còn bài toán con để tìm kiếm) dưới sự điều phối của máy chủ.Sau đâylà thiết kếchi tiết đối với cả hai hệ thống này.

Lược đồ song song dữ liệu tập trung

-Cấu trúc dữ liệu:

Danh sách các bài toán con chưa được giải quyết lưu tại máy chủ,các bài toán con đượcrời và gửi tới các máy thợ.Mỗi máy thợ khi nhận bài toáncon tiến hành phân nhánhvà lưucác bài toán con vừa mới được sinh ra cùng với cận của nó trong một danh sách cụcbộ.Sau đó nó gửi tới máy chủ,máy chủ lúc này tiến hành nối các bài toán con nhận được

từ danh sách đó nếu cận của nó nhỏ hơn kỷ lục tạm thời.Cấu trúc dữ liệu để lưu các bàitoán con là một danh sách liên kết kép

- Thuật toán

a,Thực hiện trên máy chủ

Hình6 mô tả các công việc được thực hiện trên máy chủ.Máychủ thực hiện phân phối

các bài toán con giữa các máy thợ.Máy chủ có một danh sách cục bộ để lưu trữ bài toán convà cấu trúc dữ liệu để ghi nhận trạng thái hiện thời của các máy thợ(dòng1);

Ban đầu tất cả các máy thợ đều rỗi.Khi có các máy thợ rỗi,máy chủ liên tục trích lọctừng bài toán con khả thi (cócận nhỏ hơn kỷ lục tạm thời), sauđó lựa chọn một máy thợrỗi và gửi bài toán con tới nó để tiến hành phân nhánh và ước lượng(dòng6-7) Nếu danhsách L rỗng hoặc không có máy thợ nào rỗi,máy chủ tiến hành kiểm tra có dữ liệu(là cácbài toán con mới sinh ra)được gửi về từ máy thợ hay không Nếu có nó sẽ nhậndữ liệu từmáy thợ là một tập các bài toán con cùng cận dưới của nó.Kiểm tra lần lượt từng bài

toán con.Nếu bài toán được giải quyết(có số lượng median bằng k), thì cập nhật kỷ lục

và lời giải tạm thời(nếu có cận nhỏ hơn kỷ lục tạm thời)ngược lại nối cácbài toán conkhả thi vào danh sách L(Dòng12-17).Quá trình tìm kiếm kết thúc khi tất cả các máy thợđều rỗivà danh sách L rỗng,và khi đó máy chủ gửi một thông

Trang 36

b,Th c hi n trên máy th ựng kh ện trên máy thợ ợ

Máy thợ nhận lệnh từ máy chủ.Có thể là kết thúc quá trình tính toán hoặc nhận một bàitoán con cần phân tích.Nếu lệnh yêu cầu nhận một bài toán con,máy thợ thực hiện nhận

dữ liệu(Dòng6),sau đó tiến hành phân nhánhvà tính cận cho các bài toán con vừa đượcsinh ra(Dòng7-8).Dữ liệu này được gửi tới máy chủ.Sau đây là đoạn mã giả

của thủ tục

Hình7:Hoạt động trên máy thợ(Dữ liệu tập trung)

Trang 37

Lược đồ song song dữ liệu phân tán

-Cấu trúc dữ liệu

Mỗi máy thợ lưu một danh sách các bài toán con cục bộ.Máychủ chỉ gửi bài toán conđầu tiên tới một máy thợ rỗi ban đầu và sau đó không lưu trữ bất kỳ bài toán con nàomàchỉ thực hiện điều phối các bài toán con giữa các máy thợ

-Thuậttoán

a,Th c hi n trên máy ch ựng kh ện trên máy thợ ủ

Hình4.6 chỉ ra các công việc trên máy chủ.Máy chủ có một cấu trúc dữ liệu I để ghinhận trạng thái hiện thời của các máy thợ(Dòng1);ban đầu tất cả các máy thợ đều rỗi.Bài toán con đầu tiên, kỷ lục và lời giải tạm thời được gửi tới một máy thợ rỗi(dòng 3-4).Máy chủ nhận thông tin gửi về từ máy thợ và quyết định hoạt động tiếp theo phụthuộcvào bài toán con được giải quyết(dòng8) hay là một yêu cầu các máy thợ rỗi từmáy thợ nào đó(dòng10)hay là thông báo một máy thợ đang rỗi (dòng16) Nếu bài toáncon đã được giải quyết,máy chủ nhận và lưu trữ lời giải(nếu cận của nó nhỏ hơn kỷ lục

tạm thời) Khi máy chủ nhận một yêu cầu r máy thợ rỗi từ một máy thợ nào đó, nó sẽ

tiến hành xác định các máy thợ đang rỗivà gửi thông tin về số lượng và tên các máy thợđang rỗi tới máy thợ yêu cầu(dòng13-14),sau đó chờ đợi và nhận lại từ máy thợ đó cácmáy thợ không được sử dụng.Quá trình kết thúckhi tất cả các máy thợ đều rỗivà máychủ gửi một thông báo kết thúc tới toàn bộ hệ thống(dòng19) Dưới đây là đoạn mã giảcủa thủ tục

Ngày đăng: 26/08/2013, 20:18

HÌNH ẢNH LIÊN QUAN

Sơ đồ khối thuật toán - phương pháp nhánh cận trong kỹ thuật lập trinh
Sơ đồ kh ối thuật toán (Trang 56)

TỪ KHÓA LIÊN QUAN

w