Báo cáo khoa học: "SO SÁNH MỘT SỐ PHƯƠNG PHÁP TÌM KIẾM TỐI ƯU ỨNG DỤNG TRONG KỸ THUẬT" potx

9 471 7
Báo cáo khoa học: "SO SÁNH MỘT SỐ PHƯƠNG PHÁP TÌM KIẾM TỐI ƯU ỨNG DỤNG TRONG KỸ THUẬT" potx

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

Thông tin tài liệu

CT 2 I. ĐẶT VẤN ĐỀ 1.1. Xác định nhiệm vụ của bài toán tối ưu Trong kỹ thuật, khi giải quyết bất kỳ nhiệm vụ nào chúng ta đều mong muốn có phương án tốt nhất theo một hoặc một vài tiêu chí nào đó. Có thể liệt kê rất nhiều những ví dụ cụ thể như: tiết kiệm thời gian nhất, chi phí nhỏ nhất, năng suất lớn nhất, quãng đường đi ngắn nhất, thiết kế kết cấu với trọng lượng vật liệu nhỏ nhất… Để giải được những bài toán này, toán học đã cho ra đời một ngành là “Quy hoạch toán học” hay “tối ưu hóa” [1], [3]. Bài toán tối ưu nói chung được viết dưới dạng toán học như sau: Tìm giá trị cực tiểu (hoặc cực đại) hàm: n f(x) min(max);x R   (1) Với các điều kiện: g i (x) ≥ 0; i = 1,2, , m h i (x) = 0; i = 1,2, , l SO SÁNH MỘT SỐ PHƯƠNG PHÁP TÌM KIẾM TỐI ƯU ỨNG DỤNG TRONG KỸ THUẬT TS. NGUYỄN QUÁN THĂNG Phòng Khoa học Công nghệ MT Bộ Tư lệnh Công binh TS. NGUYỄN TUẤN ANH Bộ môn Kỹ thuật ATGT Trường Đại học Giao thông Vận tải ThS. NGUYỄN THẾ MINH Bộ môn Xe máy Công binh Học viện Kỹ thuật Quân sự Tóm tắt: Bài báo giới thiệu kết quả nghiên cứu, đánh giá một số thuật toán tìm kiếm tối ưu dựa trên cơ sở mô phỏng Monte - Carlo đang được ứng dụng để giải các bài toán kỹ thuật trên thế giới. Kết quả nghiên cứu có thể áp dụng cho bài toán tối ưu ứng dụng. Summary: The article is introduced about result searched and evaluated for some optimal method bese on Monte - Carlo simulation that be using in the world. The result can be apllied for optimal mechanism design. CT 2 Bài toán đặt ra yêu cầu là tìm tập hợp các biến x i , i = 1, … ,n thoả mãn các điều kiện ràng buộc đồng thời hàm f(x) đạt giá trị cực tiểu (hoặc cực đại). Thực ra tìm cực tiểu hoặc cực đại trong toán học không khác nhau nhiều (dùng phép biến đổi hàm ngược), do vậy trong bài báo này chủ yếu ta xét bài toán tìm cực tiểu. Hàm f(x) trong biểu thức (1) được gọi là hàm mục tiêu hoặc tiêu chuẩn tối ưu, biểu diễn mối quan hệ giữa tiêu chuẩn chất lượng của quá trình khảo sát và các biến độc lập x. Các hàm số g i (x), h i (x) là các điều kiện ràng buộc của bài toán tối ưu dưới dạng đẳng thức và bất đẳng thức. Trong không gian các biến, các hàm số này tạo ra miền giới hạn D các khả năng cho phép của hàm f(x). Nếu như D  R n (với R là số chiều của hàm mục tiêu), có nghĩa là không tồn tại bất kỳ một điều kiện giới hạn nào ta nói rằng bài toán quy hoạch phi tuyến không có điều kiện ràng buộc. Tuy nhiên trong phần lớn các bài toán tối ưu, người sử dụng thường có băn khoăn đó là: kết quả nhận được từ quá trình tính đã thật sự là phương án tốt nhất chưa. Để minh họa vấn đề này ta có thể xét ví dụ như hàm Peaks (2) - hai biến là hàm đơn điệu đa cực trị, được biểu diễn bằng đồ thị như trên hình 1. 2 2 2 2 2 2 x (-x -(x +1) ) (-x -x ) (-(x +1) -x ) 1 2 3 5 1 1 2 1 2 1 2 f(x) = 3.(1- x ) .e -10.( - x - x ).e - .e 1 1 2 5 3 (2) Hình 1. Minh hoạ tối ưu toàn cục Như trên hình 1, xung quanh phương án tốt nhất (ở đây chọn là điểm thấp nhất - điểm A) còn có một điểm đạt cực trị địa phương là điểm B và một số điểm nghi ngờ có cực tiểu khác. Trong quá trình giải, rất có khả năng kết quả giải bài toán tối ưu của chúng ta bị "kẹt" tại một cực trị nào đó (không phải điểm A) và không thoát ra được. Vì vậy, việc phát triển các thuật toán đủ mạnh tiệm cận được giá trị tối ưu luôn được người làm kỹ thuật quan tâm. 1.2. Các dạng bài toán tìm kiếm tối ưu dựa trên cơ sở mô phỏng Monte - Carlo Với các phương pháp cổ điển, những bài toán tìm kiếm tối ưu trong không gian tìm kiếm nhỏ là tương đối phù hợp. Tuy nhiên để tìm được nghiệm tiệm cận tối ưu trong không gian tìm kiếm lớn cần thiết phải có những kỹ thuật tìm kiếm đặc biệt dựa trên những hiểu biết về trí tuệ nhân tạo và mô phỏng các hiện tượng vật lý hay sinh học. Trong số đó nổi bật lên là các phương pháp tìm kiếm tối ưu Monte - Carlo sau: - Thuật giải di truyền (Genetic Algorithms - GA) CT 2 - Thuật mô phỏng luyện kim (Simulated Annealing Algorithm - SA) - Thuật tiến hoá vi phân (Differential Evolution Algorithm - DE) Đây là các thuật toán thuộc lớp các thuật giải xác suất, hiện đại và đang được quan tâm ứng dụng vào giải các bài toán tối ưu kỹ thuật. II. NGUYÊN LÝ HOẠT ĐỘNG VÀ SƠ ĐỒ THUẬT TOÁN 2.1. Thuật giải di truyền a. Nguyên lý hoạt động Giải thuật di truyền - GA do D.E. Goldberg đề xuất năm 1968, sau này được phát triển bởi L.Davis và Z.Michalevicz. Đây là thuật toán hình thành từ việc nhận xét thế giới tự nhiên: Quá trình tiến hoá tự nhiên là quá trình tối ưu nhất, hoàn hảo nhất. Đây được xem như một tiên đề đúng, không chứng minh được, nhưng phù hợp với thực tế khách quan. Tính tối ưu của quá trình tiến hoá thể hiện ở chỗ thế hệ sau bao giờ cũng tốt hơn (phát triển hơn, hoàn thiện hơn và phù hợp với môi trường hơn) thế hệ trước. Xuyên suốt quá trình tiến hoá, các thế hệ mới được sinh ra để bổ sung, thay thế thế hệ cũ, trong quá trình này cá thể nào phát triển hơn thích ứng hơn với môi trường sẽ tồn tại, cá thể nào kém thích ứng hơn sẽ bị đào thải. Như vậy thuật toán di truyền đều mô phỏng bốn quá trình tiến hoá cơ bản: lai ghép, đột biến, sinh sản, chọn lọc tự nhiên. b. Xây dựng sơ đồ thuật toán Sơ đồ thuật toán được trình bày trên hình 2a. Mã hoá các biến và xây dựng quần thể ban đầu (khối 1, 2): Ký hiệu npop_size là số cá thể trong một quần thể; nếu bài toán có n biến độc lập và mỗi biến được biểu diễn bởi mi(j) bit thì mỗi phương án cần n j 1 nx mi(j)    bit để biểu diễn. Tương ứng, toàn bộ bài toán cần (npop_size*nx) bit. Để có quần thể ban đầu ta chọn ngẫu nhiên npop_size cá thể trong phạm vi cho phép. Quá trình chọn lọc các cá thể (khối 4) trong GA dựa trên độ thích nghi của chúng (khối 3) thông qua xác suất lựa chọn như định nghĩa bởi biểu thức (4). Để tính xác suất lựa chọn thực hiện các bước sau: - Tính độ thích nghi eval(v i ) cho mỗi cá thể; v i (i = 1,2,…, npop_size) - Tính tổng giá trị thích nghi cho toàn bộ quần thể: npop_size F = eval(v ) i=1 i  (3) - Tính xác suất lựa chọn p i cho mỗi cá thể v i : CT 2 eval(v ) i p = npop_size i eval(v ) i=1 i  (4) - Tính vị trí xác suất q i cho mỗi cá thể v i (i = 1,2,…, npop_size) i q = p j=1 i j  (5) Tiến trình chọn lọc được thực hiện bằng cách quay bánh xe Rulet npop_size lần; mỗi một lần sẽ chọn được một cá thể để đưa vào quần thể mới. Như vậy sẽ có một số cá thể được chọn hơn một lần và có cá thể đã bị loại bỏ. Trong quá trình lai ghép (khối 5), thông số có ý nghĩa đối với việc lai ghép là xác suất lai ghép p c , tham số này cho biết số cá thể sẽ tham gia lai ghép trong quần thể là (p c *npop_size). Thường p c =0.25 [1], [2], [4]. - Chọn ngẫu nhiên (p c *npop_size) cá thể trong quần thể, tiếp tục lại chọn ngẫu một cặp cá thể trong số các cá thể sẽ lai ghép. - Chọn ngẫu nhiên điểm lai ghép và tiến hành lai ghép. Đối với quá trình đột biến (khối 6), thông số khác điều khiển quá trình là xác suất đột biến p m . Tham số này cho biết số bit sẽ đột biến là (p m . nx . npop_size). Cách thực hiện như sau: - Phát (p m *nx*npop_size) lần số ngẫu nhiên r phân bố đều trong khoảng [1, (nx*npop_size)]. Nếu r trùng với vị trí nào sẽ tiến tiến hành đột biến bit đó, có nghĩa là nếu giá trị của bit đó bằng 0 thì chuyển thành 1 hoặc ngược lại. 2.2. Thuật mô phỏng luyện kim a. Nguyên lý hoạt động Như ta đã biết khi đốt nóng các phân tử của thủy tinh hoặc kim loại chuyển động tự do, nhiệt độ là thước đo mức năng lượng trong từng phần tử cũng như toàn bộ hệ thống. Nếu như nhiệt độ giảm nhanh chóng, các phần tử ấy sẽ đông đặc lại như một kết cấu phức hợp. Tuy nhiên nếu nhiệt độ giảm chậm hơn thì dạng tinh thể của chúng sẽ mịn hơn nhiều. Trong trường hợp này những phần tử của các tinh thể rắn ấy ở trạng thái năng lượng cực tiểu. Năm 1983, S. Kirkpatrick, C. D. Gelatt và M. P. Vecchi đã mô phỏng lại quá trình tự nhiên xảy ra với mạng tinh thể của thủy tinh hoặc kim loại khi làm nguội để tìm nghiệm tối ưu, do vậy phương pháp được đề xuất có tên là Mô phỏng luyện kim (SA). b. Xây dựng sơ đồ thuật toán Sơ đồ thuật toán được trình bày trên hình 2b. Khác với thuật toán di truyền, trong thuật toán mô phỏng luyện kim chỉ có một điểm ban đầu được khởi tạo theo quy luật ngẫu nhiên phân bố đều trong miền xác định của bài toán sau CT 2 khi cho các tham số ban đầu cần thiết (khối 1, 2). Mức năng lượng của toàn bộ hệ thống sẽ giảm dần thông qua việc điều khiển nhiệt độ (khối 3). Sau đó một điểm mới XP(i) trong miền xác định của bài toán cũng được xác lập (khối 4). Điểm mới này phụ thuộc vào điểm ban đầu X(i) cũng như vào véc tơ điều chỉnh chiều dài bước Vm(i). Sai số giá trị hàm tại cặp điểm trên tính theo công thức  = f(XP) - f(X). (6) Giá trị này được sử dụng để xem xét đánh giá nhằm xác định hướng chuyển động tiếp theo trong quá trình tìm nghiệm (khối 5). Trong bài toán tìm Max, chuyển động đi lên (>0 - uphill) được chấp nhận, thì điểm mới sẽ thay thế điểm cũ [X(i)=XP(i)] - (khối 7). Một bước đi xuống (<0 dowhill), cũng có thể được chấp nhận nếu thỏa mãn tiêu chuẩn kiểm tra Metropolis (khối 8, 9). Bằng cách như vậy thuật toán có thể thoát khỏi những cực trị cục bộ và sẽ dừng lại khi thoả mãn điều kiện dừng (khối 10). 2.3. Thuật tiến hoá vi phân a. Nguyên lý hoạt động Trên cơ sở ý tưởng của thuật toán GA, vào năm 1995, Rainer Storn và Kenneth Price đã hoàn thiện cơ chế đột biến và lai ghép để tạo ra một thuật toán mới tin cậy, hiệu quả hơn. Điểm khác biệt lớn nhất của DE so với GA là luôn duy trì và bổ sung một cặp 2 véctơ bao gồm (n_popsize) quần thể với (m) chiều các tham số thực và đã ứng dụng thành công cho nhiều bài toán tối ưu ở các lĩnh vực khác nhau. b. Xây dựng sơ đồ thuật toán Sơ đồ thuật toán được trình bày trên hình 2c. Cũng như thuật toán GA đã trình bày ở trên, thuật toán tiến hoá vi phân cũng khởi tạo quần thể các điểm ban đầu P(t) theo quy luật ngẫu nhiên phân bố đều trong miền xác định bài toán sau khi cho các thông số ban đầu (khối 1, 2). Mỗi phần tử trong quần thể ban đầu này cũng được DE thực hiện trên miền tham số thực với công thức sau [5]: x = rand(0,1)*(BU -BL ) + BL ij ij ij ij (7) Trong đó: x ij - giá trị của phần tử ij với: i - số cá thể xem xét của bài toán; j - số biến của bài toán tối ưu; BU ij , BL ij - giới hạn trên và giới hạn dưới của biến x ij ; rand (0,1) - số ngẫu nhiên phân bố đều trong khoảng [0, 1]. Ngay sau quá trình tạo quần thể ban đầu, khác với GA, thuật toán DE thực hiện luôn tiến trình đột biến (khối 3). Trong tiến trình này, DE tiếp tục tạo ra một quần thể được đột biến [V] dựa trên quần thể ban đầu. Kỹ thuật đột biến trong thuật toán DE là sự kết hợp giữa hệ số tỷ lệ cho trước và các quá trình ngẫu nhiên. Phương trình (8) biểu diễn giá trị phần tử đột biến v ij từ việc tổ hợp ba phần tử khác nhau được chọn ngẫu nhiên trong quần thể ban đầu [X]. v = x + F*(x -x ) ij ro,j r1,j r2,j (8) CT 2 Trong đó: r 0 , r 1 , r 2 - các giá trị ngẫu nhiên khác nhau được chọn theo luật phân bố đều trong khoảng [0, n_popsize]; F - hằng số tỷ lệ. F  (0,1) là một số thực dương điều khiển mức độ tiến hóa của quần thể. Trong quá trình lai ghép (khối 4), DE cũng tiến hành lai ghép theo kiểu cặp đôi (dual crossover) tạo ra một quần thể lai ghép [U] có giá trị các tham số được lựa chọn ngẫu nhiên từ các quần thể [X] và [V] ban đầu. Kỹ thuật lai ghép sử dụng trong lập trình của DE có thể biểu diễn như sau: v ; if rand(0,1) £ C or j= rand(j) r ij u = x ; otherwise ij ij      (9) Trong đó: C r - xác suất lai ghép. C r  (0,1) được người sử dụng định nghĩa nhằm điều khiển một phần các tham số được sao chép từ quần thể đột biến. Thêm vào đó giá trị của phần tử lai ghép u ij với chỉ số chọn ngẫu nhiên j = rand(j) được lấy từ quần thể đột biến [V] sẽ đảm bảo chắc chắn phần tử lai ghép không trùng với phần tử ban đầu x ij . Trong quá trình chọn lọc và tái sinh (khối 5, 6), các cá thể trong quần thể lai ghép [U] được so sánh với các cá thể trong quần thể ban đầu [X] theo hướng cá thể nào có giá trị hàm mục tiêu thấp hơn sẽ được lựa chọn vào quần thể mới [Y]. Kỹ thuật lựa chọn của DE có thể biểu diễn như sau: u ;if f(u ) £ f(x ) ij ij ij y = x ; otherwise ij ij      (10) Quá trình tái sinh sẽ được thực hiện bằng phép gán [X] = [Y]. Điều kiện dừng của thuật toán DE cũng rất dễ dàng và thuận tiện. Các khối 7, 8, 9 biểu diễn điều kiện kiểm tra dừng và xuất kết quả của thuật toán. Các giá trị về số thế hệ tiến hoá (S th ) hoặc một giá trị vô cùng bé (EPS) được đưa ra so sánh với các sai lệch của quá trình tính. Biểu thức điều kiện dừng của thuật toán DE có thể viết như sau: N p F(x) i i=1 F(x) - £ ε; min N p  (11) Trong đó: F(x) min - giá trị nhỏ nhất của hàm mục tiêu tại thế hệ xét; F(x) i - giá trị hàm mục tiêu của cá thể thứ i; N p (= n_popsize) - tổng số cá thể trong quần thể đang xét;  - giá trị vô cùng bé cho trước (thường chọn = 10 -4  10 -6 tùy theo loại bài toán). CT 2 Hình 2. Sơ đồ các thuật toán GA, SA và DE III. MỘT SỐ BÀI TOÁN THỬ NGHIỆM VÀ SO SÁNH 3.1. Một số bài toán thử nghiệm a. Bài toán 1: Tìm cực tiểu hàm Generalized Rosenbrock Tìm cực tiểu hàm số sau: D-2 2 2 2 f(x) = (100.(x - x ) +(x -1) ; j+1 j j j=0  Các điều kiện hạn chế có dạng: -30  x j  30; j = 0,1,2, … , D - 1; D >1 Đồ thị hàm Generalized Rosenbrock với 2 biến được biểu diễn như hình 3. Hình 3. Đồ thị hàm Generalized Rosenbrock b. Bài toán 2: Tìm cực tiểu hàm Ackley Tìm cực tiểu hàm số sau: D-1 D-1 1 1 2 f(x) = -20.exp(-0,2. . x ) -exp( cos(2.π.x )) + 20 + e; j j D D j=0 j=0   Các điều kiện hạn chế có dạng: -30  x j  30; j = 0,1,2, …, D - 1; D > 1 Đồ thị hàm Ackley với 2 biến được biểu diễn như hình 4. a) b) c) CT 2 Hình 4. Đồ thị hàm Ackley c. Bài toán 3: Tìm cực đại hàm Zbigniew Michalewicz Tìm cực đại hàm số sau: f(x) = 21,5+ x sin 4 πx + x sin 20πx 1 1 2 2             Các điều kiện hạn chế có dạng: -3.0  x 1  12.1; 4.1  x 2  5.8 Đồ thị hàm Zbigniew Michalewicz được biểu diễn như hình 5. Hình 5. Đồ thị hàm Zbigniew Michalewicz d. Kết quả tính toán các bài toán thử nghiệm Kết quả tính toán ba bài toán thử nghiệm trên bằng chương trình tính viết bằng ngôn ngữ FORTRAN 95 được thể hiện trên bảng như sau: Bài toán 1 (n = 6) -2  x i  2 Bài toán 2 (n = 6) -30  x i  30 Bài toán 3 (n = 2) -3  x 1  12,1; 4,1 x 2  5,8 Tính toán nf t x* f(x*) nf t x* f(x*) nf t x* f(x*) GA - - - - - - - - 702 0 11,645 5,522 38,209 SA 12000 14 {0,9} 0,0036 13801 3 {0} 0 2601 3 11,625 5,225 38,350 DE 19350 2 {1} 0 12421 3 {0} 0 870 0 11,625 5,725 38,850 Trong đó: nf - số lần tính giá trị hàm; t - thời gian tính toán (% sec); x* - giá trị tối ưu của các biến; f(x*) - giá trị hàm ở điểm tối ưu. CT 2 3.2. So sánh khả năng của các phương pháp Từ các tài liệu tham khảo và kết quả lập trình, tính toán cụ thể cho các bài toán thử nghiệm, nhận thấy ưu nhược điểm của ba phương pháp trên như sau: GA SA DE Ưu điểm - Thuộc lớp thuật toán Monte- Carlo và do xem xét nhiều cá thể trong một quần thể nên có thể vượt qua cực trị địa phương, tiệm cận điểm tối ưu của bài toán. - Thuộc lớp thuật toán Monte - Carlo, có khả năng tạo ra các đột biến để tiệm cận điểm tối ưu của bài toán. - Có tiêu chuẩn dừng rõ ràng. - Có đầy đủ các ưu điểm của GA và SA. - Thời gian tính rất nhanh. - Được đánh giá là một thuật toán hiện đại nhất trong tối ưu. Nhược điểm - Việc xây dựng tiêu chuẩn dừng rất khó khăn. - Rất khó sử dụng đối với các hàm số biến đổi trái dấu ngẫu nhiên. - Thời gian tính thường kéo dài hơn so với các phương pháp GA, DE do số lượng vòng lặp trong chương trình nhiều. - Việc lựa chọn các hệ số tỷ lệ F và hệ số xác suất lai ghép C r phụ thuộc rất nhiều vào kinh nghiệm người sử dụng VI. KẾT LUẬN Qua quá trình nghiên cứu và thử nghiệm nhiều lần trên máy tính điện tử các thuật toán tối ưu trên kết hợp với kết quả thử nghiệm một số bài toán mẫu như đã đề cập, có thể đưa ra một số kết luận sau: - Theo quan điểm thuần tuý toán học, việc chứng minh nghiệm tối ưu của một bài toán thật sự không đơn giản đặc biệt với bài toán kỹ thuật. Tuy vậy, các phương pháp nêu trên cũng chỉ ra cho chúng ta một bức tranh khá tốt về tìm kiếm nghiệm tối ưu trong không gian lớn của bài toán đa cực trị, không liên tục khá phổ biến trong kỹ thuật. Với cả ba phương pháp đã trình bầy thì nghiệm đạt được chí ít cũng là phương án tốt nhất (theo một tiêu chuẩn xác định) trong tất cả các phương án đã xem xét. - Thông thường để giải các bài toán tối ưu thực tế trong kỹ thuật quá trình tính toán thường mất rất nhiều thời gian. Ví dụ dùng thuật toán GA để giải bài toán tối ưu kết cấu trong môi trường Matlab thường mất nhiều tiếng. Do đó, việc rút ngắn được thời gian trong tính toán tối ưu của thuật toán DE là một ưu điểm vượt trội so với các thuật toán khác trong quá trình tìm nghiệm, đặc biệt với bài toán mà giá trị hàm không thể biểu diễn được bằng những hàm đại số tường minh và với số biến lớn. Tài liệu tham khảo [1]. Hoàng Kiếm, Thuật giải di truyền, NXB Giáo dục, Hà nội, 2000. [2]. Nguyễn Đình Thúc, Trí tuệ nhân tạo - Lập trình tiến hóa, NXB Giáo dục, Hà nội, 2001. [3]. Bùi Minh Trí, Bài tập tối ưu hoá, NXB Khoa học Kỹ thuật, Hà nội, 2002. [4]. Zbigniew Michalewicz, Genetic Algorithms + Data Structures = Evolution Programs, Springer, Verlag, 1994. [5]. Kenneth Price, Rainer Storn, Jouni Lampinen, Differiential Evolution A Practical Approach to Global Optimization, Springer, Verlag, 2005 . 1,2, , l SO SÁNH MỘT SỐ PHƯƠNG PHÁP TÌM KIẾM TỐI ƯU ỨNG DỤNG TRONG KỸ THUẬT TS. NGUYỄN QUÁN THĂNG Phòng Khoa học Công nghệ MT Bộ Tư lệnh Công binh TS. NGUYỄN TUẤN ANH Bộ môn Kỹ thuật ATGT. trị tối ưu luôn được người làm kỹ thuật quan tâm. 1.2. Các dạng bài toán tìm kiếm tối ưu dựa trên cơ sở mô phỏng Monte - Carlo Với các phương pháp cổ điển, những bài toán tìm kiếm tối ưu trong. tối ưu trong không gian tìm kiếm nhỏ là tương đối phù hợp. Tuy nhiên để tìm được nghiệm tiệm cận tối ưu trong không gian tìm kiếm lớn cần thiết phải có những kỹ thuật tìm kiếm đặc biệt dựa trên

Ngày đăng: 06/08/2014, 16:22

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan