phương pháp nhánh cận
TRƯỜNG ĐẠI HỌC HẢI PHÒNG 2013 CHUYÊN ĐỀ : PHƯƠNG PHÁP NHÁNH VÀ CẬN TRONG KĨ THUẬT LẬP TRÌNH LỚP CÔNG NGHỆ THÔNG TIN K12 [Type the author name] H Ọ C – H Ọ C N Ữ A – H Ọ C M Ã I 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 MỤC LỤC I Phương pháp 1 Bài toán tối ưu 2 Ý tưởng 3 Mô hình 4 Thuật toán 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 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 2:Ý tưởng: - Nhánh cận (Branch and Bound): Thuật toán tìm lời giải cho các bài toán tối ưu dạng liệt kê cấu hình dựa trên nguyên lí đánh giá nhánh cận. - Nguyên lí đánh giá nhánh cận: Sử dụng các thông tin đã tìm được trong lời giải của bài toán để loại bỏ sớm phương án không dẫn tới lời giải tối ưu - Bản chất: + Sử dụng phương pháp quay lui nhưng tại mỗi bước đưa thêm thao tác đánh giá giá trị phương án hiện có. + Nếu đó là phương án tối ưu hoặc có hy vọng trở thành phương án tối ưu (tức là tốt hơn phương án hiện có) thì cập nhật lại phương án tối ưu hoặc đi tiếp theo hướng đó. + Trong trường hợp ngược lại thì bỏ qua hướng đang xét. 3:Mô hình: - Không gian của bài toán (tập khả năng) D={(x 1 ,x 2 ,…,x n )} gồm các cấu hình liệt kê có dạng (x 1 , x 2 , ……, x n ). - Mỗi cấu hình x sẽ xác định một giá trị hàm chi phí f(x) Nghiệm của bài toán: x= (x 1 ,x 2 ,…,x n ) sao cho f(x)= giá trị tối ưu (max/min) - Cho x i nhận lần lượt các giá trị có thể. Với mỗi giá trị thử gán cho x i xét khả năng chọn x i+1 , x i+2 … - Tại mỗi bước i: Xây dựng thành phần x i - Xác định x i theo khả năng v. + Tính chi phí lời giải nhận được. Nếu “tốt hơn” lời giải hiện thời thì chấp nhận x i theo khả năng v. Tiếp tục xác định x i+1 ,…đến khi gặp nghiệm + 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 lại bước trước để xác định lại thành phần x i-1 . - Đánh giá cận là tìm hàm g xác định trên x i sao cho: g( x 1 ,…,x i ) ≤ min f(x) với x=1…n bất đẳng thức này có nghĩa là giá trị của hàm g( x i ,…,x i ) không lớn hơn các phương án mở rộng từ lời giải bộ phận (x 1 ,…, x i ) Sau khi khi tìm được hàm đánh giá cận g , ta dùng g để giảm bớt chi phí duyệt các phương án thep phương pháp quay lui Giả sử x* là lời giải tốt nhất hiện có (phương án mẫu), còn f* là giá trị tốt nhấtt tương ứng f* = f(x*) +nếu f*< g(x) thì f* < g(x 1 ,…,x i ) ≤ min f(x) với x= 1…n Nên chắc rằng lời giải mở rộng từ (x 1 ,…, x i ) sẽ không tốt hơn phương án mẫu, do đó có thể bỏ đi không cần phát triển lời giải bộ phận (x 1 ,…,x i ) để tìm lời giải tốt ưu cho bài toán 4: thuật toán Try(i) For( i=1 n) If ( chấp nhận được) { Xác định x i theo j; Ghi nhận trạng thái mới ; If (i==n) Cập nhập trạng thái tối ưu; else { Xác định cận g (x 1 ,…,x i ); If ( g( x 1 ,…,x i ) < 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 C ij = C ij là chi phí đi đoạn đường trực tiếp từ thành phố 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á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: Input Cho đồ thị n định: T 1 ,T 2 ,…,T n Trọng số trên cạnh (i,j) là C ij Outpt: Tìm đường đi T 1 T 2 …T n …T 1 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 : T p(1) → T p(2) → … → T p(n) . Nếu ta cố định một thành phố xuất phát, chẳng hạn T 1 , thì có (n-1)! Hành trình Bài toán chuyển về dạng : Tìm Min{f(a 2 , , a n ) : (a 2 , , a n ) là hoán vị của {2, ,n}}. Với f(a1,…, an) = C 1 , a2 + C a2,a3 +…+ C an-1,an + C an,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 án của thuật toán quay lui. Input C = (Cij ) Output - x* = (x 1 , .,x n ) // Hành trình tối ưu - f* = f(x*) // Giá trị tối ưu Try (i) for (j = 1 -> n) if( Chấp nhận được ) { Xác định xi theo j; Ghi nhận trạng thái mới if(i == n) Cập nhập lời giải tối ưu; else { Xác định cận g(x 1 , , x i ) If g(x 1 , , x i ) ≤ f* ) Try (i+1); } // Trả bài toán về trạng thái cũ } +Nếu ta cố định xuất phát từ T 1 thì ta duyệt vòng lặp từ j = 2. +đánh giá nhánh cận: - Đặt : CMin = Min{Cij : i, j ∈ {1, ,n} Giả sử vào bước i ta tìm được lời giải bộ phận cấp i là (x 1 , ,x i ), tức là đã đi qua đoạn đường T 1 -> T 2 -> . . . ->T i , tương ứng với chi phí: S i = C 1,x2 + C x2,x3 +…+ C xn-1,xn + C xn,1 Để phát triển hành trình bộ phận này thành một hành trình đầy đủ, ta còn phải đi qua n-i+1 đoạn đường nữa, gồm n-i thành phố còn lại và đoạn quay lại T1. Do chi phí mỗi một trong n-i+1 đoạn còn lại không nhỏ hơn CMin, nên hàm đánh giá cận có thể xác định như sau : g ( x 1 ,…, x i ) = S i + (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] = 1nế uTj đã đ i qua 0nế u Tj chư a đ i qua Mảng Daxet[ ] phải được bằng 0 tất cả. + Xác định x i theo j bằng câu lệnh gán : x i = 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 x i : 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 + C xn1 ; Nếu (Tong < f*) thì Lgtu = x; f* = Tong; + Thao tác huỷ bỏ trạng thái : Daxet[j] = 0. Trả lại chi phí cũ : S = S- C x(i-1)xi Thuật toán: Try(i) for (j = 2 -> n) if(!Daxet[j]) { x[i] = j; Daxet[j] = 1; S = S + C[x[i-1]][x[i]]; if(i==n) { //Cap nhat toi uu Tong = S + C[x[n]][x[1]]; if(Tong < f*) { Lgtu = x; f* = Tong; } } else { g = S + (n-i+1)*Cmin; //Danh gia can . 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 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. TRƯỜNG ĐẠI HỌC HẢI PHÒNG 2013 CHUYÊN ĐỀ : PHƯƠNG PHÁP NHÁNH VÀ CẬN TRONG KĨ THUẬT LẬP TRÌNH LỚP CÔNG NGHỆ THÔNG