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

Tiểu luận tối ưu hóa "Cài đặt thuật toán đơn hình trên ngôn ngữ C"

34 1,1K 13

Đ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

Định dạng
Số trang 34
Dung lượng 1,1 MB

Nội dung

Cùng với sự phát triển mạnh mẽ của khoa học – kĩ thuật, các bài toán tối ưu trong các lĩnh vực thực tiễn xuất hiện ngày càng nhiều với quy mô ngày càng lớn và tính phức tạp ngày càng cao. Phạm vi và khả năng ứng dụng của chúng cũng ngày càng đa dạng và phong phú nhằm mục đích đưa chi phí sử dụng xuống mức tối thiểu và mang lại hiệu quả tối đa. Những bài toán thực tế này khi được tối ưu tốt có thể ảnh hưởng sống còn đối với sự phát triển của một doanh nghiệp, một công ti, một quốc gia, … mang lại một hiệu quả kinh tế không hề nhỏ. Thuật toán đơn hình (simplex algorithm) được George Bernard Dantzig đưa ra năm 1947 cùng lúc với việc ông khai sinh ra quy hoạch tuyến tính. Đây là một phương pháp thực sự có hiệu quả để giải những bài toán quy hoạch tuyến tính cỡ lớn trong thực tế. Nó là một trong những thuật toán làm thay đổi thế giới, được tạp chí Ecommerce Times xếp vào top 10 thuật toán của mọi thời đại. Nhằm mang lại cho các bạn những kiến thức cơ bản về thuật toán đơn hình, đồng thời đưa ra một giải pháp cụ thể để cài đặt chương trình, tôi đã quyết định lựa chọn đề tài “Cài đặt thuật toán đơn hình bằng ngôn ngữ C”. Để có thể nắm rõ được những thuật toán, các bước cài đặt cũng như cách thức tổ chức hoạt động của chương trình, mời các bạn tìm hiểu phần nội dung đề tài.

TRƯỜNG ĐH HỒNG ĐỨC KHOA CNTT&TT  BÀI TIỂU LUẬN HỌC PHẦN TỐI ƯU HÓA Đề tài: “Cài đặt thuật toán đơn hình trên ngôn ngữ C” SVTH : Bùi Hữu Giáp Lớp : Đại học tin – K15 MSV : 1261030003 Thanh Hóa, 5/2014 TRƯỜNG ĐH HỒNG ĐỨC KHOA CNTT&TT  BÀI TIỂU LUẬN HỌC PHẦN TỐI ƯU HÓA Đề tài: “Cài đặt thuật toán đơn hình trên ngôn ngữ C” SVTH : Bùi Hữu Giáp Lớp : Đại học tin – K15 MSV : 1261030003 GVHD : Trịnh Thị Phú Thanh Hóa, 5/2014 LỜI CẢM ƠN Trong quá trình học tập tại trường, em đã được học hỏi và tiếp thu rất nhiều kiến thức đại cương cũng như chuyên ngành nhằm nâng cao vốn hiểu biết và là hành trang quý báu giúp em vững bước vào đời. Em xin gửi lời cảm ơn chân thành đến khoa Công Nghệ Thông Tin và truyền thông, quý thầy cô đã giảng dạy chúng em trong suốt thời gian qua, cũng như tất cả quý thầy cô trong trường Đại học Hồng Đức. Đặc biệt em xin chân thành cảm ơn cô Trịnh Thị Phú – Giảng viên trực tiếp giảng dạy học phần Tối ưu hóa và đồng thời là người tận tình hướng dẫn em trong suốt thời gian thực hiện đề tài này. Tuy nhiên, dù rất cố gắng nhưng do thời gian có hạn nên chắc rằng bài tiểu luận của em khó tránh khỏi những thiếu sót. Em rất mong nhận được sự thông cảm và đóng góp ý kiến của quý thầy cô và các bạn để bài tiểu luận của em được hoàn chỉnh hơn. Em xin chân thành cảm ơn! Thanh Hóa, 5/2014 Sinh viên thực hiện MỤC LỤC CHƯƠNG I: MỞ ĐẦU 1 1.1. Lí do chọn đề tài 1 1.2. Mục tiêu và nhiệm vụ của đề tài 1 1.1.1. Mục tiêu đề tài 1 1.1.2. Nhiệm vụ đề tài 1 1.3. Khách thể, đối tượng và phạm vi nghiên cứu 2 1.1.1. Khách thể nghiên cứu 2 1.1.2. Đối tượng và phạm vi nghiên cứu 2 1.4. Các phương pháp nghiên cứu 2 CHƯƠNG II: CƠ SỞ LÍ LUẬN 3 2.1. Dạng chính tắc và dạng chuẩn tắc 3 2.1.1. Định nghĩa 3 2.1.2. Các phép biến đổi 3 2.1.3. Phương án cơ bản 4 2.1.4. Các tính chất 5 2.2. Phương pháp đơn hình 5 2.2.1. Nội dung 5 2.2.2. Bảng đơn hình 6 2.2.3. Cơ sở lí luận 7 2.2.4. Các bước giải bài toán đơn hình 7 2.2.5. Bài toán ẩn phụ 9 2.2.6. Bài toán ẩn giả 10 PHẦN III: NỘI DUNG 14 3.1. Tổ chức lưu trữ bài toán 14 3.2. Đọc dữ liệu từ tệp 15 3.3. Chuẩn hóa bài toán 17 3.4. Tìm các phần tử thuộc ma trận đơn vị 20 3.5. Khởi tạo giá trị 21 3.6. Kiểm tra tính dừng của thuật toán 22 3.7. Biến đổi bảng đơn hình 24 3.8. Các hàm khác trong chương trình 26 3.9. Thực hiện công việc giải bài toán. 26 PHẦN IV: KẾT LUẬN 28 4.1. Tóm tắt kết quả nghiên cứu 28 4.2. Đề xuất và hướng phát triển 28 TÀI LIỆU THAM KHẢO 30 Cài đặt chương trình thực hiện các phép toán trên đa thức một biến SVTH: Bùi Hữu Giáp 1 GVHD: Trịnh Thị Phú PHẦN I: MỞ ĐẦU 1.1. Lí do chọn đề tài Cùng với sự phát triển mạnh mẽ của khoa học – kĩ thuật, các bài toán tối ưu trong các lĩnh vực thực tiễn xuất hiện ngày càng nhiều với quy mô ngày càng lớn và tính phức tạp ngày càng cao. Phạm vi và khả năng ứng dụng của chúng cũng ngày càng đa dạng và phong phú nhằm mục đích đưa chi phí sử dụng xuống mức tối thiểu và mang lại hiệu quả tối đa. Những bài toán thực tế này khi được tối ưu tốt có thể ảnh hưởng sống còn đối với sự phát triển của một doanh nghiệp, một công ti, một quốc gia, … mang lại một hiệu quả kinh tế không hề nhỏ. Thuật toán đơn hình (simplex algorithm) được George Bernard Dantzig đưa ra năm 1947 cùng lúc với việc ông khai sinh ra quy hoạch tuyến tính. Đây là một phương pháp thực sự có hiệu quả để giải những bài toán quy hoạch tuyến tính cỡ lớn trong thực tế. Nó là một trong những thuật toán làm thay đổi thế giới, được tạp chí Ecommerce Times xếp vào top 10 thuật toán của mọi thời đại. Nhằm mang lại cho các bạn những kiến thức cơ bản về thuật toán đơn hình, đồng thời đưa ra một giải pháp cụ thể để cài đặt chương trình, tôi đã quyết định lựa chọn đề tài “Cài đặt thuật toán đơn hình bằng ngôn ngữ C”. Để có thể nắm rõ được những thuật toán, các bước cài đặt cũng như cách thức tổ chức hoạt động của chương trình, mời các bạn tìm hiểu phần nội dung đề tài. 1.2. Mục tiêu và nhiệm vụ của đề tài 1.1.1. Mục tiêu đề tài Đề tài này được thực hiện nhằm tạo ra một chương trình thực hiện việc giải bài toán quy hoạch tuyến tính bằng thuật toán đơn hình. 1.1.2. Nhiệm vụ đề tài - Tổ chức lưu trữ bài toán. - Tổ chức đọc giữ liệu từ tệp. - Chuẩn hóa bài toán. Cài đặt chương trình thực hiện các phép toán trên đa thức một biến SVTH: Bùi Hữu Giáp 2 GVHD: Trịnh Thị Phú - Tìm các phần tử thuộc ma trận đơn vị. - Khởi tạo giá trị cho các biến tại bảng đơn hình đầu tiên. - Kiểm tra tính dừng của thuật toán. - Biến đổi bảng đơn hình. - Thực hiện công việc lặp để giải bài toán đồng thời hiển thị từng bước ra màn hình. 1.3. Khách thể, đối tượng và phạm vi nghiên cứu 1.1.1. Khách thể nghiên cứu Cài đặt một chương trình thực hiện công việc giải bài toán quy hoạch tuyến tính bằng phương pháp đơn hình trên ngôn ngữ C. 1.1.2. Đối tượng và phạm vi nghiên cứu Chương trình giải bài toán quy hoạch tuyến tính bằng phương pháp đơn hình. 1.4. Các phương pháp nghiên cứu - Phương pháp thu thập tài liệu: thu thập tài liệu từ những bài báo khoa học, các trang web tin học và một số ebook về đề tài nghiên cứu, giáo trình và các tài liệu học tập khác. - Phương pháp phân tích và tổng hợp tài liệu: từ những tài liệu đã thu thập, tiến hành tìm hiểu, phân tích và tồng hợp nội dung liên quan đến đề tài. - Phương pháp chuyên gia: trong quá trình nghiên cứu có sự góp ý, điều chinh từ giáo viên hướng dẫn. - Phương pháp phân tích và tổng hợp kinh nghiệm: sau quá trình tìm hiểu và đúc kết kinh nghiệm, tiến hành tổng hợp và hoàn thiện đề tài. - Phương pháp thực nghiệm: sau khi cài đặt xong chương trình cần xây dựng một số bộ test tiêu biểu và thực hiện kiểm tra tính đúng đắn dựa trên kết quả thu được từ chương trình. Cài đặt chương trình thực hiện các phép toán trên đa thức một biến SVTH: Bùi Hữu Giáp 3 GVHD: Trịnh Thị Phú PHẦN II: CƠ SỞ LÍ LUẬN 2.1. Dạng chính tắc và dạng chuẩn tắc 2.1.1. Định nghĩa Trong thực tế, đa số các bài toán có điều kiện không âm của các ẩn. Từ đó có định nghĩa dạng chính tắc là bài toán (Ɗ, ƒ) như sau:  (  ) =      →   (1)       =   ( =1  ) (2)     ≥0 ( =1  ) (3) Trong đó, (2) gọi là ràng buộc cưỡng bức, (3) gọi là ràng buộc tự nhiên. Với bài toán (Ɗ, ƒ) chính tắc, có thể giả sử m ≤ n. Một trường hợp đặc biệt của dạng chính tắc là ma trận số liệu A = (a ij ) m x n có chứa đủ m vector cột là m vector đơn vị của không gian R m và b i ≥ 0 (i = 1 m) gọi là dạng chuẩn tắc. Không mất tính tổng quát, có thể định nghĩa bài toán (Ɗ, ƒ) chuẩn tắc như sau:  (  ) =        →    +        =  (=1 )   ≥0 ( =1  )  Trong đó: b i ≥ 0 (i = 1 m). 2.1.2. Các phép biến đổi Các phép biến đổi sau để đưa bài toán (Ɗ, ƒ) bất kì về dạng chính tắc tương đương để giải, và từ đó suy ra nghiệm của bài toán ban đầu. - ƒ(x) → max ⟺ g(x) = - ƒ(x) → min Cài đặt chương trình thực hiện các phép toán trên đa thức một biến SVTH: Bùi Hữu Giáp 4 GVHD: Trịnh Thị Phú - ∑     ≤    ⟺ ∑     +  =    với x n+i ≥ 0 ∑     ≥    ⟺ ∑     −    =  với x n+i ≥ 0 x i+n gọi là ẩn phụ. Có kết luận sau: Nếu  = (x 1 , x 2 , …, x n , x n+1 , …, x n+m ) là nghiệm của bài toán chính tắc biến đổi thì x = (x 1 , x 2 , …, x n ) là nghiệm của bài toán gốc. - Nếu ẩn x j không ràng buộc về dấu thì được thay bằng hiệu hai ẩn không âm. Nghĩa là đặt x j =    +    với    ≥ 0 và    ≥ 0. - Trường hợp b j < 0 thì nhân hai vế phương trình với -1 có được b j > 0. Vậy: Mọi bài toán quy hoạch tuyến tính đều có thể đưa về bài toán dạng tương đương. Hơn nữa, có thể các hệ số tự do bj trong hệ ràng buộc là không âm. 2.1.3. Phương án cơ bản Xét bài toán (Ɗ, ƒ) dạng chính tắc:  (  ) =      →         =   ( =1  )     ≥0 ( =1  )  Đặt A j = (a 1j , a 2j , …, a mj ) là vector cột thứ j trong ma trận A mxn b = (b 1 , b 2 , …, b m ) là cột hệ số tự do. Giả sử X = (  ,  ,…,  ) là phương án của bài toán thì hệ vector {A j |  >0} gọi là hệ vector liên kết với phương án X. Định nghĩa: X ∈ Ɗ là phương án cơ bản nếu hệ vector liên kết với X độc lập tuyến tính. Ẩn x j gọi là ẩn cơ bản nếu   > 0. Nhận xét: - Phương án cơ bản có tối đa m thành phần dương. Phương án cơ bản có đúng m thành phần dương gọi là không suy biến. Ngược lại được gọi là suy biến. Bài toán có phương án cơ bản suy biến gọi là bài toán suy biến. - Số phương án cơ bản của một bài toán (Ɗ, ƒ) là hữu hạn. Cài đặt chương trình thực hiện các phép toán trên đa thức một biến SVTH: Bùi Hữu Giáp 5 GVHD: Trịnh Thị Phú - Với bài toán dạng chuẩn tắc thì có phương án cơ bản là X 0 = (b 1 , b 2 , …, b m , 0, …, 0). 2.1.4. Các tính chất Tính chất 1: Bài toán (Ɗ, ƒ) chỉ xảy ra 1 trong 3 trường hợp sau: - Vô nghiệm. - Có một nghiệm duy nhất. - Vô số nghiệm. Tính chất 2: Nếu hàm mục tiêu ƒ(x) là chặn dưới (trên) đối với bài toán dạng min (max) trên tập phương án Ɗ thì bài toán (Ɗ, ƒ) có nghiệm. Tính chất 3: Nếu bài toán (Ɗ, ƒ) có nghiệm thì có nghiệm là phương án cơ bản. 2.2. Phương pháp đơn hình 2.2.1. Nội dung Xuất phát từ phương án cơ bản nào đó, tìm cách đánh giá nó. Nếu chưa tối ưu thì chuyển sang phương án cơ bản mới tốt hơn. Nếu bài toán có nghiệm thì sau hữu hạn bước sẽ tìm được phương án cơ bản tối ưu. Hơn nữa dấu hiệu vô nghiệm cũng đươc thể hiện trên thuật toán. Ví dụ 2.1: Xét bài toán (Ɗ, ƒ) dạng chuẩn tắc: ƒ(x) = x 1 – 2x 2 + 3x 3 – 2x 4 → min  2  −3  +  =4   +  +  =5   ≥0 ( =1 4 )  Có phương án cơ bản X 0 = (0, 0, 4, 5) và ƒ(X 0 ) = 2 với x 3 , x 4 là ẩn cơ bản. Đánh giá: ∀ x = (x 1 , x 2 , x 3 , x 4 ) ∈ Ɗ:  2  −3  +  =4   +  +  =5   ≥0 ( =1 4 )  ⟺    =4−2  +3    =5−  −    ≥0 ( =1 4 )  ƒ(x) = x 1 – 2x 2 + 3x 3 – 2x 4 = x 1 – 2x 2 + 3(4 – 2x 1 + 3x 2 ) – 2(5 – x 1 – x 2 ) = 2 – 3x 1 + 9x 2 Cài đặt chương trình thực hiện các phép toán trên đa thức một biến SVTH: Bùi Hữu Giáp 6 GVHD: Trịnh Thị Phú = 2 - ∆ 1 x 1 – ∆ 2 x 2 Vì x 1 , x 2 ≥ 0 nên nếu ∆ 1 , ∆ 2 ≤ 0 thì ƒ(X) ≥ 2 và X 0 là phương án tối ưu. Tuy nhiên, ở đây ∆ 1 = 3 > 0 nên X 0 chưa phải là nghiệm. Thử chọn x 1 , x 4 làm ẩn cơ bản, cho x 2 = 0 và x 3 = 0. Có:  2  =4   +  =5 ⇒ x 1 = 2 và x 4 =3. Rõ ràng A 1 , A 4 độc lập tuyến tính nên có phương án cơ bản là  = (2, 0, 0, 3) và ƒ() = -4. Đánh giá: ∀ x = (x 1 , x 2 , x 3 , x 4 ) ∈ Ɗ:  2  −3  +  =4   +  +  =5 ⟺    =2+     −       =3−     +     ƒ(x) = x 1 – 2x 2 + 3x 3 – 2x 4 = (2 +   x 2 –   x 3 ) – 2x 2 + 3x 3 – 2(3 –   x 2 +   x 3 ) = -4 +   x 2 +   x 3 (= -4 – ∆ 2 x 2 – ∆ 3 x 3 ) ≥ -4 Vì x 2 , x 3 ≥ 0 nên  là phương án tối ưu (∆ 2 , ∆ 3 ≤ 0). 2.2.2. Bảng đơn hình Cho bài toán (Ɗ, ƒ) chuẩn tắc:  (  ) =        →    +        =  (=1 )   ≥0 ( =1  )  Trong đó: b i ≥ 0 (i = 1 m). ∀j = 1 n đặt ∆ j =      −    và gọi là ước lượng của ẩn x j đối với phương án cơ bản X 0 = (b 1 , b 2 , …, b m , 0, …, 0) với ƒ(X 0 ) = ∑       [...]... hiện đề tài “Cài đặt thuật toán đơn hình bằng ngôn ngữ C” nhằm cho ra đời một chương trình thực hiện công việc giải bài toán quy hoạch tuyến tính bằng phương pháp đơn hình Đề tài của tôi chỉ là tiêu biểu của một trong số rất nhiều những cách thức tiếp cận vấn đề “Cài đặt thuật toán đơn hình bằng ngôn ngữ C” thực sự có hiệu quả, mang lại cho các bạn những kiến thức cơ bản về thuật toán đơn hình, đồng thời... Hữu Giáp GVHD: Trịnh Thị Phú Cài đặt chương trình thực hiện các phép toán trên đa thức một biến PHẦN IV: KẾT LUẬN 4.1 Tóm tắt kết quả nghiên cứu Trong môn Tối ưu hóa, thuật toán đơn hình là một trong những thuật toán quan trọng nhất Nếu chưa học thuật toán đơn hình, có thể coi như chúng ta chưa được họn môn Tối ưu hóa Vì tầm quan trọng như vậy,... Thị Phú Cài đặt chương trình thực hiện các phép toán trên đa thức một biến Xét bài toán: = + + → = ≥ 0 ( = 1 ( = 1 ) + ) Với M là số dương khá lớn (M ⟶ ∞) Bài toán này gọi là bài toán mở rộng của bài toán trên, hay bài toán M Với bài toán M có ngay phương án cơ bản ban đầu với xn+i (i = 1, bản ) là các ẩn cơ Dùng thuật toán đơn hình để giải... được chuẩn hóa từ chưa phải dạng chính tắc sang dạng chính tắc không - Hàm void p_table() dùng để in bảng đơn hình ra màn hình với hai dạng đó là bài toán có ẩn phụ và bài toán không có ẩn phụ 3.9 Thực hiện công việc giải bài toán Công việc này được thực hiện sau khi nhập và chuẩn hóa bài toán và ngay trong hàm main() bằng một vòng while với tư tưởng: - Nếu phương án hiện tại đã là tối ưu thì đưa ra... của bài toán và kết thúc -26 SVTH: Bùi Hữu Giáp GVHD: Trịnh Thị Phú Cài đặt chương trình thực hiện các phép toán trên đa thức một biến - Nếu bài toán không có phương án tối ưu thì đưa ra thông báo bài toán không có phương án tối ưu và kết thúc - Nếu không rơi vào hai trường hợp trên thì... tối ưu Định lí 2 (Dấu hiệu vô nghiệm): Nếu ∃∆k > 0 và ajk ≤ 0 ∀i =1 m thì bài toán vô nghiệm Định lí 3 (Điều chỉnh phương án): Nếu ∃∆k > 0 và ∃ajk > 0 thì có thể tìm được phương án cơ bản mới tốt hơn X0, trong trường hợp bài toán không suy biến 2.2.4 Các bước giải bài toán đơn hình Bước 1: Kiểm tra tính tối ưu của phương án X0 = (b1, b2, …, bm, 0, , 0) - Nếu ∆j ≤ 0 ∀j =1 n thì X0 là phương án tối ưu. ..Cài đặt chương trình thực hiện các phép toán trên đa thức một biến Lưu ý: ∆i = 0, ∀ i = 1 m Có bảng đơn hình sau: 2.2.3 Cơ sở lí luận Cho bài toán (Ɗ, ƒ) chuẩn tắc: ( )= → + = ( = 1 ) ≥ 0 ( = 1 ) Trong đó: bi ≥ 0 (i = 1 m) ∀j = 1 , đặt ∆j = − Có phương án cơ bản X0 = (b1, b2, …, bm, 0, , 0) với ƒ(X0) = ∑ Định lí 1 (Dấu hiệu tối ưu) :... khi giải các bài toán quy hoạch tuyến tính bằng phương pháp đơn hình Tuy có sự hạn hẹp cả về mặt thời gian vả trình độ nhưng với đề tài này, tôi đã cố gắng hết sức để có thể hoàn thành các yêu cầu đặt ra, bao gồm: - Khai báo các biến để lưu trữ bài toán - Tổ chức đọc giữ liệu từ tệp - Chuẩn hóa bài toán - Tìm các phần tử thuộc ma trận đơn vị - Khởi tạo giá trị cho các biến tại bảng đơn hình đầu tiên -... biến đổi bảng đơn hình được không, nếu được thì tiếp tục biến đổi bảng đơn hình, nếu không thì thông báo là không thể tiếp tục biến đổi và kết thúc Code: while (1) { int kq=result(); if (kq==1) { // Đưa ra kết quả của bài toán và kết thúc } else if (kq==0) { // Kết luận không có phương án tối ưu và kết thúc } else if (kq==-1) { // Nếu tìm được biến đưa vào thì tiếp tục biến đổi bảng đơn hình // Ngược... Fx[2][i]+=Cj[2][j]*a[j][i]; } Fx[1][i]-=fx[1][i]; Fx[2][i]-=fx[2][i]; } 3.6 Kiểm tra tính dừng của thuật toán Công việc kiểm tra tính dừng của thuật toán đươc đảm nhiệm bởi hàm int result() Hàm này sẽ trả về giá trị 1 nếu phương án hiện thời là tối ưu, trả về giá trị 0 nếu bài toán không có phương án tôi ưu và trả về giá trị -1 nếu thuật toán chưa thỏa mãn điều kiện dừng Hàm này thực hiện những công việc sau: - Đầu tiên, . định lựa chọn đề tài C i đặt thuật toán đơn hình bằng ngôn ngữ C . Để c thể nắm rõ đư c những thuật toán, c c bư c c i đặt c ng như c ch th c tổ ch c hoạt động c a chương trình, mời c c bạn. 1.1.2. Nhiệm vụ đề tài - Tổ ch c lưu trữ bài toán. - Tổ ch c đ c giữ liệu từ tệp. - Chuẩn hóa bài toán. C i đặt chương trình th c hiện c c phép toán trên đa th c một biến SVTH: Bùi. - Tìm c c phần tử thu c ma trận đơn vị. - Khởi tạo giá trị cho c c biến tại bảng đơn hình đầu tiên. - Kiểm tra tính dừng c a thuật toán. - Biến đổi bảng đơn hình. - Th c hiện c ng việc

Ngày đăng: 23/11/2014, 20:09

HÌNH ẢNH LIÊN QUAN

2.2.2. Bảng đơn hình  Cho bài toán (Ɗ, ƒ) chuẩn tắc: - Tiểu luận tối ưu hóa &quot;Cài đặt thuật toán đơn hình trên ngôn ngữ C&quot;
2.2.2. Bảng đơn hình Cho bài toán (Ɗ, ƒ) chuẩn tắc: (Trang 10)

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

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

TÀI LIỆU LIÊN QUAN

w