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

Đề Tài Thuật toán nhánh cận

10 1,8K 4

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 10
Dung lượng 115,89 KB

Nội dung

Tiểu luận Đề Tài: Thuật toán nhánh cận Phần 1: Tổng Quan Về Thuật Toán Nhánh Cận Thuật toán nhánh cận là phương pháp chủ yếu để giải các bài toán tối ưu tổ hợp. Ta sẽ thực hiện việc đánh giá theo từng bước, nếu không có khả năng tìm thấy kết quả tốt hơn thì sẽ cắt nhánh đó, không thực hiện tìm tiếp mà chuyển ngay sang nhánh khác. Khi đó, chỉ ghi nhận các kết quả tốt hơn lúc ban đầu. Nghiệm của bài toán sẽ tốt dần lên do khi tìm ra kết quả tốt hơn ta sẽ cập nhật lại giá trị hiện thời của bài toán. 1.Đặt vấn đề: Một trong những bài toán đặt ra trong thực tế là tìm một nghiệm thỏa mãn một số điều kiện nào đó và nghiệm đó là tốt nhất theo một tiêu chí cụ thể. Ví dụ: bài toán người du lịch không gian trạng thái là N! Bài toán K-median không gian trạng thái là C Khi đó, không gian tìm kiếm của bài toán là rất lớn trong khi nhiều trường hợp có thể loại bỏ được ngay.Điều này gây nên tình trạng lãng phí bộ nhớ và mất rất nhiều thời gian.Vấn đề đặt ra trong quá trình liệt kê lời giải cần tận dụng những thông tin đã có để loại bỏ sớm những phương án chắc chắn không tối ưu.Thuật toán nhánh cận được sử dụng để khắc phục những vấn đề trên 2. Tư tưởng của thuật toán: Tư tưởng của thuật toán là trong quá trình tìm kiếm lời giải, ta sẽ phân hoạch tập các phương án của bài toán thành hai hay nhiều tập con biểu diễn như một nút của cây tìm kiếm và cố gắng bằng phép đánh giá cận các nút, tìm cách loại bỏ các nhánh cây(những tập con các phương án của bài toán) mà ta biết chắc chắn không phải là phương án tối ưu. Mặc dù trong trường hợp tồi nhất thuật toán sẽ trở thành duyệt toàn bộ, nhưng những trường hợp cụ thể nó rút ngắn đáng kể thời gian tìm kiếm Phần 2: Một số ví dụ minh họa 1. Bài toán người giao hàng: 1.1 Mô tả bài toán: -Một người cần phải giao hàng tại N thành phố T 1 ,T 2 ,….T n -C ij : chi phí đi từ thành phố T i đến thành phố T j (i=1,2,….n; j = 1,2,…,n) -Yêu cầu: xác định hành trình thỏa mãn  Đi qua tất cả các thành phố, mỗi thành phố qua đúng 1 lần, rồi quay trở lại thành phố xuất phát  Chi phí nhỏ nhất -Ta có các phương án giải quyết bài toán:  Phương pháp vét cạn  Phương pháp vét cạn quay lui  Một số phương pháp khác - Nhược điểm: Phải xét những phương án không khả thi (gây bùng nổ dữ liệu khi đầu vào n lớn) - Ý tưởng của thuật toán:  Giữ lại một phương án mẫu  Tính chi phí của các phương án khác ngay trong quá trình xây dựng  Tốt hơn : Cập nhật lại phương án mẫu và đi tiếp  Không tốt hơn : Quay lại bước trên xét phương án khác 1.2 Thuật giải: - Bài toán tối ưu: Tìm min{ f(x) : x Є D} Với X = {a = (a 1, a 2…. , a n ) Є ПA i (i=1,2,….n) : P(x)} |A i <∞ | với mọi i= 1,2,….,n với P là một tính chất trên tập A i _ - Nghiệm của bài toán có dạng x=(x 1, x 2 ,….,x n ) - Bước 1: xuất phát từ x 1 , xây dựng một phương án mẫu f* - Bước i : Đã xây dựng được nghiệm thành phần (x 1, x 2, … ,x i-1 ) Đánh giá cận: tìm g xác định trên X i g(x 1 ,… x i ) < Min {f(a): a=(a 1 ,….,a n ) thuộc X , x i =a i , i=1,2,…,n}  Giả sử x* là lời giải tốt nhất tại thời điểm đó, f* là giá trị tốt nhất f*= f(x*)  Nếu f*<g có thể bỏ đi không cần phát triển lời giải bộ phận (x 1 , …… ,x i )  Ngược lại: tiến hành bước i+1 để các đinh x i + 1 1.3 Cài đặt: Try(i) { For (j=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ật 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) } } } 1.4 Đánh giá: - Ưu điểm: Giảm được chi phí do loại bỏ được những bước đi không cần thiết ( nhờ đánh giá cận) - Nhược điểm : Việc xây dựng hàm g phụ thuộc vào từng bài toán tối ưu tổ hợp cụ thể. Hàm g phải đảm bảo điều kiện: Việc tính giá trị hàm g phải đơn giản hơn việc giải bài toán tổ hợp tìm min = min {f(a): a=(a 1 ,….,a n ) thuộc X , x i =a i , i=1,2,…,n} Giá trị của g (a 1 ,a 2 ,…,a k ) phải sát với các giá trị của min 2. Bài toán người đưa hàng: 2.1 Ý tưởng: Gọi p là một hoán vị của (1,…,n) ta được hành trình T p(1) -> T p(2) -> … T p(n)  Có n! hành trình  Nếu cố định đỉnh xuất phát là đỉnh 1 thì có (n-1)! Hành trình, bài toán trở thành  Tìm Min {f(a 2 ,….a n ): (a 2 ,… ,a n )} là hoán vị của {2, ,n}} với f(a 1 ,……,a n ) = C 1,a2 + C a2,a3 +…….+ C an-1,an + C an,1  Ta 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 2.2 Thuật giải:  Cố định xuất phát là đỉnh 1, duyệt vòng lặp từ j= 2  Tại bước i : Đánh giá cận  Đặt C min = Min {C ij : i,j = (1,…,n)}  Giả sử đã đi đoạn đường T 1 ->T 2 … >T i với chi phí S i = C 1,x2 + C x2,x3 +…….+ C xi-1,xi  Hàm cận g(1,…,x i ) = S i +(n-i+1)C min  Lưu dấu bằng mảng logic Daxet[]: Daxet[j] = 1 nếu T[j] đã qua 0 nếu T[j] chưa qua  Xác định x i = j cập nhật Daxet[j]= 1 và S= S+ C xi-1,xi  Nếu i=n , Tong = S + C xn,1 ; Nếu (Tong<f*) thì lời giải tối ưu = x; f* = Tong;  Nếu Daxet[j]= 0 thì S=S- C xi-1,xi 2.3 Cài đặt: 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; // loi giai toi uu f* = tong; } } Else{ g= S + (n-i+1)* C min ; // danh gia can if(g<f*) Try (i+1); } S= S- C[x[i-1]][x[i]]; Daxet[j]=0; } 2.4 Minh họa Giải bài toán người đưa hàng với ma trận chi phí như sau: Ta có C min = 2. Quá trình thực hiện thuật toán được mô tả bởi cây tìm kiếm lời giải được thể hiện trong hình vẽ dưới đây Thông tin về một phương án bộ phận trên cây được ghi trong các ô trên hình vẽ tương ứng theo thứ tự sau: - Đầu tiên là các thành phần của phương án - Tiếp đến ∂ là chi phí theo hành trình bộ phận - g là cận dưới Kết thúc phương án ta thu được phương án tối ưu (1, 2, 3, 5, 4, 1) tương ứng với phương án tối ưu với hành trình: T 1 -> T 2 -> T 3 -> T 5 -> T 4 -> T 1 và chi phí nhỏ nhất là 22 . Cây tìm kiếm giải quyết bài toán người đưa hàng (2,4) =25 ; g=34 (2,5) =23; g=32 (2,3,5) =11; g=17 (2,3,5,4) =16 ; g=19 Các nhánh này bị loại vì có cận dưới g > =22 f ur = +∞ (2) ∂ =3 ; g=15 (3) ∂ =14 ; g=26 (4) ∂ =18 ; g=30 (5) ∂ =15 ; g=27 (2,3) ∂ =7 ; g=16 (2,3,4) ∂ =23 ; g=29 (2,3,4,5) ∂ =41; g=44 Hành trình (1, 2, 3,4, 5,1) chi phí 53. Đặt f ur =53 Hành trình (1, 2, 3, 5,4, 1) chi phí 25 (Kỷ lục mới). Đặt f ur =22 Phần 3: Thuật Toán Giải Quyết Bài Toán Người Đi Du Lịch # include <stdio.h> # include <stdio.h> # include<conio.h> # include<io.h> # define MAX 20 Int n, P[MAX], B[MAX], C[20][20], count = 0; int A[MAX],XOPT[MAX]; int C an , C min , fopt; void Read_Data(void){ int i, j; FILE *fp; fp = fopen (“dulich.in”, “r”); fscanf(fp, “%d”, &n); printf(“\n So thanh pho: %d”, n); printf(“\n Ma tran chi phi:”); for (i=1; i< = n; i++){ printf(“\n”); for(j = 1; j< = n; j++){ fscanf(fp, “%d”, &C[i][j]); printf(‘%5d”, C[i][j]); } } } int Min_Matrix(void){ int min = 1000, i, j; for (i=1; i<=n;i++){ for(j=1; j<=n, j++){ if (i!=j && min > C[i][j]) min = C[i][j]; } } Return(min); } Void Init(void){ int i; C min = Min_Matrix(); fopt = 32000; can = 0; A[1] = 1; for (i = 1; i< = n;i++) B[i] = 1; } Void Result(void){ int i; printf(“\n Hanh trinh toi uu %d:”, fopt); printf(“\n Hanh trinh:”); for(i=1; i<=n;i++) printf(“%3d->”, XOPT[i]); printf(“%d,1”); } Void Swap(void){ int i; for(i=1;i<=n;i++) XOPT[i] = A[i]; } Void Update_Kyluc(void){ int sum; sum= can + C[A[n]][A[1]]; if(sum < fopt){ Swap(); Fopt= sum; } } Void try(int i){ int j; for (j=2; j<=n;j++){ if (B[j]){ A[i]=j; B[j]=0; can = can + C[A[i-1]][A[i]]; if (i= = n) update_Kyluc() else if(can + (n-i+1)* C min < fopt){ count ++; try(i+1); } B[j] = 1; can = can – C[A[i-1]][A[i]]; } } } } void main(void){ clrscr(); Read_Data(); Init(); Try(2); Result(); getch(); } . Tiểu luận Đề Tài: Thuật toán nhánh cận Phần 1: Tổng Quan Về Thuật Toán Nhánh Cận Thuật toán nhánh cận là phương pháp chủ yếu để giải các bài toán tối ưu tổ hợp. Ta sẽ thực. để khắc phục những vấn đề trên 2. Tư tưởng của thuật toán: Tư tưởng của thuật toán là trong quá trình tìm kiếm lời giải, ta sẽ phân hoạch tập các phương án của bài toán thành hai hay nhiều. nhiều thời gian.Vấn đề đặt ra trong quá trình liệt kê lời giải cần tận dụng những thông tin đã có để loại bỏ sớm những phương án chắc chắn không tối ưu .Thuật toán nhánh cận được sử dụng để

Ngày đăng: 12/04/2015, 14:13

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w