Mô hình toán học

Một phần của tài liệu Ứng Dụng Phương Pháp Tối Ưu Giải Bài Toán Hình Học Phổ Thông. (Trang 53)

Bài toán 2.17. Bài toán người bán hàng (tiếng Anh: travelling salesman problem - TSP). Cho trước một danh sách các thành phố và khoảng cách giữa chúng, tìm chu trình ngắn nhất thăm mỗi thành phố đúng một lần.

Bài toán 2.18. Thị trấn Konisberg được chia thành 4 phần bởi các nhánh của dòng sông Pregel. Bốn phần này được kết nối bởi 7 cây cầu. Có thể đi qua 7 cây cầu mà không có cây cầu nào đi quá một lần?

tròn, K1={(x, y)∈R2|(x−1)2+ (y−4)2 64}. Khu K2 có dạng hình tròn, K2={(x, y)∈R2|(x−9)2+ (y−5)2 61}. Khu K3 có dạng hình chữ nhật, K3={(x, y)∈R2 |66x68,−26y62}. Khu K4 có dạng hình vuông, K4 ={(x, y)∈R2|26x64,−36y6−1}.

Bài toán đặt ra là cần xác định vị trí để xây dựng một trạm biến áp tổng để cung cấp điện cho 4 khu chung cư này và vị trí (xi, yi)∈Ki để đặt trạm biến áp phân phối của mỗi khu chung cư Ki, i = 1,4, sao cho tổng số dây dẫn điện nối từ trạm biến áp tổng đến trạm biến áp phân phối của bốn khu chung cư này là nhỏ nhất.

Ta có thể hình dung các bài toán trên được phát biểu dưới dạng tổng quát như sau:

• Bài toán tìm đường đi ngắn nhất là bài toán tìm một đường đi giữa hai đỉnh sao cho tổng các trọng số của các cạnh tạo ra đường đi đó nhỏ nhất.

• Hoặc có thể phát biểu bài toán dưới dạng như sau: Cho trước 1 đồ thị vô hướng G, và hàm trọng số có giá trị thực f : E → R , đường đi ngắn nhất từ đỉnh V đến đỉnh V′ là đường đi :

Sao cho X p∈P f(p) là nhỏ nhất. 2.3.2. Thuật toán

Có nhiều thuật toán để giải bài toán trên. Ở đây chúng chúng tôi sẽ sử dụng thuật toán Dijkstra, đây là thuật toán tìm đường đi ngắn nhất nguồn đơn có trọng số dương. Tức là mỗi cạnh ta sẽ có trọng số, chúng ta có thể hiểu trọng số tức là chi phí, chiều dài, thời gian....

Ví dụ: Chúng ta dùng các đỉnh của đồ thị để mô hình các thành phố và các cạnh để mô hình các đường nối giữa chúng. Khi đó trọng số các cạnh có thể xem như độ dài của các con đường (và do đó các trọng số là không âm). Chúng ta cần vận chuyển từ thành phố s đến thành phố t. Thuật toán Dijkstra sẽ giúp chỉ ra đường đi ngắn nhất chúng ta có thể đi.

Thuật toán khởi đầu với giả thiết cho đồ thị G= (V, E). Ta chọn một đỉnh s, gọi đó là điểm nguồn. Kết thúc thuật toán ta sẽ tìm được đường đi ngắn nhất từ s đến các đỉnh còn lại trong đồ thị.

Ban đầu, ta coi khoảng cách từ đỉnh s đến chính nó là 0 (hiển nhiên) và khoảng cách từ s đến các đỉnh kia là ∞. Một mặt, việc để độ dài quãng đường đến các đỉnh kia là ∞ giúp chúng ta đánh dấu các đỉnh đó là chưa thăm. Mặt khác, sau này khi thuật toán tìm thâý đường khác ngắn hơn, ta sẽ thay thế giá trị của chúng.

Thuật toán này dựa trên một nhận xét là, giả sử đường P1 là đường ngắn nhất từ s đến t và phải đi qua đỉnh v. Điều này có nghĩa là, đường P1 phải bao gồm đường ngắn nhất từ s đến v. Nói một cách khác, đường từ s đến v trên đường P1 phải là

đường ngắn nhất từ s đến v vì nếu không phải như vậy, ta có thể tìm được đường khác ngắn hơn từ s đến v, rồi từ đó đi cùng một con đường từ v đến t. Đường mới này gọi là P2 từ s đến t và sẽ ngắn hơn P1, trái với giả thiết ban đầu.

Giả sử đường ngắn nhất từ s đếnt đi qua v, thì đường s đến v cũng là ngắn nhất. Từ nhận xét trên, ta thấy là, để để tính đường ngắn nhất từ s tới một đỉnh ở xa, ta phải tính đường ngắn nhất từs tới một đỉnh ở gần hơn trước.

Trong thuật toán, ta có một vòng lặp, mỗi lần ta chọn ra một đỉnh, là đỉnh ở gần s nhất mà ta đã biết. Từ đỉnh đó ta sẽ tính quãng đường từ s tới các đỉnh kề với đỉnh đang xét. Cụ thể như sau:

• Lần đầu tiên, ta chọn đỉnh s vì đó là đỉnh ở gần s nhất mà ta đã biết (khoảng cách từ một đỉnh đến chính nó bằng 0). Ta tính khoảng cách từ s đến các đỉnh kề nó bằng chính độ dài các cạnh nối từ s đến các đỉnh đó. Ta cập nhật quãng đường từ s đến các đỉnh đó, đồng thời đánh dấu đỉnh s là đã thăm.

• Các lần tiếp theo, mỗi lần ta chọn ra đỉnh v mà ta đã biết chắc chắn ở gần với s nhất. Từ đỉnh v hiện tại ta tính đường ngắn nhất từ s tới các đỉnh t1, t2, t3. . . kề với v theo cách sau: Ta gọi quãng đường ngắn nhất đã biết s → t1 là P1. Ta xét quãng đường P2 bằng tổng quãng đường ngắn nhất của s→v và độ dài cạnh

(v, t1).

• Nếu tổng P2 này nhỏ hơn quãng đường P1 hiện tại, ta cập nhật đường ngắn nhất từ s→v bằng P2. Lúc này ta đánh dấu đỉnh v là đã thăm.

Thuật toán dừng lại khi tất cả các đỉnh đều đã được đánh dấu là đã thăm. Để phân tích thuật toán một cách dễ hiểu, ta cùng xét ví dụ sau:

2.3.3. Ví dụ cho thuật toán

Bài toán 2.20. Cho đồ thị dưới đây, tìm đường đi ngắn nhất từ A đến các đỉnh còn lại

Hình 2.13

Sau đây ta sẽ minh họa các bước thực hiện qua bảng sau:

Bước A B C D E 0 0 ∞ ∞ ∞ ∞ 1 . 10 (A) ∞ ∞ 5 (A) 2 . 8(E) 14 (E) 7 (E) . 3 . 8 (E) 13 (D) . . 4 . . 9 (B) . . 5 . . . 13 (C) .

nào cả nên giá trị tại A là 0 và các đỉnh còn lại sẽ là vô cùng.

• Bước 1: Xuất phát, ta thấy đỉnh A chỉ có đường đii đến 2 đỉnh B và E. Xét về trọng số, (A, B) = 10, còn (A, E) = 5. Ta viết 2 trọng số này vào bảng, các đỉnh còn lại không có đường đi đến thì vẫn giữ nguyên giá trị. Đánh dấu đỉnh A đã thăm.

Chú ý: từ bước này ta sẽ chọn ra đỉnh tiếp theo để thực hiện bước 2, đỉnh tiếp theo là đỉnh có giá trị trọng số nhỏ nhất ở từng bước, ví dụ ở đây ta phải xét đỉnh E (vì E chỉ có giá trị 5 (A) ) (ký hiệu 5 (A) tức là đỉnh A đến E có giá trị trọng số là 5).

• Bước 2: Xét đỉnhE, E có 3 đường đi đến các đỉnh B, C, Dlần lượt có giá trị trọng số là 3, 9, 7. Đem cộng với 5 (A). So sánh ba giá trị này, chọn giá trị nhỏ nhất. Ở đây là giá trị 7 (E), tức bước tiếp theo ta xét từ đỉnh D. Đánh dấu đỉnh E đã thăm.

• Bước 3: Từ đỉnh D, thực hiện tương tự bước 2 ta được D→C = 13(D), D→A= 7(D). Nhưng ở A giá trị ban đầu là 0 rồi, ta không cần cập nhật lại. Do vậy bước này chỉ có duy nhất nhất một giá trị mới sinh ra, nhưng ta không chọn giá trị này vì tại bước 2, đỉnh B có 8 (E) < 13 (D). Nên ta chọn đỉnh B để thực hiện tiếp bước 4. Chưa đánh dấu đã thăm đỉnh D.

• Bước 4: Tương tự, ta được B →C = 9(B). Đánh dấu đã thăm đỉnh B.

• Bước 5: Cuối cùng từ C đếnD chỉ có một đường duy nhất C →D= 13(C). Ta kết thúc thuật toán vì tất cả các đỉnh đã được thăm.

Kết luận: Như vậy ta tìm được con đường ngắn nhất đi từ A đến tất cả các đỉnh còn lại là: A→E →D→B →C.

Ngoài ra, nhờ vào thuật toán Dijkstra ta có thể tính được khoảng cách ngắn nhất từ 2 đỉnh bất kỳ trong đồ thị. Trong trường hợp số đỉnh lớn dẫn đến việc thực hiện bằng tay sẽ trở nên khó khăn. Cho nên việc lập trình lại thuật toán và sử dụng phần mềm để giải là nhanh chóng và thuận tiện hơn.

Sau đây ta sẽ dùng phần mềm Matlab để thực hiện lại thuật toán tìm đường đi ngắn nhất giữa hai đỉnh bất kỳ.

Ta quay lại với Bài toán 3.4 và chuyển sang ngôn ngữ Matlab: Từ đồ thị có hướng trên hình vẽ ta nhập ma trận kề

G= [0 0 0 7 0; 10 0 0 0 3; 0 1 0 6 9; 0 0 4 0 2; 5 2 0 0 0];

Nhập đỉnh xuất phát: 1 Nhập đỉnh kết thúc: 3 Hình minh họa (Hình 3.2)

Vậy đường đi ngắn nhất từ A tới E là qua B rồi qua C. Tổng chi phí bằng 9. Việc sử dụng phần mềm Matlab để tính toán sẽ rất thuận tiện khi chúng ta phải giải bài toán với số đỉnh nhập vào là lớn.

Hình 2.14

2.4. Giải bài toán quy hoạch tuyến tính hai biến bằng phương pháphình học hình học

2.4.1. Mô hình toán học

Xét bài toán quy hoạch tuyến tính hai biến

min{f(x) = hc, xi|x∈D}, trong đó c= (c1, c2)T ∈R2

\ {0} vàD ⊂R2 là tập lồi đa diện.

Như đã biết, qua mỗi điểm x = (x1, x2)T ∈ R2 chỉ có duy nhất một đường mức L(α, f) = {x ∈ R2

| hc, xi = α} của hàm f(x) = hc, xi với mức α = hc, xi. Do f(x) là hàm tuyến tính nên gradient ∇f(x) =c tại mọi x∈ R2 và c là vector pháp tuyến của mọi đường mức.

Bài toán có thể được phát biểu theo ngôn ngữ hình học như sau: Trong số các đường mức cắt tập D, hãy tìm đường mức có giá trị mức nhỏ nhất.

Thuật toán hình học giải bài toán trên dựa trên hai sự kiện: i) Các đường mức của hàm tuyến tính song song với nhau;

ii) Giá trị hàm f(x) =hc, xi tăng theo hướng vector gradient ∇f(x) =c và giảm theo hướng ngược vector c.

2.4.2. Thuật toánThuật toán 3.2: Thuật toán 3.2:

Bước 1. Vẽ tập chấp nhận được D, vector c và đường mức L(0, f) ={x∈R2

| hc, xi= 0}

đi qua điểm gốc 0 và vuông góc với c.

Bước 2. Lấy một điểm bất kì x∈D. Vẽ đường thẳng L đi qua x và song song các đường mức L(α, f). (Đường thẳng L là đường mức {x∈R2

| hc, xi=hc, xi}).

Bước 3. Dịch chuyển song song đường mức L theo hướng ngược với hướng vector

c đến khi việc dịch chuyển tiếp theo làm cho đường mức không còn cắt D nữa thì dừng. Các điểm của D nằm trên đường mức cuối cùng này là các nghiệm tối ưu của bài toán, còn giá trị mức này chính là giá trị tối ưu của bài toán.

Nhận xét. Trong trường hợp bài toán quy hoạch tuyến tính hai biến có dạng

max{f(x) =hc, xi|x∈D}, với D ⊂ R2 là tập lồi đa diện khác rỗng và c ∈ R2

\ {0} thì ta sẽ sử dụng các bước giống như thuật toán trên nhưng thayBước 3 bởi Bước 3’ như sau:

Bước 3’: Dịch chuyển song song đường mức L theo hướng vector c đến khi việc dịch chuyển tiếp theo làm cho đường mức không còn cắt D nữa thì dừng. Các điểm củaD nằm trên đường mức cuối cùng này là các nghiệm tối ưu của bài toán, còn giá trị mức này chính là giá trị tối ưu của bài toán.

Để hiểu rõ thuật toán trên ta đến với các bài toán sau:

2.4.3. Ví dụ cho thuật toán

Bài toán 2.21. Xét bài toán quy hoạch tuyến tính

minf(x) =−2x1+x2

với điều kiện                        −x1+ 2x2 64 x1+x2 65 x1 64 x1, x2 >0.

Lời Giải:Tập chấp nhận được của bài toán này là đa diện D=conv{v1, ..., v4} với v1 = (0,0)T, v2 = (0,2), v3 = (2,3)T, v4 = (4,0)T; hướng của vector c= (−2; 1)T đường mức L0 và L (đi qua một điểm x∈D) của hàm mục tiêu được minh họa ở hình dưới. Theo Thuật toán 3.2, dịch chuyển song song đường mứcLtheo hướng ngược vector c ta thấy đường mức cuối cùng của hàm f mà còn cắt tập D là đường mức đi qua đỉnh (4,0)T. Vậy bài toán này có nghiệm tối ưu duy nhất là đỉnh (4,0)T và giá trị tối ưu fmin=−8. (Hình a).

Nếu thay hàm mục tiêu của bài toán này bởi f′

(x) =x1−2x2 thì ta nhận được tập nghiệm tối ưu là cả cạnh {(0,2)T,(2,3)T}. Trường hợp này bài toán có vô số nghiệm. Ta có thể lấy một nghiệm tối ưu đại diện là đỉnh (0,2)T. (Hình b)

Hình 2.15

Phương pháp này rất hữu hiệu trong việc giải các bài toán quy hoạch tuyến tính hai biến, và thực tế là nhiều bài toán sản xuất với nhiều ràng buộc có thể giải được thông qua phương pháp này.

Trong chương trình toán phổ thông cũng đã trình bày phương pháp này để giải một số bài toán đó, nhưng vì tính sư phạm nên cơ sở lí thuyết của phương pháp chưa được trình bày một cách kĩ lưỡng. Cho nên qua đây chúng chúng tôi đã trình bày lại một cách tổng quát và đầy đủ về việc giải bài toán quy hoạch tuyến tính bằng phương pháp hình học.

Ngoài ra đối với bài toán quy hoạch tuyến tính hai biến còn có thể dễ dàng giải được thông qua hàm linprog.m trong Matlab như sau:

Ta nhập các input như sau: » f = [−2 1]; » A= [−1 2; 1 1; 1 0]; » b= [4 5 4]; » lb= [0 0]; » ub= [4 inf]; » options=optimset(′ display′ ,′ of f′ );

» [x f val] =linprog (f, A, b,[],[], lb, ub,[], options)

Ta được kết quả như hình 3.4 dưới đây.

Ta được output làx= (4,0)và f val=−8Từ đó kết luận được nghiệm tối ưu cần tìm là đỉnh (4,0) và giá trị tối ưu là fmin =−8.

Hình 2.16

2.5. Bài toán cắt vật liệu tiết kiệm nhất2.5.1. Mô hình toán học 2.5.1. Mô hình toán học

Bài toán quy hoạch nguyên (Integer Programming - IP) được phát biểu như sau

minf(x) =f(x1, x2, ..., xn)

v.đ.k x= (x1, ..., xn)∈D,

trong đóD ⊂Rn là tập các vectorx= (x1, x2, ..., xn)T mà một số hoặc tất cả các thành phần của x chỉ nhận giá trị nguyên.

Thông thường, tập D ⊂ Rn được xác định bởi một hệ các phương trình và bất phương trình với điều kiện bổ sung về tính nguyên của các biến số:

gi(x) = 0, i= 1, m1 gi(x)60, i=m1+ 1, ..., m

Nếu n1=n (tất cả các biến đều nguyên) thì bài toán quy hoạch nguyên trở thành bài toán quy hoạch nguyên hoàn toàn (Pure Integer Programming). Nếu n1 < n (chỉ có một số biến nguyên) thì ta gọi bài toán làquy hoạch nguyên bộ phận (Mixd Integer Programming). Nếu các hàm f(x), gi(x) là tuyến tính thì đó là bài toán quy hoạch tuyến tính nguyên. Thuật ngữ “quy hoạch nguyên” thực tế chỉ dành cho lĩnh vực nghiên cứu các lớp bài toán quy hoạch tuyến tính nguyên.

Các bài toán điển hình trong quy hoạch nguyên là các bài toán dạng chọn quyết định “có” hoặc “không” (yes or no decision). Chẳng hạn: Có quyết định học Thạc sĩ Toán không? Có mua căn nhà này không? Có lấy vợ hay không?... Vì các biến quy định chỉ nhận hai có trị 0 (không) hoặc 1 (có) nên bài toán có tên làQuy hoạch nguyên nhị phân (Binary Integer Programming - BIP).

Bất kì bài toán quy hoạch nguyên nào với các biến nguyên bị chặn đều có thể quy về bài toán với các biến chỉ nhận giá trị 0 - 1. Chẳng hạn, nếu biến u chỉ nhận giá trị thuộc tập {1,2, ..., k} thì đặt

u=u1+u2+...+uk,

với ui ∈ {0,1}, i = 1,2, ..., k. Điều này cho thấy quy hoạch nguyên 0 - 1 giữ vai trò quan trọng trong quy hoạch nguyên.

2.5.2. Thuật toán

Đầu tiên ta nêu lại một số khái niệm cơ bản sau:

⋄ Một họ P chưa hữu hạn các tập con của D, P :={Di ⊆D|i∈I}, trong đó I là tập hữu hạn các chỉ số, được gọi là một phân hoạch của D nếu

D=S

⋄ Bài toán

max f(x) v.đ.k x∈Di, (IPi)

với Di ⊂ D được gọi là bài toán con của bài toán quy hoạch nguyên IP (cùng hàm mục tiêu nhưng tập chấp nhận được bé hơn).

⋄ Số thực α∈R được gọi là một cận dưới của bài toán (IP) nếu α 6fopt.

Nếu tìm được một phương án chấp nhận đượcx∈D sao cho f(x)6fopt, tức f(x)

là một cận dưới của bài toán (IP). Khi đó x được gọi là một kỷ lục và f(x) còn

Một phần của tài liệu Ứng Dụng Phương Pháp Tối Ưu Giải Bài Toán Hình Học Phổ Thông. (Trang 53)

Tải bản đầy đủ (PDF)

(88 trang)