phương pháp nhánh cận
Trang 1TRƯỜNG ĐẠI HỌC HẢI PHÒNG
Trang 2LỜ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 3II Á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 4Chuyê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 6For( 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 7Mộ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 8Cậ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 12Cmin = 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 13Kế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 14Kê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 15if (i=n) then updateelse if sum<=s then branchBound(i+1);sum:=sum - x[i]*t[i];
Trang 17c:=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 19int 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 20int 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 21if( T[i] + (N-i)>>2 < MinC)
Trang 22f.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 23Ghi 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 24T = 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 25x3=0
Trang 26i 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 30Ta 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 31như 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 32I 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 33mộ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 34Khô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 36b,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