logo

Chương I: Một số mô hình và phương pháp tối ưu

Mô hình quy hoạch tuyến tính: - Các bước cần thiết khi áp dụng phương pháp mô hình hoá: + Khảo sát, phát hiện vấn đề cần giải quyết + Phát biểu các điều kiện ràng buộc, mục tiêu của bài toán dưới phương pháp định tính. + Thu thập số liệu, xác định phương pháp giải quyết. + Định ra quy trình giải + Đánh giá kết quả + Triển khai các phương án tìm được trên thực tế
Chương I MỘT SỐ MÔ HÌNH VÀ PHƯƠNG PHÁP TỐI ƯU 1. Mô hình quy hoạch tuyến tính 1.1. Các bước cần thiết khi áp dụng phương pháp mô hình hoá − Trước hết phải khảo sát, phát hiện vấn đề cần giải quyết. − Phát biểu các điều kiện ràng buộc, mục tiêu của bài toán dưới dạng định tính. Sau đó lựa chọn các biến quyết định / các ẩn số và xây dựng mô hình định lượng (còn gọi là mô hình toán học). − Thu thập số liệu, xác định phương pháp giải quyết. − Định ra quy trình giải / thuật giải. Có thể giải mô hình bằng cách tính toán thông thường. Đối với các mô hình lớn, gồm nhiều biến và nhiều điều kiện ràng buộc cần lập trình và giải mô hình trên máy tính. − Đánh giá kết quả. Trong trường hợp phát hiện thấy có kết quả bất thường hoặc kết quả không phù hợp với thực tế, cần kiểm tra và chỉnh sửa lại quy trình giải hoặc mô hình. − Triển khai các phương án tìm được trên thực tế. Các thuật ngữ sau thường gặp khi áp dụng phương pháp mô hình hoá: − Ứng dụng toán / Toán ứng dụng (Mathematical Applications hay Applied Mathematics). − Vận trù học (Operations Research viết tắt là OR). − Khoa học quản lí (Management Science viết tắt là MS) 1.2. Mô hình quy hoạch tuyến tính Phát biểu mô hình Với mục đích tìm hiểu bước đầu, xét mô hình toán học sau đây, còn gọi là mô hình quy hoạch tuyến tính hay bài toán quy hoạch tuyến tính (BTQHTT), mà trong đó chúng ta muốn tối ưu hoá (cực đại hoá hay cực tiểu hoá) hàm mục tiêu: z = c1x1 + c2x2 + cnxn → Max (Min) với các điều kiện ràng buộc: a11x1 + a12x2 +... +a1nxn ≤ b1 a21x1 + a22x2 +... +a2nxn ≤ b2 ... am1x1 + am2x2 +... +amnxn ≤ bm x1, x2,..., xn ≥ 0 (điều kiện không âm) Ví dụ: z = 8x1 + 6x2 → Max với các ràng buộc: 4x1 + 2x2 ≤ 60 2x1 + 4x2 ≤ 48 x 1 , x2 ≥ 0 Cần tìm các giá trị của các biến quyết định x1, x2 để các ràng buộc được thoả mãn và hàm mục tiêu đạt giá trị lớn nhất. Bài toán này có ý nghĩa kinh tế như sau: Giả sử một xí nghiệp sản xuất hai loại sản phẩm I và II. Để sản xuất ra một đơn vị sản phẩm I cần có 4 đơn vị nguyên liệu loại A và 2 đơn vị nguyên liệu loại B, các chỉ tiêu đó cho một đơn vị sản phẩm loại II là 2 và 4. Lượng nguyên liệu dự trữ loại A và B hiện có là 60 và 48 (đơn vị). Hãy xác định phương án sản xuất đạt lợi nhuận lớn nhất, biết lợi nhuận trên mỗi đơn vị sản phẩm bán ra là 8 và 6 (đơn vị tiền tệ) cho các sản phẩm loại I và II. Phương pháp đồ thị Phương pháp đồ thị có ý nghĩa minh hoạ và giúp hiểu bản chất vấn đề. Bước 1: Vẽ miền ràng buộc / miền các phương án khả thi, là tập hợp các phương án khả thi (các phương án, nếu nói một cách ngắn gọn). Mỗi phương án được thể hiện qua bộ số (x1, x2) còn gọi là véc tơ nghiệm, thoả mãn tất cả các ràng buộc đã có (xem hình I.1). − Trước hết chúng ta vẽ đồ thị 4x1 + 2x2 = 60 bằng cách xác định hai điểm trên đồ thị: (x1 = 0, x2 = 30) và (x2 = 0, x1 = 15). x2 30 4x1 + 2x2 = 60 12 A 8 B 2x1 + 4x2 = 48 4 C O 3 6 15 24 x1 Hình I.1. Phương pháp đồ thị giải bài toán quy hoạch tuyến tính Đồ thị trên là một đường thẳng chia mặt phẳng làm hai nửa mặt phẳng: một phần gồm các điểm (x1, x2) thoả mãn 4x1 + 2x2 ≤ 60; một phần thoả mãn 4x1 + 2x2 ≥ 60. Ta tìm được nửa mặt phẳng thoả mãn 4x1 + 2x2 ≤ 60. − Tương tự, có thể vẽ đồ thị 2x1 + 4x2 = 48 bằng cách xác định hai điểm thuộc đồ thị (x1 = 0, x2 = 12) và (x2 = 0, x1 = 24). Sau đó tìm nửa mặt phẳng thoả mãn 2x1 + 4x2 ≤ 48. − Lúc này, giao của hai nửa mặt phẳng tìm được trên cho ta tập hợp các điểm (x1, x2) thoả mãn hai ràng buộc đầu tiên. Tuy nhiên, để thoả mãn điều kiện không âm của các biến, ta chỉ xét các điểm nằm trong góc phần tư thứ nhất. Vậy miền các phương án khả thi là miền giới hạn bởi tứ giác OABC (còn gọi là đơn hình vì là miền tạo nên bởi giao của các nửa mặt phẳng). Bước 2: Trong miền (OABC) ta tìm điểm (x1, x2) sao cho z = 8x1 + 6x2 đạt giá trị lớn nhất. Cách 1: Dùng đường đồng mức. Tùy theo giá trị của x1, x2 mà z có những mức giá trị khác nhau. − Vẽ đường đồng mức: 8x1 + 6x2 = c ở mức c = 24, (ta có thể chọn giá trị c bất kì, nhưng chọn c = 24 là bội số chung của 6 và 8 để việc tìm toạ độ các điểm cắt hai trục toạ độ thuận lợi hơn). Dễ dàng tìm được hai điểm nằm trên đường đồng mức này là (x1 = 0, x2 = 4) và (x2 = 0, x1 = 3). Các điểm nằm trên đường đồng mức này đều cho giá trị hàm mục tiêu z = 24. − Tương tự, có thể vẽ đường đồng mức thứ hai: 8x1 + 6x2 = 48 đi qua hai điểm (x1 = 0, x2 = 8) và (x2 = 0, x1 = 6). Chúng ta nhận thấy, nếu tịnh tiến song song đường đồng r mức lên trên theo hướng của véc tơ pháp tuyến n (8, 6) thì giá trị của hàm mục tiêu z = 8x1 + 6x2 tăng lên. Vậy giá trị z lớn nhất đạt được khi đường đồng mức đi qua điểm B(12, 6) (tìm được x1 = 12, x2 = 6 bằng cách giải hệ phương trình 4x1 + 2x2 = 60 và 2x1 + 4x2 = 48). Kết luận: Trong các phương án khả thi thì phương án tối ưu là (x1 = 12, x2 = 6). Tại phương án này, giá trị hàm mục tiêu là lớn nhất zmax = 8 × 12 + 6 × 6 = 132. Nhận xét: Phương án tối ưu của bài toán trên (hay các BTQHTT khác, nếu có) luôn đạt được tại một trong các đỉnh của đơn hình hay còn gọi là các điểm cực biên của đơn hình (chính xác hơn, điểm cực biên là điểm thuộc đơn hình, mà không thể tìm được một đoạn thẳng nào cũng thuộc đơn hình nhận điểm đó là điểm trong). Nhận xét trên đây là một định lí toán học đã được chứng minh một cách tổng quát. Nói một cách hình ảnh, muốn đạt được phương án tối ưu cho các BTQHTT thì cần phải “mạo hiểm” đi xét các điểm cực biên của miền phương án. Cách 2: Từ nhận xét trên, để tìm phương án tối ưu ta chỉ cần so sánh giá trị của hàm mục tiêu tại các điểm cực biên của miền phương án. Tính giá trị z tại O(0, 0): z(0, 0) = 0; tại A(0, 12): z(0, 12) = 72; tại C(15,0): z(15, 0) = 120; tại B(12, 6): z(12, 6) = 132 = Max{z(O), z(A), z(B), z(C)}. Vậy zmax = 132. Nhận xét: Muốn tìm phương án tối ưu của BTQHTT ta xuất phát từ một điểm cực biên nào đó, tìm cách cải thiện hàm mục tiêu bằng cách đi tới điểm cực biên kề nó. Tiếp tục như vậy cho tới khi tìm được phương án tối ưu. Trong trường hợp BTQHTT có phương án tối ưu thì quy trình giải này bao gồm hữu hạn bước (do số điểm cực biên là hữu hạn). Đối với BTQHTT đang xét, quy trình giải được minh hoạ như sau: O(0, 0) → A(0,12) → B(12,6) dừng z=0 → z = 72 → z = 132 hoặc: O(0, 0) → C(15, 0) → B(12, 6) dừng z=0 → z = 120 → z = 132 Sơ đồ khối Bắt đầu Nhập dữ liệu Tìm điểm cực biên xuất phát Kiểm tra Sai Tìm điều kiện tối ưu điểm cực biên kề tốt hơn Đúng In và lưu trữ kết quả Dừng Hình I.2. Sơ đồ khối giải BTQHTT Quy trình giải BTQHTT tổng quát có sơ đồ khối giản lược như trình bày trên hình I.2. Trong sơ đồ trên, vì mục đích trình bày vấn đề đơn giản, chúng ta không đề cập tới các trường hợp khi BTQHTT có miền phương án là tập rỗng (lúc đó ta không tìm được phương án xuất phát) cũng như khi ta không tìm được điểm cực biên kề tốt hơn mặc dù điều kiện tối ưu chưa thoả mãn (lúc đó tập các giá trị hàm mục tiêu z không bị chặn). 1.3. Phương pháp đơn hình Đây là phương pháp số giải BTQHTT theo sơ đồ trên. Để giải ví dụ đã cho, trước hết chúng ta cần đưa BTQHTT về dạng chính tắc bằng cách thêm vào các biến bù không âm x3 và x4 như sau: z = 8x1 + 6x2 + 0x3 + 0x4 → Max với các ràng buộc: 4x1 + 2x2 + x3 = 60 2x1 + 4x2 + x4 = 48 x 1 , x2 , x3 , x4 ≥ 0 Cách lập và biến đổi các bảng đơn hình Để giải BTQHTT dạng chính tắc trên đây, cần lập một số bảng đơn hình như trình bày trong bảng I.1. Trước hết, cần điền số liệu của bài toán đã cho vào bảng đơn hình bước 1: − Cột 1 là cột hệ số hàm mục tiêu ứng với các biến cơ sở đã chọn. Phương án xuất phát có thể chọn là x1 = x2 = 0 (đây chính là điểm gốc toạ độ O(0, 0)), do đó x3 = 60, x4 = 48). Như vậy tại bước này chúng ta chưa bước vào sản xuất, nên trong phương án chưa có đơn vị sản phẩm loại I hay II được sản xuất ra (chỉ “sản xuất” ra các lượng nguyên liệu dư thừa, ta cũng nói là các “sản phẩm” loại III và IV), và giá trị hàm mục tiêu z tạm thời bằng 0. Các biến bù có giá trị lớn hơn 0 có nghĩa là các nguyên liệu loại tương ứng chưa được sử dụng hết. Ta gọi các biến x3 và x4 là các biến cơ sở vì chúng có giá trị lớn hơn 0 còn x1 và x2 là các biến ngoài cơ sở vì chúng có giá trị bằng 0. Với bài toán có hai ràng buộc, tại mỗi bước chỉ có hai biến cơ sở. − Cột 2 là cột các biến cơ sở. Trong cột 3 (cột phương án) cần ghi các giá trị của các biến cơ sở đã chọn. − Các cột tiếp theo là các cột hệ số trong các điều kiện ràng buộc tương ứng với các biến x1, x2, x3 và x4 của bài toán đã cho. Bảng I.1. Các bảng đơn hình giải BTQHTT Hệ số hàm Biến cơ Phương c1 = 8 c2 = 6 c3 = 0 c4 = 0 mục tiêu cj sở án x1 x2 x3 x4 0 x3 60 4 2 1 0 0 x4 48 2 4 0 1 Hàng z z0 = 0 z1 = 0 z2 = 0 z3 = 0 z4 = 0 Hàng ∆j = cj − zj ∆1 = 8 ∆2 = 6 ∆3 = 0 ∆4 = 0 8 x1 15 1 1/2 1/4 0 0 x4 18 0 3 −1/2 1 Hàng z z0 = 120 z1 = 8 z2 = 4 z3 = 2 z4 = 0 Hàng ∆j = cj − zj ∆1 = 0 ∆2 = 2 ∆3 = −2 ∆4 = 0 8 x1 12 1 0 1/3 −1/6 6 x2 6 0 1 −1/6 1/3 Hàng z z0 = 132 8 6 5/3 2/3 Hàng ∆j = cj − zj 0 0 −5/3 −2/3 Phân tích bảng đơn hình bước 1 − Hệ số ứng với biến x1 trên hàng thứ nhất là a11 = 4 có nghĩa là tỉ lệ thay thế riêng giữa một đơn vị sản phẩm loại I và một đơn vị sản phẩm loại III là 4 (giải thích: xét phương trình / ràng buộc thứ nhất 4x1 + 2x2 + x3 = 60, x1 tăng một đơn vị thì x3 phải giảm bốn đơn vị nếu giữ nguyên x2). Tương tự ta có thể giải thích được ý nghĩa của các hệ số aij khác cho trên hàng 1 và hàng 2 trong bảng đơn hình bước 1. − Chúng ta xét hàng z của bảng đơn hình. Để tính z1, cần áp dụng công thức z1 = (cột hệ số của hàm mục tiêu) × (cột hệ số của biến x1) = 0×4 + 0×2 = (giá một đơn vị sản phẩm loại III)×(tỉ lệ thay thế riêng loại I / loại III) + (giá một đơn vị sản phẩm loại IV) × (tỉ lệ thay thế riêng loại I / loại IV) = tổng chi phí phải bỏ ra khi đưa thêm một đơn vị sản phẩm loại I vào phương án sản xuất mới = 0. Các giá trị zj, với j = 1, 2, 3, 4, được tính tương tự và chính là các chi phí khi đưa một thêm một đơn vị sản phẩm loại xj vào phương án sản xuất mới. Còn z0 là giá trị của hàm mục tiêu đạt được tại phương án đang xét: z0 = (cột hệ số của hàm mục tiêu)× (cột phương án) = 0×60 + 0×48 = 0. − Trên hàng ∆j cần ghi các giá trị ∆j, j = 1, 2, 3, 4, tính theo công thức ∆j = cj –zj = lợi nhuận trên một đơn vị sản phẩm – chi phí trên một đơn vị sản phẩm. Vậy ∆j là "lãi biên"/một đơn vị sản phẩm khi đưa thêm một đơn vị sản phẩm loại j vào phương án sản xuất mới. Nếu ∆j > 0 thì hàm mục tiêu còn tăng được khi ta đưa thêm các đơn vị sản phẩm loại j vào phương án sản xuất mới. Có thể chứng minh được ∆j chính là đạo hàm riêng ∂z/∂xj của hàm mục tiêu z theo biến xj. Như vậy, x1 tăng lên 1 thì z tăng lên 8 còn x2 tăng lên 1 thì z tăng lên 6. Do ∆1 và ∆2 đều dương nên vẫn còn khả năng cải thiện hàm mục tiêu khi chuyển sang (hay “xoay sang”) một phương án cực biên kề tốt hơn (quay lại nhận xét ở phần giải bài toán bằng phương pháp đồ thị: điểm cực biên kề của điểm (0, 0) có thể là A(0, 12) hay C(15, 0)). Thủ tục xoay (pivotal procedure) Bước 1: Chọn cột xoay là cột có ∆j > 0 tức là chọn biến xj làm biến cơ sở mới do xj tăng kéo theo hàm mục tiêu tăng. Ở đây ta chọn đưa x1 vào (đánh dấu √ ở cột ∆1). Bước 2: Chọn hàng xoay để xác định đưa biến nào ra khỏi số biến cơ sở (vì tại mỗi bước số biến cơ sở là không thay đổi). Để chọn hàng xoay, ta thực hiện quy tắc “tỉ số dương bé nhất" bằng cách lấy cột phương án (60 48)T chia tương ứng cho cột xoay (4 2)T để chọn tỉ số bé nhất. Một điều cần chú ý là ta chỉ xét các tỉ số có mẫu số dương. Vì Min{60/4, 48/2} = 60/4 đạt được tại hàng đầu, nên ta đánh dấu √ vào hàng xoay là hàng đầu (hàng tương ứng với biến x3). Do đó cần đưa x3 ra khỏi các biến cơ sở. Bước 3: Chọn phần tử xoay nằm trên giao của hàng xoay và cột xoay. Bước 4: Xoay sang bảng đơn hình mới, xác định các biến cơ sở mới để điền vào cột biến cơ sở, đồng thời thay các giá trị trong cột hệ số hàm mục tiêu. Sau đó, tính lại các phần tử của hàng xoay bằng cách lấy hàng xoay cũ chia cho phần tử xoay để có hàng mới tương ứng. Bước 5: Các phần tử còn lại của bảng đơn hình mới được tính theo quy tắc "hình chữ nhật": (1)mới = (1)cũ – (2)cũ× (4)cũ/(3)cũ, trong đó (3) là đỉnh tương ứng với phần tử xoay (xem hình I.3). (2) (3) Chẳng hạn: (1)cũ = 4, 2(cũ) = 2 (3)cũ = phần tử xoay = 4, (4)cũ = 2 2 ⇒ (1)mới = 4 − 2 × = 3. 4 (1) (4) Hình I.3. Quy tắc hình chữ nhật Giải thích: Các bước xoay trên đây chỉ là phép biến đổi tương đương hệ phương trình 4x1 + 2x2 + x3 = 60 (a) 2x1 + 4x2 + x4 = 48 (b) để có hệ x1 + (1/2)x2 + (1/4)x3 = 15 (a’) 0x1 + 3x2 − (1/2)x3 + x4 = 18 (b’) bằng cách lấy phương trình (a) chia cho 4 (phần tử xoay) để có (a’), rồi lấy (b) trừ bớt 2 × (a)/4 để có (b’). Đây chính là nội dung của bước 4 và bước 5. Còn bước 3 sẽ đảm bảo rằng giá trị của các biến cơ sở mới không âm (x1 = 15, x4 = 18). Áp dụng thủ tục xoay cho các phần tử nằm trên hàng 1 và 2 của bảng đơn hình bước 1, sau đó tính các giá trị trên hàng zj và ∆j tương tự như khi lập bảng đơn hình bước 1, chúng ta sẽ nhận được bảng đơn hình bước 2. Phân tích bảng đơn hình bước 2 Bảng bước 2 có thể được phân tích tương tự như bảng bước 1. Cần chú ý rằng lúc này ta đang ở vị trí của điểm C(15, 0) vì x1 = 15 còn x2 = 0; giá trị của hàm mục tiêu là z0 = 120 đã được cải thiện hơn so với bước 1. Ta thấy ∆2 = 2 > 0 nên còn có thể cải thiện hàm mục tiêu bằng cách chọn biến x2 làm biến cơ sở mới. Thực hiện các bước xoay sang phương án cực biên kề tốt hơn, chúng ta sẽ có bảng đơn hình bước 3. Phân tích bảng đơn hình bước 3 Tại bảng đơn hình bước 3 ta thấy điều kiện tối ưu đã được thoả mãn (∆j ≤ 0 ∀j=1, 2, 3, 4) nên không còn khả năng cải thiện phương án. Phương án tối ưu đã đạt được tại x1 = 12, x2 = 6, x3 = 0, x4 = 0, tức là tại điểm cực biên B(12, 6) với giá trị zmax = 132. Một số chú ý − Điều kiện tối ưu cho các BTQHTT dạng Max là ∆j ≤ 0 ∀j. − Đối với các BTQHTT cần cực tiểu hoá hàm mục tiêu thì điều kiện tối ưu (hay tiêu chuẩn dừng) là ∆j ≥ 0 ∀j (nếu tồn tại j mà ∆j ≤ 0 thì cần tiếp tục cải thiện hàm mục tiêu bằng cách chọn cột j làm cột xoay...). − Trong thực tiễn giải các BTQHTT dạng tổng quát có thể xảy ra trường hợp không tìm được phương án xuất phát (tức là không có phương án khả thi, xem thêm mục 1.2). Lúc này có thể kết luận mô hình đã thiết lập có các điều kiện ràng buộc quá chặt chẽ, cần xem xét nới lỏng các điều kiện này. − Trong trường hợp ta tìm được cột xoay mà không tìm được hàng xoay thì kết luận hàm mục tiêu không bị chặn trên (đối với các BTQHTT dạng Max) hoặc không bị chặn dưới (đối với các BTQHTT dạng Min). Khi đó dừng quá trình giải và kết luận mô hình quy hoạch tuyến tính đã thiết lập không phù hợp với thực tế. 1.4. Giải mô hình quy hoạch tuyến tính bằng các phần mềm tính toán Hiện nay có nhiều phần mềm tính toán giải BTQHTT khá hiệu quả như Excel, Lingo. Những phần mềm này rất thân thiện với người dùng. Tuy nhiên cần nhấn mạnh rằng, việc phát biểu được mô hình bài toán và phân tích, đánh giá được kết quả mới chính là những khâu quan trọng nhất trong phương pháp mô hình hoá. Sau đây, chúng ta dùng phần mềm Lingo để giải ví dụ đã xét ở trên. z = 8x1 + 6x2 → Max với các ràng buộc: 4x1 + 2x2 ≤ 60 2x1 + 4x2 ≤ 48 x 1 , x2 ≥ 0. Để giải bài toán này, chúng ta cần cài đặt Lingo vào trong máy tính. Nhấn vào biểu tượng Lingo trên màn hình để vào cửa sổ Lingo. Sau đó thực hiện các lệnh Lingo: Menu > New > và gõ vào các dữ liệu của bài toán như hình I.4. Hình I.4. Nhập dữ liệu của bài toán quy hoạch tuyến tính trong Lingo Tiếp theo, cần nháy chuột vào nút LINGO và giải bài toán để thu được kết quả chi tiết như trên hình I.5. Hình I.5. Kết quả giải bài toán quy hoạch tuyến tính trong Lingo Kết quả chi tiết cho ta biết giá trị cực đại của hàm mục tiêu là 132 với phương án tối ưu là: x1 = 12, x2 = 6. Các giá trị tối ưu của các biến đối ngẫu là y1 = 5/3 và y2 = 2/3 (còn gọi là các giá ước định hay giá bóng Shadow Prices). 1.5. Một số ứng dụng của phương pháp đơn hình (Giải các bài toán quy hoạch sản xuất trong lĩnh vực cơ khí và điện lực) Bài toán phân phối điện năng Có ba hộ phụ tải cần được cung cấp điện năng từ hai nguồn điện nằm cách xa nhau. Giá thành truyền tải một đơn vị điện năng từ nguồn i đến hộ tiêu thụ j là cij. Khả năng cung cấp điện năng của mỗi nguồn bị giới hạn bởi trữ lượng hiện có của chúng là A1 và A2. Nhu cầu tiêu dùng của các hộ tiêu thụ là B1, B2 và B3. Gọi xij là lượng điện năng được đưa từ nguồn i tới hộ tiêu thụ j. Cần phải xác định các xij sao cho tổng chi phí là nhỏ nhất. Như vậy ta có BTQHTT sau: 2 3 z= ∑∑ c x i =1 j=1 ij ij → Min với các điều kiện ràng buộc là: x11 + x12 + x13 ≤ A1, x21 + x22 + x23 ≤ A2, x11 + x21 = B1, x12 + x22 = B2, x13 + x23 = B3, xij ≥ 0, ∀i = 1, 2 và ∀j = 1, 2, 3. Bài toán trên đây (hoặc ở dạng tổng quát hơn) có thể giải được bằng phương pháp đơn hình đã biết hay phương pháp phân phối sẽ được nghiên cứu ở mục 1.3, chương II. Bài toán phân tải cho máy Một xí nghiệp có hai loại máy M1 và M2. Các loại máy này có thể sản xuất được ba loại sản phẩm P1, P2 và P3 với các năng suất là aij, chẳng hạn máy M1 sản xuất sản phẩm P2 với năng suất a12. Mỗi đơn vị sản phẩm mang lại lãi suất cj với j = 1, 2, 3. Mỗi tháng xí nghiệp phải sản xuất sản phẩm loại j không ít hơn bj đơn vị và không vượt quá dj đơn vị, j = 1, 2, 3. Hãy lập kế hoạch phân tải cho các máy sao cho đạt tổng lợi nhuận lớn nhất. Dễ thấy bài toán này dẫn tới BTQHTT sau: 3 2 z= ∑c ∑a x j=1 j i =1 ij ij → Max với các điều kiện ràng buộc: a11x11 + a21x21 ≥ b1, a12x12 + a22x22 ≥ b2, a13x13 + a23x23 ≥ b3, a11x11 + a21x21 ≤ d1, a12x12 + a22x22 ≤ d2, a13x13 + a23x23 ≤ d3, x11 + x12 + x13 ≤ m1, x21 + x22 + x23 ≤ m2, xij ≥ 0, i = 1, 2 và j = 1, 2, 3. (trong đó m1 và m2 là tổng thời gian chạy máy M1 và M2). Bài toán trên đây còn có thể phát biểu một cách tổng quát hơn và vẫn giải được bằng phương pháp đơn hình. Hơn nữa, trong lĩnh vực quy hoạch sản xuất hay quản lí kinh doanh, nói riêng trong ngành cơ khí và điện lực, BTQHTT được ứng dụng rất rộng rãi và mang lại hiệu quả cần thiết. 2. Bổ sung thêm về phương pháp đơn hình 2.1. Đưa BTQHTT về dạng chính tắc Ví dụ 1: (Trường hợp các ràng buộc đều có dấu ≤) z = 8x1 + 6x2 → Max với các ràng buộc: ⎧4x1 + 2x 2 ≤ 60 ⎪ ⎨2x1 + 4x 2 ≤ 48 ⎪x , x ≥ 0 ⎩ 1 2 Đưa BTQHTT về dạng chính tắc như đã biết bằng cách thêm hai biến bù (slack variables) x3 và x4. Ta có BTQHTT dạng chính tắc là: z = 8x1 + 6x2 + 0x3 + 0x4 → Max ⎧4x1 + 2x 2 + x 3 = 60 ⎪ ⎨2x1 + 4x 2 + x 4 = 48 ⎪x , x , x , x ≥ 0 ⎩ 1 2 3 4 Lúc này, trong hệ hai điều kiện ràng buộc đã có đủ hai biến đứng độc lập trong từng phương trình với hệ số +1, nên đã có thể tìm được phương án cực biên xuất phát để bắt đầu quá trình giải bài toán. Một cách tổng quát, BTQHTT dạng chính tắc là bài toán với các biến không âm, các ràng buộc với dấu “=”, hệ số vế phải của các ràng buộc không âm. Ngoài ra, mỗi phương trình bắt buộc phải có một biến đứng độc lập với hệ số +1. Ví dụ 2: (Trường hợp có điều kiện ràng buộc với dấu ≥) z = 8x1 + 6x2 → Max với các ràng buộc: ⎧4x1 + 2x2 ≤ 60 ⎪ ⎨2x1 + 4x2 ≥ 48 ⎪x , x ≥ 0 ⎩ 1 2 Ta thêm các biến bù x3 (slack variable) mang dấu “+”, x4 (surplus variable) mang dấu “−” để có hệ điều kiện ràng buộc sau: ⎧4x1 + 2x 2 + x 3 = 60 ⎪ ⎨2x1 + 4x 2 − x 4 = 48 ⎪x , x , x , x ≥ 0 ⎩ 1 2 3 4 Phải thêm biến giả x5 (x5 gọi là lượng vi phạm của phương trình thứ hai) để được hệ điều kiện ràng buộc ⎧4x 1 + 2x 2 + x 3 = 60 ⎪ ⎨2x 1 + 4x 2 − x 4 + x 5 = 48 ⎪x , x , x , x , x ≥ 0 ⎩ 1 2 3 4 5 Lúc này, đã có đủ hai biến đứng độc lập trong từng phương trình với hệ số +1, nên đã có thể tìm được phương án cực biên xuất phát để bắt đầu quá trình giải bài toán bằng phương pháp đơn hình với hàm mục tiêu là z = 8x1 + 6x2 + 0x3 + 0x4 − Mx5 → Max, trong đó M ≈ +∞ và biểu thức −Mx5 gọi là lượng phạt (đánh thuế). Bài toán đã được đưa về dạng chính tắc. Lượng vi phạm x5 càng lớn thì hàm mục tiêu càng giảm, giá trị của hàm mục tiêu chỉ có thể đạt Max khi x5 = 0. Ví dụ 3: (Trường hợp có biến không dương) z = 8x1 − 6x2 → Max với các ràng buộc: ⎧4x1 + 2x 2 + x 3 ≤ 60 ⎪ ⎨2x1 + 4x 2 − x 4 = 48 ⎪ x ≥ 0, x ≤ 0, x ≥ 0, x ≥ 0 ⎩ 1 2 3 4 Lúc này muốn giải bài toán bằng phương pháp đơn hình ta phải đổi biến x'2 = −x2. Ta có BTQHTT với các biến đều không âm. z = 8x1 + 6x'2 → Max với các ràng buộc: ⎧4x1 − 2x '2 + x 3 ≤ 60 ⎪ ⎨2x1 − 4x '2 − x 4 = 48 ⎪x , x ' , x , x ≥ 0 ⎩ 1 2 3 4 Ví dụ 4: (Trường hợp có biến với dấu tuỳ ý) z = 8x1 + 6x2 → Max với các ràng buộc: ⎧4x1 + 2x 2 ≤ 60 ⎪ ⎨2x1 + 4x 2 ≤ 48 ⎪ x ≥ 0, x dấu tuỳ ý ⎩ 1 2 Lúc này ta viết biến x2 dưới dạng x2 = x'2 − x''2 với ⎧ x '2 = max[0, x 2 ] ⎧x ' ≥ 0 ⎨ thì đảm bảo ⎨ 2 ⎩ x ''2 = max[0, − x 2 ] ⎩ x ''2 ≥ 0 Các ràng buộc sẽ là ⎧4x1 + 2x '2 − 2x ''2 + x 3 = 60 ⎪ ⎨2x1 + 4x '2 − 4x '2 + x 4 = 48 ⎪ x , x ' , x '' , x , x ≥ 0 ⎩ 1 2 2 3 4 Bài toán với hàm mục tiêu là: z = 8x1 + 6x'2 − 6x''2 + 0x3 + 0x4 và các điều kiện ràng buộc trên là BTQHTT dạng chính tắc. Kết luận: Bao giờ cũng đưa được BTQHTT bất kì (các biến có dấu tuỳ ý, các ràng buộc có thể ≤, ≥, =) về dạng chính tắc. 2.2. Phương pháp đơn hình mở rộng Phương pháp đơn hình mở rộng còn gọi là phương pháp đánh thuế M được áp dụng để để giải BTQHTT có biến giả. Ví dụ: z = 8x1 + 6x2 → Max với các ràng buộc: ⎧4x1 + 2x 2 ≤ 60 ⎪ (a) ⎨2x1 + 4x 2 ≥ 48 ⎪x , x ≥ 0 ⎩ 1 2 hay: z = 8x1 + 6x2 +0x3 + 0x4 → Max với các ràng buộc ⎧4x1 + 2x 2 + x 3 = 60 ⎪ (b) ⎨2x1 + 4x 2 − x 4 = 48 ⎪x , x , x , x ≥ 0 ⎩ 1 2 3 4 Ta có thể đưa bài toán về dạng chính tắc sau gọi là bài toán M: Max z = 8x1 + 6x2 +0x3 + 0x4 − Mx5 (trong đó M ≈ +∞) với các ràng buộc ⎧4x1 + 2x 2 + x 3 = 60 ⎪ (c) ⎨2x1 + 4x 2 − x 4 + x 5 = 48 ⎪x , x , x , x , x ≥ 0 ⎩ 1 2 3 4 5 Cách 1: Có thể giải BTQHTT với các điều kiện ràng buộc (a) bằng phương pháp đồ thị để nhận được kết quả: phương án tối ưu là (x1 = 0, x2 = 30) và zmax = 180. Cách 2: Giải BTQHTT với các điều kiện ràng buộc (c) bằng cách lập bảng đơn hình như thông thường nhưng chú ý hệ số M ≈ +∞ (xem bảng I.2). Bảng I.2. Các bảng đơn hình giải bài toán M Hệ số Phương 8 6 0 0 −M Biến hàm mục cơ sở án x1 x2 x3 x4 x5 tiêu 0 x3 60 4 2 1 0 0 −M x5 48 2 4 0 −1 +1 Hàng z z0 = −48M z1 = −2M z2 = −4M z3 = 0 z4 = M z5 = −M Hàng ∆j ∆1 = 8+2M ∆2 = 6+4M ∆3 = 0 ∆4 = −M ∆5 = 0 0 x3 36 3 0 1 1/2 −1/2 6 x2 12 1/2 1 0 −1/4 1/4 Hàng z 72 3 6 0 −3/2 3/2 Hàng ∆j 5 0 0 3/2 −M − 3/2 0 x4 72 6 0 2 1 −1 6 x2 30 2 1 1/2 0 0 Hàng z 180 12 6 3 0 0 Hàng ∆j −4 0 −3 0 −M Tại bảng đơn hình cuối cùng, ta thấy ∆j ≤ 0 ∀j nên phương án tối ưu đã đạt được với x2 = 30, x4 = 72, các xj khác = 0 và zMax = 180. Lưu ý − Khi một biến giả đã được đưa ra khỏi cơ sở thì không bao giờ quay lại nữa. Do đó ta có thể xoá cột biến giả đó khỏi bảng đơn hình. − Nếu dấu hiệu dừng xuất hiện (∆j ≤ 0 ∀j) nhưng vẫn còn biến giả với giá trị dương trong số các biến cơ sở thì điều này chứng tỏ bài toán ban đầu không thể có phương án khả thi (có thể chứng minh bằng phản chứng). − Với ví dụ trên (xem bảng I.2) ta thấy quá trình giải chia làm hai pha: pha 1 nhằm giải bài toán M cho tới khi biến giả (x5) được đưa ra khỏi số biến cơ sở (lúc này có phương án cực biên xuất phát cho bài toán (b)) và pha 2 nhằm tìm phương án tối ưu cho bài toán (b). − Phần mềm tính toán Lingo có thể giải được tất cả các BTQHTT không đòi hỏi người dùng phải đưa chúng về dạng chính tắc. 3. Mô hình quy hoạch tuyến tính đa mục tiêu 3.1. Các khái niệm cơ bản Phát biểu mô hình Trong các bài toán kĩ thuật, công nghệ, quản lí, kinh tế nông nghiệp v.v... nảy sinh từ thực tế, chúng ta thường phải xem xét để tối ưu hoá đồng thời một lúc nhiều mục tiêu. Các mục tiêu này thường là khác về thứ nguyên, tức là chúng được đo bởi các đơn vị khác nhau. Những tình huống như vậy tạo ra các bài toán tối ưu đa mục tiêu. Như vậy, chúng ta cần phải tối ưu hoá (cực đại hoá hoặc cực tiểu hoá tuỳ theo tình huống thực tế) không phải là chỉ một mục tiêu nào đó, mà là đồng thời tất cả các mục tiêu đã đặt ra. Bài toán tối ưu đa mục tiêu mà trong đó miền ràng buộc D là tập lồi đa diện và các mục tiêu zi = fi(X), với i = 1, 2,…, p, là các hàm tuyến tính xác định trên D, được gọi là bài toán quy hoạch tuyến tính đa mục tiêu. Khi đó, ta có mô hình toán học sau đây được gọi là mô hình quy hoạch tuyến tính đa mục tiêu : Max CX với ràng buộc X ∈ D, trong đó: C là ma trận cấp p × n D = { X ∈ Rn: AX ≤ B} với A là ma trận cấp m × n và B ∈ Rm. Ví dụ: BTQHTT với hai mục tiêu f1(X) = x1 + 2x2 → Min hay z1 = f’1 (X) = −x1 − 2x2 → Max z2 = f2(X) = 2x2, → Max với các ràng buộc ⎧ − x1 + x 2 ≤ 3 ⎪ ⎨ x1 + x 2 ≥ 3 ⎪ x , x ≥0 ⎩ 1 2 Ta có thể viết bài toán này dưới dạng ma trận như sau: Max CX với ràng buộc X ∈ D = {X∈ R2 : AX ≤ B}, trong đó X = (x1, x2)T, B = (3, −3, 0, 0)T, còn ⎡ −1 1 ⎤ ⎢ −1 −1⎥ ⎡− 1 − 2⎤ C= ⎢ , A= ⎢ ⎥. ⎣0 2 ⎥⎦ ⎢ −1 0⎥ ⎢ ⎥ ⎣ 0 −1⎦ Có thể nói, BTQHTT đa mục tiêu là BTQHTT mà trong đó chúng ta phải tối ưu hoá cùng một lúc nhiều mục tiêu. Tuy nhiên, các mục tiêu này thường đối chọi cạnh tranh với nhau. Việc làm tốt hơn mục tiêu này thường dẫn tới việc làm xấu đi một số mục tiêu khác. Vì vậy việc giải các bài toán tối ưu đa mục tiêu, tức là tìm ra một phương án khả thi tốt nhất theo một nghĩa nào đó, thực chất chính là một bài toán ra quyết định. Có thể thấy lại ở đây một lần nữa khẳng định "Tối ưu hoá chính là công cụ định lượng chủ yếu nhất của quá trình ra quyết định". Hiện tại các tài liệu, sách chuyên khảo, tạp chí cập nhật về lĩnh vực liên ngành Toán − Tin, Khoa học quản lí, Công nghệ, Kinh tế, Điện, Cơ khí nông nghiệp,... đề cập rất nhiều tới bài toán tối ưu đa mục tiêu. Vấn đề nghiên cứu cơ sở lí thuyết, thuật toán, lập mô hình, xây dựng hệ máy tính trợ giúp quyết định, và áp dụng các mô hình tối ưu đa mục tiêu cho các quá trình công nghệ, quản lí,... là một vấn đề liên ngành được rất nhiều nhà khoa học và kĩ sư thực hành quan tâm. Phương án tối ưu Pareto Khái niệm then chốt trong tối ưu hoá đa mục tiêu là khái niệm phương án tối ưu Pareto. Định nghĩa: Một phương án tối ưu Pareto X* có tính chất sau đây: − Trước hết nó phải thuộc vào miền các phương án khả thi của bài toán, tức là phải thoả mãn tất cả các ràng buộc: X* ∈ D. − Với mọi phương án khả thi khác X ∈ D mà có một mục tiêu nào đó tốt hơn (fi(X) tốt hơn fi(X*)) thì cũng phải có ít nhất một mục tiêu khác xấu hơn (fj(X) xấu hơn fj(X*), j ≠ i). Nói một cách khác, không tồn tại một phương án khả thi nào X ∈ D có thể trội hơn X* trên tổng thể. Để minh hoạ định nghĩa trên, ta xét ví dụ đã cho. Ví dụ: Xét BTQHTT với hai mục tiêu. f1 (X) = x1 + 2x2 → Min f2 (X) = 2x2 → Max Với các ràng buộc ⎧− x1 + x 2 ≤ 3 ⎪ ⎨ x1 + x 2 ≥ 3 ⎪ x ,x ≥ 0 ⎩ 1 2 y d A 3 D 2 r n2 o B -3 3 x r n1 Hình I.6. Minh hoạ đồ thị BTQHTT hai mục tiêu Miền các phương án khả thi D (miền giới hạn bởi đoạn AB và các tia Ad, Bx) r r được biểu thị trên hình I.6. n1 (−1, −2) là hướng giảm của mục tiêu 1, còn n 2 (0, 2) là hướng tăng của mục tiêu 2. Lúc này A(0, 3) cũng như B(3, 0) là hai phương án tối ưu Pareto của bài toán trên. Dễ thấy tập hợp P tất cả các phương án tối ưu Pareto bao gồm các điểm nằm trên đoạn AB và Ad. 3.2. Một số phương pháp giải BTQHTT đa mục tiêu Định nghĩa 1 Giải bài toán tối ưu toàn cục đa mục tiêu là chọn ra từ tập hợp P các phương án tối ưu Pareto của bài toán một (hoặc một số) phương án tốt nhất (thoả mãn nhất) theo một nghĩa nào đó dựa trên cơ cấu ưu tiên của người ra quyết định. Trong ví dụ trên, tuỳ theo cơ cấu ưu tiên của người ra quyết định, chúng ta có thể chọn ra một hoặc một số điểm tối ưu Pareto nằm trên AB hoặc tia Ad làm phương án tối ưu của bài toán. Cách 1: Bằng một phương pháp tối ưu toán học thích hợp tìm ra tập hợp P tất cả các phương án tối ưu Pareto. Người ra quyết định sẽ đề ra cơ cấu ưu tiên của mình đối với tập P nhằm tìm ra phương án tối ưu Pareto thoả mãn nhất cho bài toán đa mục tiêu ban đầu. Cách 2: Việc tìm tập hợp P trong trường hợp các bài toán nhiều biến là khá khó và mất nhiều thời gian. Vì vậy, so với cách 1, cách 2 sẽ tiến hành theo trình tự ngược lại. Trước hết người ra quyết định sẽ đề ra cơ cấu ưu tiên của mình. Dựa vào cơ cấu ưu tiên đó, các mục tiêu sẽ được tổ hợp vào một mục tiêu duy nhất, tiêu biểu cho hàm tổng tiện ích của bài toán. Bài toán tối ưu với hàm mục tiêu tổ hợp này sẽ được giải bằng một phương pháp tối ưu toán học thích hợp, để tìm ra một (hoặc một số) phương án tối ưu Pareto. Lúc này, người ra quyết định sẽ chọn ra trong số các phương án tối ưu Pareto đó một phương án tốt nhất. Chúng ta sẽ tiếp tục phân tích cách thứ 2. Rõ ràng, người ra quyết định không thể đề ra cơ cấu ưu tiên của mình một cách chính xác ngay từ đầu. Trong quá trình giải bài toán, trong mỗi bước lặp, sau khi xem xét lại cơ cấu ưu tiên đã đề ra, cũng như phương án trung gian vừa tìm được, người ra quyết định có thể dựa vào các thông tin đó để thay đổi lại cơ cấu ưu tiên của mình. Sau đó, quá trình giải lại được tiếp tục, cho tới khi một phương án tối ưu cuối cùng được đưa ra. Định nghĩa 2 Phương pháp giải bài toán tối ưu đa mục tiêu dựa trên sự trợ giúp của hệ máy tính, nhằm giúp người ra quyết định từng bước thay đổi các quyết định trung gian một cách thích hợp để đi tới một phương án tối ưu Pareto thoả mãn nhất, được gọi là phương pháp tương tác người − máy tính. Phương pháp tương tác người − máy tính giải bài toán tối ưu đa mục tiêu có các yếu tố cấu thành sau: − Cơ cấu ưu tiên của người ra quyết định và hàm tổ hợp tương ứng. − Kiểu tương tác người − máy tính: cho biết các thông tin nào máy tính phải đưa ra lại trong các bước lặp trung gian, và cách thay đổi các thông số của cơ cấu ưu tiên từ phía người ra quyết định. − Kĩ thuật tối ưu toán học được xây dựng dựa trên lí thuyết tối ưu hoá nhằm tìm ra các phương án tối ưu Pareto cho các bài toán cần giải trong các bước lặp trung gian. Cho tới thời điểm hiện nay, hàng chục phương pháp giải BTQHTT đa mục tiêu đã được đề cập tới trong các tạp chí chuyên ngành, mà đa số chúng đều có những ứng dụng rất thành công trong nhiều lĩnh vực, như: phương pháp tham số, phương pháp nón pháp tuyến, phương pháp véc tơ cực đại, phương pháp trọng số tương tác của Chebysev, phương pháp thoả dụng mờ tương tác của Nguyễn Hải Thanh. 3.3. Phương pháp thoả dụng mờ tương tác giải BTQHTT đa mục tiêu Thuật giải a. Bước khởi tạo − Nhập số liệu cho các hàm mục tiêu tuyến tính zi (i = 1, 2,..., p) và m điều kiện ràng buộc. − Giải BTQHTT cho từng mục tiêu zi (i = 1, 2,..., p) với m ràng buộc ban đầu, thu được các phương án tối ưu X1, X2,..., Xp (nếu với một mục tiêu nào đó bài toán không cho phương án tối ưu thì cần xem xét để chỉnh sửa lại các điều kiện ràng buộc ban đầu). − Tính giá trị hàm mục tiêu tại p phương án X1, X2,..., Xp. Lập bảng pay−off. Xác định giá trị cận trên z iB và giá trị cận dưới ziw của mục tiêu zi (i=1, 2,..., p). − Xác định các hàm thoả dụng mờ µ1(z1), µ2(z2),..., µp(zp) cho từng mục tiêu dựa vào thông tin từ bảng pay−off theo công thức: zi − ziw µi (zi ) = , i = 1, 2,..., p. ziB − ziw − Đặt k: = 1. b. Các bước lặp (xét bước lặp thứ k) Bước 1: Xây dựng hàm mục tiêu tổ hợp từ các hàm thoả dụng trên: w1µ1(z1) + w 2µ2(z2) +... + w pµp(zp) → Max Trong đó: w1, w2,..., wp là các trọng số phản ánh tầm quan trọng của từng hàm thoả dụng trong thành phần hàm tổ hợp, với w1 + w 2 +... + w p = 1 và 0 ≤ w 1, w 2,..., w p ≤ 1. Bước 2: − Giải BTQHTT với hàm mục tiêu tổ hợp và m ràng buộc ban đầu để tìm được phương án tối ưu của bước lặp thứ k là X(k) và giá trị của các hàm mục tiêu zi cũng như của các hàm thoả dụng µi(zi) (với i =1, 2,..., p). − Nếu người ra quyết định cảm thấy chưa thoả mãn với các giá trị đạt được của các hàm mục tiêu cũng như của các hàm thoả dụng thì phương án thu được X(k) chưa phải là phương án tối ưu thoả mãn nhất. Đặt k:= k + 1, quay về bước 1. − Nếu người ra quyết định đã cảm thấy thoả mãn thì phương án thu được là X(k). Chuyển sang bước 3. Bước 3: Kết thúc. Ví dụ: Giải BTQHTT hai mục tiêu. z1 = 8x1+ 6x2 → Max z2 = x1 + 3x2 → Max với các ràng buộc: 4x1 + 3x2 ≤ 60 (D) 2x1 + 4x2 ≤ 48 x1 , x 2 ≥ 0 a. Bước khởi tạo − Giải BTQHTT cho từng mục tiêu trong ví dụ trên ta có hai bài toán: Max z1 = 8x1 + 6x2 → Max với điều kiện ràng buộc (D) cho phương án tối ưu X1(12, 6) và Max z1 = 132; z2 = x1 + 3x2 → Max cho phương án tối ưu X2(0, 12) và Max z2 = 36. Như vậy miền phương án tối ưu Pareto chính là mọi phương án thuộc AB (xem r r hình I.1), với A(0, 12) và B(12, 6). n1 (8, 6) là hướng tăng của mục tiêu 1, còn n 2 (1, 3) là hướng tăng của mục tiêu 2. Do đó, khi chọn phương án tối ưu Pareto dịch dần từ B về A thì z1 giảm, z2 tăng. Cần tìm phương án tối ưu Pareto "thoả mãn nhất" thuộc AB bằng cách “thương lượng” giữa z1 và z2. − Lập bảng pay−off cho các mục tiêu Phương án Xi z1 z2 X1(12, 6) 132 30 2 X (0, 12) 72 36 Dựa trên thông tin của bảng pay−off, ta có z1W = 72, z1B = 132; còn z 2W = 30, z B2 = 36. Do đó, đoạn biến thiên cần xét cho z1 là [72, 132] và cho z2 là [30, 36]. Từ đó chúng ta có thể thiết lập các hàm thoả dụng mờ ứng với hai mục tiêu đã cho như sau: z1 − z1W z − 72 z 72 z1 µ1 ( z1 ) = = 1 = 1 − = − 1,2 z1 − z1 B W 132 − 72 60 60 60 Hàm thoả dụng mờ trên đây phụ thuộc vào z1, nên phụ thuộc vào (x1, x2). Khi có một phương án khả thi (x1, x2) ta tính được độ thoả dụng µ1 ( z1 ) đối với mục tiêu z1. Tương tự đối với z2 ta có hàm thoả dụng mờ: z 2 − z W2 z − 30 z 2 µ2 (z2 ) = B W = 2 = − 5. z2 − z2 36 − 30 6 Lập hàm thoả dụng tổ hợp u = w1 µ1 (z1 ) + w2 µ 2 (z 2 ) , trong đó w1, w2 là các trọng
DMCA.com Protection Status Copyright by webtailieu.net