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

Báo Cáo Cấu trúc dự liệu và giải thuật : Chiến lược quy hoạch động

22 2 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

Giảng Viên Hướng Dẫn Vũ Văn Định Giảng Viên Hướng Dẫn Vũ Văn Định LỜI NÓI ĐẦU Cấu Trúc Dữ Liệu và Giải Thuật là một trong những môn học cơ bản của sinh viên ngành Công nghệ thông tin Các cấu trúc dữ liệu, tài liệu 5k, tài liệu giá rẻ

Giảng Viên Hướng Dẫn : Vũ Văn Định LỜI NÓI ĐẦU Cấu Trúc Dữ Liệu Giải Thuật môn học sinh viên ngành Công nghệ thông tin Các cấu trúc liệu giải thuật xem hai yếu tố quan trọng ngành lập trình, câu nói tiếng Niklaus Wirth: Chương trình = Cấu trúc liệu + Giải thuật (Programs = Data Structues + Algỏithms) Nắm vững cấu trúc liệu giải thuật sở để sinh viên tiếp cận với thiết kế xây dựng phần mềm sử dụng cơng cụ lập trình đại Một phần quan trọng môn Cấu Trúc Dữ Liệu Giải Thuật phần chiến lược thiết kế thuật toán Trong chiến lược thuật toán chiến lược chia để trị , chiến lược quay lui, chiến lược quy hoạch động…Thì chiến lược quy hoạch động chiến lược giúp rút ngắn thời gian giải toán Trong báo cáo phân tích chiến lược quy hoạch động ứng dụng để tìm hành trình với chi phí tốn người du lịch Để hồn thành tốt báo cáo môn học em xin chân thành cảm ơn tới thầy , cô bạn bè nói chung thầy ‘ Vũ Văn Định’ nói riêng ln giúp đỡ em q trình học tập Em xin chân thành cảm ơn! Sinh Viên Thực Hiện: Nguyễn Quốc Tuấn – 1781310178 Giảng Viên Hướng Dẫn : Vũ Văn Định CHƯƠNG 1: TỔNG QUAN CHIẾN LƯỢC QUY HOẠCH ĐỘNG TRONG QUÁ TRÌNH XÂY DỰNG THUẬT TOÁN 1.1 Giới thiệu chiến lược quy hoạch động - Thuật toán quy hoạch động ưa chuộng ban đầu, tốn có mn hình vạn trạng bạn phải suy nghĩ nhiều tìm lời giải Khơng có cơng thức chuẩn mực áp dụng cho tốn Bởi phổ biến nó, bạn bắt buộc phải thục thuật tốn muốn có kết tốt thi - Quy hoạch động(Dynamic Progarming) chia toán lơn thành toán nhỏ có tốn có cấu trúc tối ưu , tính chất gối sau tổng hợp lời giải tốn thành lời giải toán lớn ban đầu - Quy hoạch động nhà toán học Richard Bellman phát minh năm 1953 Trong ngành Khoa học máy tính (Computer Science), quy hoạch động chiến lược thiết kế thuật tốn vơ quan trọng Quy hoạch động phương pháp làm giảm thời gian chạy thuật tốn thể tính chất toán gối (Overlapping subproblem) cấu trúc tối ưu (Optimal substructure) 1.2 Xây dựng toán quy hoạch động Xây dựng toán quy hoạch động gồm giai đoạn: Sinh Viên Thực Hiện: Nguyễn Quốc Tuấn – 1781310178 Giảng Viên Hướng Dẫn : Vũ Văn Định Giai Đoạn 1: Phân tích xem tốn cần giải có phân tích thành tốn có tốn gối , tốn có cấu trúc tối ưu hay khơng Giai Đoạn 2: Nếu tốn có tính chất : - Bài tốn có tốn gối - Bài tốn có cấu trúc tối ưu Khi giải tốn sở sau lưu trữ tốn để sử dụng nhiều lần trình lặp toán Giai Đoạn 3: Gộp lời giải toán thành toán lớn hơn, tiếp tục gặp toán yêu cầu Bài toán sở toán hiển nhiên dễ dàng giải Xây dựng công thức truy hồi để giải toán lớn Từ lời giải toán sở với cơng thức truy hồi ta sử dụng mảng chiều mảng nhiều chiều để lưu trữ kết toán sở Dựa vào phương án công thức truy hồi để giải toán ban đầu 1.3 Ưu nhực điểm chiến lược quy hoạch động - Ưu điểm: Các lời giải toán lưu trữ theo phương án , cần tổng hợp gọi lời giải, giảm thời gian chạy thuật toán - Nhược điểm: Tốn vùng nhớ để lưu trữ lời giải toán Sinh Viên Thực Hiện: Nguyễn Quốc Tuấn – 1781310178 Giảng Viên Hướng Dẫn : Vũ Văn Định 1.4 So sánh chiến lược quy hoạch động với chiến lược chia để trị Giống : - Hai chiến lược chia để trị chiến lược quy hoạch động chia toán lớn thành toán nhỏ , dễ giải để tổng hợp lời giải , giải toán lớn Khác : - Chiến lược chia để trị : Từ toán lớn chia thành toán nhỏ sau tổng hợp lại kết toán ban đầu (Top down) - Chiến lược quy hoạch động : Từ toán sở giải toán lớn tiếp tục gặp toán đề (Bottom up) 1.5 Ứng dụng chiến lược quy hoạch động Sinh Viên Thực Hiện: Nguyễn Quốc Tuấn – 1781310178 Giảng Viên Hướng Dẫn : Vũ Văn Định Quy hoạch động có ứng dụng lớn việc giảm thời gian chạy số thuật toán chiến lược quay lui ,… khử đệ quy Sinh Viên Thực Hiện: Nguyễn Quốc Tuấn – 1781310178 Giảng Viên Hướng Dẫn : Vũ Văn Định CHƯƠNG 2: ỨNG DỤNG CHIẾN LƯỢC QUY HOẠCH ĐỘNG ĐỂ TÌM HÀNH TRÌNH VỚI CHI PHÍ ÍT NHẤT TRONG BÀI TOÁN NGƯỜI DU LỊCH 2.1 Giới thiệu chung toán người du lịch (Traveling Salesman Problem - TSP) Vấn đề toán người du lịch (TSP): Có n thành phố đánh số từ đến n tuyến đường giao thông hai chiều chúng, mạng lưới giao thông cho mảng C[1 n,1 n], C[i,j] chi phí đ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 thăm tất thành phố lại thành phố lần cuối quay lại thành phố Hãy tìm hành trình với chi phí cho người 2.2 Giải toán người du lịch (TSP) Bài tốn người du lịch giải phương pháp quay lui với thời gian O(n!) Vậy nên phương pháp giaiả quy hoạch động đáp ứng thời giai giải toán với O(n22n) Giả sử T[1,2,…], T[1]=1, hành trình tối ưu từ thành phố đến thành phố T[n] qua n−1 thành phố khác quay lại Vì hành trình T[1,2,…,n] tối ưu, hành trình T[2,3,…,n−1] từ tới T[n] qua thành phố {2,3,…,n}∖{T[n]} phải hành trình tối ưu Như vậy, gọi Cost(S,i) chi phí nhỏ từ tới i qua thành phố tập hợp S (khơng chứa i), ta có cơng thức đệ quy sau: Sinh Viên Thực Hiện: Nguyễn Quốc Tuấn – 1781310178 Giảng Viên Hướng Dẫn : Vũ Văn Định Cost(S,i) = minj ∈ S{Cost(S∖{j},j) + C[i,j]} Do đường với chi phí nhỏ từ tới i qua S, đường phải qua đỉnh j thuộc S trước đến i Tức đường có dạng 1→…→j→i Do Cost(S,i)=Cost(S∖j,j)+C[j,i] Tuy nhiên ta khơng biết cụ thể j mà biết j thuộc S Do đó, ta phải duyệt qua tất j thuộc S lấy Để tính Cost(S,i), ta cần đảm bảo giá trị C(S′,j) với S′=S∖{j} tính trước Giả mã sau: DYNAMICTSP(C[1,2,…,n,1,2,…,n]): Cost[1,1]=+∞ for s←1 to n−1 for each S← a subset of {1,2,…,n} of size s Cost[S,1]+∞ for each i←S∖{1} SUBTOURCOST(S∖{i},i) opt ←+∞ for j←2 to n opt ←min{opt,Cost[{2,3,…,n}∖{j},j]+C[i,j]} return opt Sinh Viên Thực Hiện: Nguyễn Quốc Tuấn – 1781310178 Giảng Viên Hướng Dẫn : Vũ Văn Định Hàm SubtourCost(S,j) tính chi phí hành trình từ đến j qua thành phố S (khơng chứa j) xác lần tính theo cơng thức đệ quy Giả mã sau: SUBTOURCOST(S,i): Cost[S,i]←+∞ for each j←S Cost[S,i]←min{Cost[S,i], Cost[S∖{j},j]+C[i,j]} Thời gian tính thuật tốn quy thời gian cập nhật bảng Cost[S⊆{2,3,…,n}][1,2,…,n] có kíc thước O(n2n) Mỗi phần từ bảng cập nhật theo thủ tục SubtourCost(S,j) thời gian O(| S|)=O(n) Do tổng thời gian tính tốn thuật toán O(n22n) + Để việc truy xuất bảng Cost [S⊆{2,3,…,n}][1,2,…,n] hiệu quả, mã hóa cách gán cho tập S {1,2,…,n} số nhất, gọi id, để việc truy xuất hay cập nhật C[S,i] hiệu qủa Ta mã hóa tập S tập n phần tử số nguyên n bít a1a2….an, ai=1 phần tử i∈S ai=0 i∉S id S giá trị số ngun Ví dụ: n=5, tập S=1,2,4 biểu diễn số nguyên hình đây, có id = 010112 = 11 Hình 2.2.1 + Phương pháp sinh tập {1,2,…,n}, Bây ta giải toán sinh tập kích thước k tập hợp có kích thước n Ở ta Sinh Viên Thực Hiện: Nguyễn Quốc Tuấn – 1781310178 Giảng Viên Hướng Dẫn : Vũ Văn Định sinh tập theo thứ tự từ điển Như ta quy tốn cho tập S, tìm tập có k phần tử theo thứ tự từ điển Giả sử tập S cho dạng mã hóa bit trên, ta quy toán: Problem: Cho số ngun n-bít v có k bít Tìm số nguyên n-bít w tiếp sau v theo thứ tự từ điển có k bít Ví dụ: n=5, k=3, v=010112 , số nguyên w=011012 Ta nhận thấy v có a (a 0) bít cuối 0, trước b bít (Hình 2.2.2), w có b−1 bít cuối 1, trước a+1 bít trước a+1 bít bít (Hình 2.2.3) Hình 2.2.2 Hình 2.2.3 Như để giải tốn trên, ta tìm cách chuyển v thành w giống hình Giả mã sau: int NEXTSET(unsigned int v, int n): unsgined int w unsgined int t←(v|(v−1))+1 w←t|((((t&−t)/(v&−v))>>1)−1) if w>>n=0 return w else return Các thao tác hàm NextSet(unsigned int v, int n) minh hoạ hình sau: (Hình 2.2.4) Sinh Viên Thực Hiện: Nguyễn Quốc Tuấn – 1781310178 Giảng Viên Hướng Dẫn : Vũ Văn Định Hình 2.2.4 + Bài toán phải giải liệt kê tập con: Problem: Cho tập S⊆{1,2,…,n} với kích thước |S|, liệt kê tập S có kích thước |S|−1| Với tập S, dùng danh sách liên kết để lưu tập S có kích thước |S|−1 Đầu danh sách lưu S Mỗi mắt xích gồm hai trường: trường id lưu mã tập S′ trường x lưu phần tử x=S∖S′ Mã giả cho dưới, seed id tập S GENERATESUBSET(int seed, n): node *head = NEWNODE() head→→id = seed; node *iterator = head for i←0 to n−1 Sinh Viên Thực Hiện: Nguyễn Quốc Tuấn – 1781310178 10 Giảng Viên Hướng Dẫn : Vũ Văn Định if ((seed>>i)&1) = [[check (i+1)-th bit to be 1]] node *elem = NEWNODE() elem→id =(1x-1][i-1]; }else{ Cost[set_id][i] = INFTY; while(iterator != NULL){ Cost[set_id][i] = min(Cost[set_id][i], Cost[iterator->id][iterator>x] + C[iterator->x-1][i-1]); iterator = iterator->next; } } Sinh Viên Thực Hiện: Nguyễn Quốc Tuấn – 1781310178 16 Giảng Viên Hướng Dẫn : Vũ Văn Định } // liet ke cac tap struct node *generate_subset(unsigned int seed, int n){ struct node *head; head = malloc( sizeof(struct node)); head->next = NULL; head->id = seed; struct node *iterator = head; int i = 0; for(i = 0; i< n; i++){ if(((seed >> i)&1) == 1){ struct node* elem = malloc( sizeof(struct node) ); elem->id = (1next = NULL; iterator->next = elem; iterator = iterator->next; } } return head; } // tinh kich thuoc mang subsets void generate_all_subsets(struct node *subsets[], int size, int n){ Sinh Viên Thực Hiện: Nguyễn Quốc Tuấn – 1781310178 17 Giảng Viên Hướng Dẫn : Vũ Văn Định int i = 0; for(i = 1; i < size; i++){ subsets[i] = generate_subset(i,n); } } struct node *generate_set(unsigned int seed, int n){ struct node *root; root = malloc( sizeof(struct node)); root->x = seed; root->next = NULL; struct node *iterator = root; unsigned int w = seed; while(1){ unsigned set_id = next_set(w,n); if(set_id != 0){ struct node* elem = malloc( sizeof(struct node) ); elem->x = set_id; elem->next = NULL; iterator->next = elem; iterator = iterator->next; } else break; } return root; Sinh Viên Thực Hiện: Nguyễn Quốc Tuấn – 1781310178 18 Giảng Viên Hướng Dẫn : Vũ Văn Định } int next_set(unsigned int v, int n){ unsigned int w; unsigned int t = (v |(v - 1)) + 1; w = t | ((((t & -t) / (v & -v)) >> 1) - 1); if(w >> n == 0)return w; else return 0; } void backtrack(int i, int currTourVal, int n){ visit[i] = 1; int j = 0; int visitable = 0; for(j = 0; j < n; j++ ){ if(visit[j] == 0){ visitable = 1; if(currTourVal + C[i][j] < backtrackOpt){ backtrack(j, currTourVal + C[i][j], n); } } } if(visitable == 0){ backtrackOpt = min(backtrackOpt, currTourVal + C[i][0]); Sinh Viên Thực Hiện: Nguyễn Quốc Tuấn – 1781310178 19 Giảng Viên Hướng Dẫn : Vũ Văn Định } visit[i] = 0; } 3.2 Hình ảnh kết code chạy Sinh Viên Thực Hiện: Nguyễn Quốc Tuấn – 1781310178 20 Giảng Viên Hướng Dẫn : Vũ Văn Định KẾT LUẬN Kết đạt - Sau thuật toán triển khai kết nhận chi phí tối ưu cho trình tối ưu - Sinh Viên Thực Hiện: Nguyễn Quốc Tuấn – 1781310178 21 Giảng Viên Hướng Dẫn : Vũ Văn Định DANH MỤC THAM KHẢO - http://www.giaithuatlaptrinh.com - Jeff Erickson Lecture Notes on Single Source Shortest Paths, UIUC, 2014 - https://www.geeksforgeeks.org/travelling-salesmanproblem-set-1/ -https://viblo.asia/p/quy-hoach-dong-mot-thuat-toan-thanthanh-E375zy01lGW - https://ktmt.github.io/blog/2014/04/19/mot-so-vi-du-ve-quyhoach-dong/ Sinh Viên Thực Hiện: Nguyễn Quốc Tuấn – 1781310178 22 ... Viên Hướng Dẫn : Vũ Văn Định CHƯƠNG 1: TỔNG QUAN CHIẾN LƯỢC QUY HOẠCH ĐỘNG TRONG QUÁ TRÌNH XÂY DỰNG THUẬT TOÁN 1.1 Giới thiệu chiến lược quy hoạch động - Thuật toán quy hoạch động ưa chuộng... động với chiến lược chia để trị Giống : - Hai chiến lược chia để trị chiến lược quy hoạch động chia toán lớn thành toán nhỏ , dễ giải để tổng hợp lời giải , giải toán lớn Khác : - Chiến lược chia... dựng toán quy hoạch động Xây dựng toán quy hoạch động gồm giai đoạn: Sinh Viên Thực Hiện: Nguyễn Quốc Tuấn – 1781310178 Giảng Viên Hướng Dẫn : Vũ Văn Định Giai Đoạn 1: Phân tích xem tốn cần giải

Ngày đăng: 26/07/2022, 20:53

Xem thêm:

w