QUY HOẠCH RỜI RẠC -...

134
VIN KHOA HC VÀ CÔNG NGHVIT NAM VIN TOÁN HC PGS.TS. BÙI THTÂM QUY HOCH RI RC BÀI GING CAO HC HÀ NI 10-2008

Transcript of QUY HOẠCH RỜI RẠC -...

Page 1: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

VIỆN KHOA HỌC VÀ CÔNG NGHỆ VIỆT NAM

VIỆN TOÁN HỌC

PGS.TS. BÙI THẾ TÂM

QUY HOẠCH RỜI RẠC

BÀI GIẢNG CAO HỌC

HÀ NỘI 10-2008

Page 2: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm i Quy hoạch rời rạc

LỜI NÓI ĐẦU

Tài liệu này là các Bài giảng của môn Quy hoạch rời rạc thuộc Trung tâm đào tạo sau đại học, Viện Toán học, Viện Khoa học và Công nghệ Việt nam trong các năm 2006, 2007 và 2008. Đây là tài liệu đầu tiên được viết bằng tiếng Việt trình bày một cách hệ thống về Quy hoạch rời rạc với cơ sở lý thuyết chặt chẽ, chứng minh tính hữu hạn của các thuật toán Gomory, hơn nữa còn đưa ra chương trình nguồn viết bằng C cho các thuật toán.

Kiến thức chuẩn bị để tiếp thu giáo trình này là lý thuyết căn bản về quy hoạch tuyến tính và phương pháp đơn hình [9], lập trình bằng ngôn ngữ C++ [11], bảng tính điện tử Microsoft Excel [12].

Tài liệu gồm bảy chương. Chương 1 trình bày các bài toán phát sinh trong thực tiễn dẫn đến các bài toán quy hoạch rời rạc, phát biểu bài toán quy hoạch rời rạc tổng quát. Các bài tập ở cuối chương 1 có thể dùng lệnh Solver trong Microsoft Excel để giải, hướng dẫn lệnh này cho trong tài liệu [12] hoặc[13].

Trong Chương 2 nêu những khái niệm cơ bản về quy hoạch tuyến tính, phương pháp đơn hình bình thường, phương pháp đơn hình đối ngẫu từ vựng và chương trình máy tính viết bằng C++, và khái niệm về bài toán quy hoạch tuyến tính nguyên.

Chương 3 trình bày tư tưởng phương pháp cắt, thuật toán Gomory thứ nhất và chứng minh sự hội tụ của nó (tài liệu gốc trong [1], [2]), chương trình máy tính của thuật toán Gomory thứ nhất.

Chương 4 xét hai thuật toán: thuật toán Gomory thứ hai dùng để giải bài toán quy hoạch tuyến tính nguyên bộ phận [3], thuật toán Dalton - Llewellyn dùng để giải bài toán quy hoạch tuyến tính với các biến nhận giá trị rời rạc [4], chương trình máy tính của hai thuật toán này.

Chương 5 trình bày thuật toán Gomory thứ ba nhằm xây dựng các lát cắt đảm bảo tất cả các Bảng đơn hình ở mỗi bước đều có tất cả các phần tử là nguyên [5], [6], chương trình máy tính của thuật toán Gomory thứ ba.

Chương 6 trình bày tư tưởng của phương pháp nhánh cận, phương pháp Land A.H và Doig A.G giải bài toán qui hoạch nguyên [7], phương pháp Little J.D, Murty K.G, Sweeney D.W và Karen C giải bài toán người du lịch [8].

Các tài liệu gốc [1]-[8] được A.A. Korbut, Iu. Iu. Phinkenstein trình bày lại trong cuốn sách [10]. Năm chương trình bằng ngôn ngữ C trong tài liệu này về Phương pháp đơn ngẫu từ vựng, ba thuật toán Gomory, thuật toán Dalton đều do chính tác giả lập. Bạn đọc quan tâm tới lập trình bằng Pascal cho các bài toán tối ưu của Quy hoạch tuyến tính, Quy hoạch phi tuyến và Quy hoạch rời rạc có thể tham khảo tài liệu [14].

Các trường Đại học, các cơ sở đào tạo có nhu cầu giảng dạy môn này, hoặc hướng dẫn giảng viên để giảng dạy môn này, hoặc bạn đọc muốn góp ý về giáo trình này xin vui lòng liên hệ với tác giả theo địa chỉ: Bùi Thế Tâm, Viện Toán học, Viện Khoa học và Công nghệ Việt Nam, 18 Hoàng Quốc Việt, Cầu giấy, Hà nội ; địa chỉ email: [email protected]

Hà Nội, ngày 4 tháng10 năm 2008

Page 3: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm ii Quy hoạch rời rạc

TÀI LIỆU THAM KHẢO

1. Gomory R.E. An algorithm for integer solutions to linear programs. Recent Advances Math. Program. New York - San Francisco - Toronto - London, McGraw-Hill Book Co., Inc., 1963, 269-302.

2. Gomory R.E. Outline of an algorithm for integer solution to linear programs. Bull. Amer. Math. Soc., 1958, 64, N5, 275-278.

3. Gomory R.E. An algorithm for the mixed integer problem. Rand. Corp., P-1885, Santa Monica, California, February 22, 1960.

4. Dalton R.E, Llewellyn R.W. An extension of the Gomory mixed-integer algorithm to mixed-discrete variable. Manag. Sci., 1966, 12, N7, 562-575.

5. Gomory R.E. An all-integer integer programming algorithm. IBM Research Center, 1960, January, Research Report RC-189.

6. Gomory R.E. An all-integer integer programming algorithm. In "Industrial scheduling", Englewood Cliffs, New Jersey, Prentice Hall, 1963, ch. 13.

7. Land A.H, Doig A.G. An automatic method of solving discrete programming problems. Econometrica, 1960, 28, N3, 497-520.

8. Little J.D.C,Murty K.G, Sweeney D.W, Karel C. An algorithm for the traveling salesman problem. Operat. Res., 1963, 11, N6, 972-989.

9. Bùi Thế Tâm, Trần Vũ Thiệu. Các phương pháp tối ưu hóa. NXB GTVT, 1998, 408 trang

10. A.A. Korbut, Iu. Iu. Phinkenstein. Quy hoạch rời rạc (tiếng Nga). NXB Khoa học, Mascva, 1969, 368 trang

11. Bùi Thế Tâm. Ngôn ngữ C và lập trình hướng đối tượng. NXB GTVT, 2006, 240 trang.

12. Bùi Thế Tâm. Giáo trình Windows 2000, Word 2000, Excel 2000, Powerpoint 2000. NXB GTVT, 2002.

13. Bùi Thế Tâm. Giải các bài toán tối ưu và thống kê trên Microsoft Exel. Công bố trên http://ebook.edu.net.vn, phần Công nghệ thông tin, 2007.

14. Bùi Thế Tâm. Turbo Pascal: lý thuyết cơ bản, bài tập, những chương trình mẫu trong khoa học kỹ thuật và kinh tế. NXB GTVT, 1993, 460 trang.

VÀI NÉT VỀ TÁC GIẢ B.T. Tâm sinh năm 1948 tại Hiệp Hoà, Bắc Giang; hiện làm việc tại Phòng Tối ưu

và Điều khiển thuộc Viện Toán học, Viện Khoa học và Công nghệ Việt nam; bảo vệ Tiến sỹ tháng 5/1978 tại Viện Hàn lâm Khoa học Liên xô; nhận học hàm Phó giáo sư tháng 7/1996.

Page 4: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm iii Quy hoạch rời rạc

MỤC LỤC Chương 1. Bài toán quy hoạch rời rạc I.1 1. Định nghĩa bài toán I.1

2. Các bài toán thực tế dẫn đến bài toán quy hoạch rời rạc I.2

Chương 2. Những khái niệm mở đầu II.1 1. Những khái niệm cơ bản về quy hoạch tuyến tính II.1

2. So sánh theo nghĩa từ vựng II.3

3. Bảng đơn hình, các phương án và giả phương án II.4

4. Phương pháp đơn hình II.5

5. Phương pháp đơn hình đối ngẫu từ vựng II.6

6. Bài toán quy hoạch tuyến tính nguyên II.16

Chương 3. Thuật toán Gomory thứ nhất III.1 1. Tư tưởng phương pháp cắt III.1

2. Thuật toán Gomory thứ nhất III.5

3. Tính hữu hạn của thuật toán Gomory thứ nhất III.9

4. Giải ví dụ số III.11

5. Chương trình máy tính III.15

Bài tập III.23

Chương 4. Thuật toán Gomory thứ hai IV.1 1. Lược đồ logic của thuật toán IV.1

2. Thuật toán Gomory thứ hai IV.2

3. Thuật toán Dalton và Llewellyn IV.20

Bìa tập IV.33

Chương 5. Thuật toán Gomory thứ ba V.1 1. Ảnh hưởng sai số làm tròn và tư tưởng của thuật toán Gomory thứ ba V.1

2. Xây dựng lát cắt đúng nguyên, thuật toán Gomory thứ ba V.3

3. Chương trình máy tính V.13

Bài tập V.22

Chương 6. Thuật toán nhánh và cận VI.1 1. Tư tưởng của phương pháp nhánh và cận VI.1

2. Phương pháp Land và Doig giải bài toán quy hoạch nguyên VI.3

3. Phương pháp nhánh cận giải bài toán người du lịch VI.6

Bài tập VI.19

Page 5: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm I.1 Quy hoạch rời rạc

Chương 1

BÀI TOÁN QUY HOẠCH RỜI RẠC

1. ĐỊNH NGHĨA BÀI TOÁN QUY HOẠCH RỜI RẠC Trong các bài toán quy hoạch tuyến tính, các biến số có thể nhận những giá trị

thực không âm. Tuy nhiên, trong thực tiễn thường gặp các bài toán mà các biến số chỉ có thể nhận một số hữu hạn hay đếm được giá trị, thường là các giá trị nguyên. Chẳng hạn sẽ là vô nghĩa khi đưa ra câu trả lời: cần sản xuất nửa cái bàn hay cần thuê 2,7 cái ô tô để vận chuyển hàng hoá…Trong một số bài toán, chẳng hạn bài toán vận tải với các lượng hàng cung và cầu là các số nguyên, song nhiều bài toán khác thì không phải như vậy. Vì thế trong chương này sẽ đề cập đến nội dung và phương pháp giải các bài toán tối ưu trên lưới các điểm nguyên hay trên các tập rời rạc, gọi tắt là bài toán quy hoạch rời rạc hay bài toán quy hoạch nguyên.

Bài toán quy hoạch rời rạc có dạng sau: Tìm cực đại của hàm ( , )f x y phụ thuộc hai nhóm biến x và y với các ràng buộc

có dạng:

( , ) 0, 1,2,... ,ig x y i m x D≤ = ∈

trong đó, 1 2 1 2( , ,..., ), ( , ,..., ), 0, 0p qx x x x y y y y p q= = > ≥ , D là tập hữu hạn các véc tơ p - chiều, còn , if g là những hàm cho trước của n biến số ( n p q= + ).

Nếu , if g là các hàm tuyến tính và D là lưới các điểm nguyên, thì ta có bài toán quy hoạch nguyên tuyến tính, còn nếu D là tập các véc tơ p thành phần 0 hay 1 thì ta có bài toán quy hoạch nguyên 0 1− .

Nếu 0q = , nghĩa là chỉ có các biến rời rạc 1 2, ,..., px x x thì bài toán được gọi là bài toán quy hoạch nguyên hoàn toàn. Còn nếu 0q > thì bài toán được gọi là bài toán nguyên bộ phận.

Chú ý

Sở dĩ bài toán quy hoạch rời rạc còn được gọi là bài toán quy hoạch nguyên là vì bất kỳ bài toán với các biến số chỉ nhận một số hữu hạn giá trị cho trước, đều có thể quy về bài toán trong đó các biến chỉ nhận các giá trị nguyên. Ví dụ, giả sử biến x biểu thị quy mô công suất của nhà máy điện cần xây dựng chỉ có thể lấy một trong các giá trị cho trước 1 2, ,..., ka a a (các quy mô công suất tiêu chuẩn). Khi đó bằng cách đặt:

1 1 2 2 ... k kx a u a u a u= + + + ,

với { }1 2 ... 1, 0;1 , 1, 2...,k ju u u u j k+ + + = ∈ =

thì biến rời rạc x có thể được thay thế bởi một số biến ju chỉ nhận giá trị 0 hay 1, gọi tắt là biến 0 1− hay biến Boolean.

Page 6: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm I.2 Quy hoạch rời rạc

Tương tự, nếu { }0,1, 2,...,x k∈ thì ta có thể viết

{ }1 2 ... , 0;1 , 1,2...,k jx u u u u j k= + + + ∈ =

nghĩa là bất kỳ bài toán với các biến nguyên bị chặn tuỳ ý, đều có thể quy về bài toán với các biến 0 1− . Điều này cho thấy bài toán quy hoạch nguyên 0 1− giữ vai trò quan trọng trong quy hoạch rời rạc.

2. CÁC BÀI TOÁN THỰC TẾ DẪN TỚI QUY HOẠCH RỜI RẠC 2.1. Bài toán vận tải Có m kho hàng (điểm phát) chứa một loại hàng hoá, lượng hàng ở kho i là ia và n nơi tiêu thụ (điểm thu), nhu cầu ở nơi thu là jb , ijc là chi phí vận chuyển một đơn vị hàng từ điểm phát i đến điểm thu j . Xác định các lượng hàng vận chuyển ijx từ các điểm phát i tới các điểm thu j sao cho tổng chi phí là nhỏ nhất và nhu cầu các điểm thu được thoả mãn.

Dạng toán học của bài toán là:

ij ijij

ij1

ij1

ij

1 1

min

, 1,2,...,

, 1, 2,...,

0

.

n

ij

m

ji

m n

i ji j

c x

x a i m

x b j n

x

a b

=

=

= =

= =

= =

=

∑ ∑

Nếu các ia và jb là nguyên thì đa diện lồi xác định bởi các ràng buộc của bài toán có mọi đỉnh đều là nguyên. Do đó ta có thể dùng phương pháp đơn hình để giải bài toán quy hoạch tuyến tính này, lời giải cuối cùng nhận được sẽ là một phương án nguyên.

Ví dụ. Xét bài toán vận tải có 3 điểm phát và 4 điểm thu với ma trận chi phí như sau:

2 1 4 36 0 5 2 , (10, 25,15), (5,15, 20,10)1 4 8 2

ij i jc a b = = =

Đáp số: trị tối ưu hàm mục tiêu là 115, phương án vận chuyển tối ưu là: x[1,3]=10, x[2,2]=15, x[2,3]=10, x[3,1]=5, x[3,4]=10

2.2. Bài toán phân việc

Page 7: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm I.3 Quy hoạch rời rạc Có n đơn vị sản xuất cần sản xuất n loại sản phẩm, ijc là chi phí cho đơn vị i sản xuất sản phẩm j . Hãy phân công mỗi đơn vị sản xuất một sản phẩm để tổng chi phí là nhỏ nhất.

Dạng toán học của bài toán là:

{ }

n

ij ij1 j=1

ij1

ij1

ij

min

1, 1, 2,...,

1, 1,2,...,

0;1

n

i

n

j

m

i

c x

x i n

x j n

x

=

=

=

= =

= =

∑∑

Ví dụ có 4 đơn vị sản xuất 4 loại sản phẩm với ma trận chi phí sau:

100000 4000000 800000 550000

200000 3500000 750000 500000

400000 2000000 700000 400000

300000 5000000 600000 450000

Đáp số: trị tối ưu hàm mục tiêu là 3200000 đồng, phương án tối ưu là: x[1,1]=x[2,4]=x[3,2]=x[4,3]=1.

2.3. Bài toán cái túi Có một cái túi chứa được nhiều nhất một trọng lượng là b , có n đồ vật cần mang, đồ vật j nặng ja , giá trị của nó là jc . Bài toán đặt ra là cho những đồ vật nào vào túi để tổng giá trị của nó lớn nhất. Ký hiệu jx là số đồ vật j được đưa vào túi. Dạng toán học của bài toán là:

n

j jj=1

j1

j j

m ax

0,

n

jj

c x

a x b

x x Z=

≥ ∈

Ví dụ. Có một cái túi chứa được nhiều nhất là 62 kg, có 10 đồ vật cần mang

{ }

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

30 19 13 38 20 6 8 19 10 11 ax15 12 9 27 15 5 8 20 12 15 62

0,1 , 1, 2,...,10j

x x x x x x x x x x mx x x x x x x x x x

x j

+ + + + + + + + + →+ + + + + + + + + ≤

∈ =

Đáp số: trị tối ưu hàm mục tiêu là 95, phương án tối ưu là (1,1,0,1,0,0,1,0,0,0)

2.4. Bài toán xếp hàng lên tầu

Page 8: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm I.4 Quy hoạch rời rạc Một tầu chở hàng có trọng tải T và thể tích K , tầu chở n loại hàng, hàng loại j có số lượng là js , có trọng lượng là ja , thể tích jb và giá trị sử dụng là jc . Bài toán đặt ra là cần xác định số lượng hàng loại j cần xếp lên tàu jx để tổng giá trị hàng hoá trên tầu là lớn nhất.

Dạng toán học của bài toán là:

{ }

n

j jj=1

j1

j1

j

m ax

0,1,2,..., , 1, 2,...,

n

jj

n

jj

j

c x

a x T

b x K

x s j n

=

=

∈ =

Ở đây, không giảm tính tổng quát của bài toán ta có thể giả sử các hệ số , , , ,j j jT K a b c (với mọi j ) đều là các số dương.

2.5. Bài toán xếp hàng vào các công ten nơ rỗng cùng loại Có n loại hàng hoá cần được xếp lên các công ten nơ rỗng như nhau với tải trọng của mỗi công ten nơ là T và dung lượng là K . Hàng hoá loại j có trọng lượng ja , khối lượng jb và số lượng cần vận chuyển là js ( 1, 2,...,j n= ). Hãy tìm cách xếp tất cả số hàng hoá này lên công ten nơ sao cho dùng ít công ten nơ nhất?

Giả sử ta đã biết được m là số công ten nơ tối đa cần thiết để chở hết số hàng hoá trên. Chẳng hạn, số m có thể tìm theo cách: xếp dần các đồ vật lên công ten nơ theo thứ tự tuỳ ý, cái nọ tiếp cái kia, cho đến khi trọng lượng hay dung tích của công ten nơ đã dùng hết. Tiếp đó sử dụng công ten nơ tiếp theo…

Gọi ijx là số đồ vật j được chở trên công ten nơ i , iy là biến nhận giá trị 0 hay 1 tuỳ theo có dùng công ten nơ i hay không.

Dạng toán học của bài toán là:

{ }{ }

1

ij1

ij1

ij1

ij

min

, 1, 2,...,

, 1, 2,...,

, 1, 2,...,

0,1, 2, , , 1,2,..., , 1, 2,...,

0,1 1,2,...,

m

iin

j ij

n

j ij

m

ji

j

i

y

a x Ty i m

b x Ky i m

x s j n

x s i m j n

y i m

=

=

=

=

≤ =

≤ =

= =

∈ = =

∈ =

Page 9: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm I.5 Quy hoạch rời rạc Hai nhóm ràng buộc đầu biểu thị yêu cầu không chuyên chở quá tải trọng và dung lượng của mỗi công ten nơ được sử dụng ( 1iy = ), còn công ten nơ không sử dụng ( 0iy = ) cần phải rỗng. Nhóm ràng buộc thứ ba biểu thị mọi đồ vật cần được xếp vào các công ten nơ.

2.6. Bài toán người du lịch Cho đồ thị ( , ),G V E= V là tập n đỉnh, E là tập n cạnh. Gọi ijc là độ dài của cung nối từ đỉnh i đến đỉnh j, có thể ij jic c≠ và iic = ∞ với mọi i . Một chu trình Hamilton là một chu trình sơ cấp mà nó tương đương với việc xuất phát từ một đỉnh bất kỳ cho trước, đi qua mọi đỉnh khác đúng một lần và trở lại đỉnh xuất phát. Tổng khoảng cách trên các cạnh trong hành trình đó là độ dài của hành trình đó. Mục tiêu của bài toán người du lịch là tìm chu trình Hamilton có độ dài ngắn nhất.

Đặt ij 1x = nếu cung ( , )i j được chọn và bằng 0 nếu trái lại. Dạng toán học của bài toán là:

{ }

n

ij ij1 j=1

ij1

ij1

ij

ij

min

1, 1,2,...,

1, 1,2,...,

0;1 , , 1,2,...,

1, 2 i j n

n

i

n

j

m

i

i j

c x

x i n

x j n

x i j n

u u nx n

=

=

=

= =

= =

∈ =

− + ≤ − ≤ ≠ ≤

∑∑

trong đó iu nhận giá trị nguyên hay thực.

Hai tập ràng buộc đầu biểu thị mỗi thành phố được thăm đúng một lần. Ràng buộc cuối đưa vào để mỗi hành trình của bài toán chỉ chứa duy nhất một chu trình.

Bài toán người du lịch là một bài toán rất quen thuộc và nổi tiếng trong tối ưu rời rạc. Tuy số phương án của bài toán là hữu hạn (bằng !n đối với bài toán có n thành phố) nhưng với n cỡ hàng ngàn trở lên thì số phương án này cực kỳ lớn, vì thế cách duyệt toàn bộ là không thể thực hiện được, mặc dầu có sự trợ giúp của các máy tính cực mạnh. Little J.D, Murty K.G, Sweeney D.W và Karel C 1963 là những người đầu tiên sử dụng thành công phương pháp nhánh cận để giải bài toán người du lịch và cho đến nay phương pháp này với nhiều cải tiến khác nhau vẫn là công cụ chủ yếu để giải quyết bài toán đề ra.

2.7. Bài toán với chi phí cố định Xét bài toán tối ưu có dạng sau:

n

j 1 2j=1

min f(x)= f ( ) : ( , ,..., )j nx x x x x D

= ∈

trong đó nD R+⊂ là một tập lồi đóng và:

Page 10: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm I.6 Quy hoạch rời rạc

0( ) ( 1,2,..., )

0 0

+ >= = =

j j j jj j

j

d c x khi xf x j n

khi x

Giả thiết 0jd > với mọi 1, 2,...,j n= . Các số jd thường được hiểu là các chi phí cố định cần thiết để đưa phương thức sản xuất j vào hoạt động, nó không phụ thuộc vào cường độ sử dụng của phương thức này ( )jx .

Giả sử đã biết jp là cận trên của biến ( )jx , tức là:

{ }jax x : , 1, 2,...,jp m x D j n≥ ∈ =

Khi đó ta có thể đưa bài toán trên về bài toán tương đương với nó dạng:

{ }1( ) min

,0 , 0,1 , 1, 2,...,

n

j j j jj

j j j j

c x d y

x D x p y y j n=

+ →

∈ ≤ ≤ ∈ =

2.8. Bài toán với ràng buộc dạng lựa chọn Cho hai hàm số ( )g x và ( )h x bị chặn trên trên tập hợp D . Nếu ta đòi hỏi phải có hoặc ( ) 0g x ≤ hoặc ( ) 0h x ≤ với mọi x D∈ , thì điều này có thể diễn đạt bằng cách đưa thêm vào một biến số nhận giá trị 0-1. Ký hiệu gu và hu là các cận trên của hàm ( )g x và ( )h x trên tập D ( ( ) gg x u≤ , ( ) hh x u≤ , x D∀ ∈ ). Khi đó điều kiện trên sẽ được thoả mãn khi và chỉ khi:

{ }

( )

( ) (1 )0,1

g

h

g x u

h x u

δ

δδ

≤ − ∈

Ví dụ 1. Điều kiện bù trong quy hoạch toàn phương

10

n

j jj

x y=

=∑ (với 0, 0, 1,2,...,j jx y j n≥ ≥ = )

có thể thay thế bằng n cặp ràng buộc dạng lựa chọn:

0jx ≤ hay 0, 1,2,...,jy j n≤ = (với 0, 0, 1, 2,...,j jx y j n≥ ≥ = ).

Giả sử đã biết cận trên jp của biến jx và cận trên jq của biến jy . Khi đó bằng cách đưa vào các biến jz nhận giá trị 0-1, ta có thể đưa n cặp ràng buộc dạng lựa chọn nói trên về dạng:

{ }, (1 ), 0,1j j j j j j jx p z y q z z≤ ≤ − ∈ (với 0, 0, 1, 2,...,j jx y j n≥ ≥ = ).

Ví dụ 2. Khi quyết định phương thức sản xuất sản phẩm mới ta thường gặp tình huống sau: hoặc là không sản xuất sản phẩm j ( jx =0), hoặc là nếu chấp nhận sản xuất nó thì phải sản xuất với số lượng không ít hơn jd ( j jx d≥ ), với jd là số lượng sản phẩm loại j tối thiểu cần sản xuất để bù lại được các chi phí cần bỏ ra khi đưa phương

Page 11: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm I.7 Quy hoạch rời rạc thức sản xuất sản phẩm mới này vào hoạt động (khi đó mới có lãi). Tức là ta gặp ràng buộc dạng lựa chọn:

0 0j j jd x hay x− ≤ ≤

Giả sử đã biết cận trên jp của biến jx trong bài toán trên. Khi đó ta đưa vào biến 0-1

1iy = nếu chấp nhận sản xuất sản phẩm j , và bằng 0 nếu ngược lại. Ta có thể đưa ràng buộc dạng lựa chọn nói trên về hệ ràng buộc tương đương sau:

{ }, 0,1j j j j j jd y x p y y≤ ≤ ∈

2.9. Bài toán pha cắt nguyên vật liệu Trong thực tế ta thường phải cắt những vật liệu dài (thanh thép, gỗ, ống nước…) thành những đoạn nhỏ có độ dài cho trước với số lượng nhất định để sử dụng. Nên cắt như thế nào để đỡ lãng phí vật liệu nhất.

Ví dụ. Một công trường xây dựng có những thanh thép dài 6m, cần cắt thành 40 đoạn dài 2,5m và 60 đoạn dài 1,6m, nên như thế nào để đỡ lãng phí vật liệu nhất.

Ta có 3 cách cắt như sau:

Mẫu 1: 2 đoạn 2,5m, thừa 1 m.

Mẫu 2: 1 đoạn 2,5m và 2 đoạn 1,6n, thừa 0,3m.

Mẫu 3: 3 đoạn 1,6m, thừa 1,2m.

Gọi 1 2 3, ,x x x là số thanh cần cắt theo mẫu 1, 2, 3 tương ứng, ta có bài toán quy hoạch rời rạc sau:

1 2 3

1 2

2 3

1 2 3

0.3 1.2 min2 402 3 600 , ,

x x xx xx x

x x x Z

+ + →+ =+ =

≤ ∈

Tổng quát, ký hiệu: ija là số đoạn loại i thu được khi cắt theo mẫu j , ib là số đoạn loại i cần có, jc là dẻo thừa khi cắt theo mẫu j , jx là số thanh thép cắt theo mẫu j . Ta được bài toán quy hoạch rời rạc:

1

1

min

, 1, 2,...,

0 , 1, 2,...,

n

j jj

n

ij j ij

j

c x

a x b i m

x Z j n

=

=

= =

≤ ∈ =

2.10. Bài toán sản xuất đầu tư Trong thực tế, tất cả các nhà đầu tư vào sản xuất đều gặp bài toán : có m loại tài nguyên cần dùng để sản xuất ra n loại sản phẩm. Các tài nguyên này có thể bị tiêu hao trong quá trình sản xuất hoặc được tăng thêm nhờ thực hiện một trong p dự án đầu tư phát triển sản xuất.

Page 12: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm I.8 Quy hoạch rời rạc Cho biết:

jx là số lượng sản phẩm loại j được sản xuất.

jc lợi nhuận thu được nếu một sản phẩm loại j được sản xuất.

0b là tổng số tiền nhà đầu tư có thể đem ra để đầu tư vào sản xuất (thực hiện các dự án).

ib là lượng tài nguyên i hiện có trước khi thực hiện các đầu tư.

ija là số tài nguyên i cần để sản xuất ra một sản phẩm j .

kd là chi phí cần cho loại dự án đầu tư k .

ikg là lượng tài nguyên i được tăng thêm nếu dự án đầu tư k được thực hiện.

Ta đưa vào một biến 0-1: ky =1 nếu dự án được dùng, và bằng 0 nếu trái lại.

Dạng toán học của bài toán là:

{ }

1

01

1 1

ax

, 1, 2,...,

0 , 1, 2, ,

0,1 , 1, 2, ,

n

j jj

p

k kk

pn

ij j i ik kj k

j

k

c x m

d y b

a x b g y i m

x Z j n

y k p

=

=

= =

≤ + =

≤ ∈ =

∈ =

∑ ∑…

2.11. Bài toán chọn địa điểm đặt nhà máy Đây cũng là một bài toán đầu tư, nhưng phức tạp hơn so với bài toán sản xuất - đầu tư. Cái khó không phải chỉ vì các chi phí đầu tư được tính đến mà còn vì có các chi phí khác phụ thuộc vào địa điểm đặt nhà máy, cụ thể là chi phí vận chuyển. Cũng còn một khó khăn nữa, đó là chi phí đầu tư trả một lần, còn chi phí vận chuyển thì xuất hiện thường xuyên. Để làm cho chi phí này có thể so sánh được với nhau thì phải xét thêm các chi phí vận chuyển trong các thời kỳ khác nhau, tất nhiên là quy đổi so với thời kỳ đầu. Nói một cách khác, cần thêm vào một hệ số nhân thích hợp đối với các chi phí vận chuyển.

Ta ký hiệu:

P là số địa điểm thích hợp đặt nhà máy.

N là số các nhà máy khác nhau có thể xây dựng ( N P≤ ), mỗi địa điểm đặt nhiều nhất là một nhà máy.

M là số các vật phẩm khác nhau được sản xuất hay tiêu dùng.

isa là lượng vật phẩm i được sản xuất (nếu is 0a > ), hay tiêu dùng (nếu is 0a < ) ở nhà máy s ( 1, 2,..., ; 1,2,...,i M s N= = )

Page 13: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm I.9 Quy hoạch rời rạc

ib là nhu cầu về vật phẩm i do các nhà máy sản xuất (nếu 0ib > ), hay do các nhà máy tiêu dùng (nếu 0ib < ).

psd là chi phí lắp đặt nhà máy s tại địa điểm ( 1, 2,..., )p p P= .

pqc là chi phí vận chuyển một đơn vị hàng giữa các địa điểm p và q .

stf là lượng hàng cần vận chuyển (trong một thời kỳ) từ nhà máy s tới nhà máy t .

λ là hệ số chuyển đổi làm cho chi phí vận chuyển so sánh được với chi phí đầu tư.

psx là biến xác định vị trí, nhận giá trị 1 hay 0 tuỳ thuộc vào nhà máy s có đặt tại vị trí p hay không.

Bài toán đặt ra là cần xác định địa điểm đặt các nhà máy sao cho tổng chi phí xây dựng và vận chuyển hàng là nhỏ nhất. Ta đi đến bài toán quy hoạch nguyên phi tuyến:

{ }

1 1 1 1 1 1

1 1

1

min

, 1,2,...,

1, 1, 2,...,

0,1 , 1, 2,..., ; 1,2,...,

P N P P N N

ps ps pq st ps qtp s p q s t

P N

is ps ip s

N

pss

ps

d x c f x x

a x b i M

x p P

x p P s N

λ= = = = = =

= =

=

+ →

≥ =

≤ =

∈ = =

∑∑ ∑∑∑∑

∑∑

2.12. Tìm tập ổn định trên đồ thị Cho đồ thị G , có n đỉnh, E là tập các cạnh của đồ thị. Tìm tập đỉnh có nhiều phần tử nhất trên đồ thị sao cho không có hai đỉnh nào kề nhau.

Ta thêm vào một biến 0-1: jx =1 nếu đỉnh j được chọn, và bằng 0 nếu trái lại. Dạng toán học của bài toán là:

{ }

1ax

1 ( , )

0,1 , 1, 2, ,

n

jj

i j

j

x m

x x i j E

x j n

=

+ ≤ ∀ ∈

∈ =

Nếu đỉnh j có trọng số jc >0 thì ta có bài toán tìm tập ổn định có trọng số lớn nhất:

{ }

1ax

1 ( , )

0,1 , 1, 2,

n

j jj

i j

j

c x m

x x i j E

x j n

=

+ ≤ ∀ ∈

∈ =

Page 14: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm I.10 Quy hoạch rời rạc 2.13. Bài toán tìm sắc tố Tìm số màu tối thiểu để tô mọi đỉnh của đồ thị sao cho hai đỉnh kề nhau có màu khác nhau. Giả sử đồ thị ( , )G V E= , V là tập n đỉnh, E là tập m cạnh. Cần tối đa n màu nếu đồ thị có n đỉnh. Đặt hai biến

ky =1 nếu màu k được dùng, và bằng 0 nếu trái lại.

jkx =1 nếu đỉnh j được tô màu k , và bằng 0 nếu trái lại.

Dạng toán học của bài toán là:

{ }

1

1

min

1, 1,2,...,

, ( , ) , 1, 2, ,

, 0,1 , , 1,2, ,

n

kkn

jkk

ik jk k

k jk

y

x j n

x x y i j E k n

y x k j n

=

=

= =

+ ≤ ∀ ∈ =

∈ =

∑…

trong đó, ràng buộc thứ nhất biểu thị mỗi đỉnh chỉ được tô bằng một màu, ràng buộc thứ hai biểu thị hai đỉnh kề nhau không được tô cùng một màu.

2.14. Bài toán tìm chỉ số màu Hãy tìm số màu tối thiểu để tô mọi cạnh của đồ thị G sao cho hai cạnh kề nhau không được tô cùng màu. Giả sử đồ thị G có n đỉnh, m cạnh, E là tập các cạnh của đồ thị. Tối đa cần dùng m màu để tô m cạnh. Ký hiệu

ky =1 nếu màu k được dùng, và bằng 0 nếu trái lại.

jkx =1 nếu cạnh j được tô màu k , và bằng 0 nếu trái lại.

ija =1 nếu đỉnh i là mút cuối của cạnh j và bằng 0 nếu trái lại.

Dạng toán học của bài toán là:

{ }

1

1

1

min

1, 1,2,...,

, 1, 2,..., ; 1, 2,...,

, 0,1 , , 1,2, ,

m

kkm

jkk

m

ij jk kj

k jk

y

x j m

a x y k m i n

y x j k m

=

=

=

= =

≤ = =

∈ =

∑…

trong đó, ràng buộc thứ nhất biểu thị mỗi cạnh chỉ tô một màu, ràng buộc thứ hai biểu thị không tô cùng một màu các cạnh có chung một đỉnh.

2.15. Bài toán phủ đỉnh Cho đồ thị ( , )G V E= , V là tập n đỉnh, E là tập m cạnh. Tìm số đỉnh ít nhất của đồ thị G sao cho mỗi cạnh có ít nhất một đầu mút đã được chọn.

Page 15: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm I.11 Quy hoạch rời rạc Ứng dụng: tìm cách đặt các trạm quan sát (hoặc cửa hàng, trạm điện thoại, trung tâm dịch vụ) tại các ngã ba, ngã tư…sao cho quan sát được mọi tuyến đường trong khu phố với số trạm ít nhất.

Ta đưa vào một biến 0-1 là jx =1 nếu đỉnh j được chọn, và bằng 0 nếu trái lại. Dạng toán học của bài toán:

{ }

1min

1, ( , )

0,1 ; 1,2,...,

n

jj

i j

j

x

x x i j E

x j n

=

+ ≥ ∀ ∈

∈ =

2.16. Bài toán phủ cạnh Cho đồ thị ( , )G V E= , V là tập n đỉnh, E là tập m cạnh. Tìm số cạnh ít nhất của đồ thị G sao cho mỗi đỉnh thuộc V đều là đầu mút của ít nhất một cạnh đã chọn.

Ứng dụng:

- Có một pháo đài với các tháp canh ở cuối mỗi hành lang, một lính gác ở hành lang có thể quan sát được cả hai tháp canh ở hai đầu hành lang. Hãy tìm số lính canh ít nhất để quan sát được mọi tháp canh của pháo đài (chính là số hành lang ít nhất để phủ được hết các tháp canh).

- Có một viện bảo tàng gồm nhiều gian trưng bày, giữa các gian có các cửa thông nhau, một người đứng ở cửa giữa hai gian có thể quan sát được cả hai gian. Hãy tìm cách bố trí người canh gác ở các cửa sao cho gian nào cũng có người canh và số người canh là ít nhất (mỗi gian là một đỉnh, mỗi cửa là một cạnh).

Ta đưa các ký hiệu: ija =1 nếu đỉnh i là một trong các đầu mút của cạnh j và bằng 0 nếu trái lại, jx =1 nếu cạnh j được chọn và bằng 0 nếu trái lại. Dạng toán học của bài toán:

{ }

1

1

min

1, 1, 2,...,

0,1 ; 1, 2,...,

m

jj

m

ij jj

j

x

a x i n

x j m

=

=

≥ =

∈ =

2.17. Bài toán ghép cặp trên đồ thị Cho đồ thị ( , )G V E= , V là tập n đỉnh, E là tập m cạnh. Tìm tập cạnh lớn nhất (nhiều cạnh nhất) sao cho hai cạnh bất kỳ không chung đỉnh. Ta đưa vào các ký hiệu:

ija =1 nếu đỉnh i là một trong các đầu mút của cạnh j , và bằng 0 nếu trái lại.

jx =1 nếu cạnh j được chọn, và bằng 0 nếu trái lại.

Dạng toán học của bài toán là:

Page 16: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm I.12 Quy hoạch rời rạc

{ }

1

11, 1, 2,...,

0,1 ; 1, 2,...,

m

jj

m

ij jj

j

x max

a x i n

x j m

=

=

≤ =

∈ =

Nếu mỗi cạnh có gắn một trọng số 0jc ≥ thì có thể xét bài toán tìm ghép cặp với tổng trọng số lớn nhất

1max

m

j jj

c x=

⇒∑

Ví dụ . Có p người và q việc, p khác q . Mỗi người được đào tạo để làm ít nhất một việc. Hãy sắp xếp mỗi người làm một việc phù hợp với khả năng chuyên môn của họ. Khi đó ta có đồ thị hai phần như sau:

Người 1 Việc 1

Người 2 Việc 2

Người p Việc q

p đỉnh ứng với người, q đỉnh ứng với việc. Nếu người i có khả năng làm việc j thì ta vẽ cạnh ( , )i j . Tìm ghép cặp lớn nhất trong đồ thị này.

2.18. Bài toán phân công theo ca kíp Phòng cảnh sát Quận có số tuyến cần được tuần tra theo thời gian cho trong bảng

Giả thiết mỗi tuyến tuần tra chỉ cần một viên cảnh sát, mỗi cảnh sát đi làm theo ca 8 tiếng liên tục. Hãy xác định số nhân viên cảnh sát tối thiểu để hoàn thành nhiệm vụ. Gọi 1x là số cảnh sát đi làm vào lúc 22 giờ tối, 2x là số cảnh sát đi làm vào lúc 02 giờ

Thời gian Yêu cầu số tuyến tuần tra

22 giờ tối đến 02 giờ sáng 13

02 giờ sáng đến 06 giờ sáng 01

06 giờ sáng đến 10 giờ sang 07

10 giờ sáng đến 14 giờ chiều 06

14 giờ chiều đến 18 giờ chiều 06

18 giờ chiều đến 22 giờ tối 17

Page 17: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm I.13 Quy hoạch rời rạc sáng, …, 6x là số cảnh sát đi làm vào lúc 18 giờ chiều. Khi đó dạng toán học của bài toán là:

6

1

1 2

2 3

3 4

4 5

5 6

1 6

17661713

0 , 1,2,3, 4,5,6.

jj

j

x min

x xx xx xx xx xx x

x Z j

=

+ ≥+ ≥+ ≥

+ ≥+ ≥+ ≥≤ ∈ =

2.19. Bài toán tìm luồng cực đại trên đồ thị có hướng Ta xét bài toán cụ thể: cho đồ thị có hướng gồm 6 đỉnh, nếu từ đỉnh u tới đỉnh v có đường vận chuyển thì ta vẽ một cung j , lượng hàng vận chuyển trên cung này là jx , khả năng vận chuyển tối đa trên cung này là jq . Tìm lượng hàng lớn nhất có thể vận chuyển từ đỉnh 1 đến đỉnh 6.

Từ đồ thị trên ta có thể viết bài toán dưới dạng:

1 2

1 4 5

2 3 7

3 4 6

7 8

1 2 5 6 8

0 , 1, 2,3,4,5,6,7,8j j

x x maxx x xx x xx x xx xx x x x x

x q j

+ →= +

= ++ ==+ = + +≤ ≤ =

jx nguyên với j = 1, 2, 3, 4, 5, 6, 7, 8

Trong trường hợp véc tơ q = (4, 2, 4, 4, 1, 2, 2, 2) ta được đáp số là: lượng hàng tối đa có thể vận chuyển là 5, phương án tối ưu là x = (3, 2, 0, 2, 1, 2, 2, 2).

3

1

5

4

2

6

2x

1x 4x

3x

5x

6x

7x 8x

Page 18: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm I.14 Quy hoạch rời rạc

BÀI TẬP

Dùng Microsoft Excel để giải các bài toán quy hoạch tuyến tính nguyên sau.

1. Một xưởng mộc sản xuất ba loại ghế tựa khác nhau A, B, C. Mỗi loại ghế cần trải qua các thao tác: đánh bóng, đánh màu và đánh véc ni. Ngoài ra ghế loại C cần thêm thao tác bọc nệm ghế. Biết thời gian cần thiết để thực hiện mỗi thao tác đối với từng loại ghế: ghế loại A cần 1h đánh bóng, 0.5 giờ đánh màu, 0.7 giờ đánh véc ni và tiền lãi là 100 ngàn đồng; ghế loại B cần 1.2h đánh bóng, 0.5 giờ đánh màu, 0.7 giờ đánh véc ni và tiền lãi là 130 ngàn đồng; ghế loại C cần 0.7h đánh bóng, 0.3 giờ đánh màu, 0.3 giờ đánh véc ni, 0.7 giờ bọc nệm và tiền lãi là 80 ngàn đồng. Thời gian hiện có dành cho việc đánh bóng là 600 giờ/ tháng, đánh màu là 300 giờ, đánh véc ni là 300 giờ, bọc nệm là 140 giờ. Hỏi nên sản xuất bao nhiêu ghế mỗi loại để thu được nhiều lãi nhất.

2. Một xưởng sản xuất dự định mua hai loại máy để in hình vẽ trên vải. Máy A có thể in 100 m/phút và chiếm 50 mét vuông diện tích sàn, còn máy B có thể in 200 m/phút và chiếm 140 mét vuông diện tích sàn. Xưởng cần in ít nhất 600 m/phút và có diện tích sàn để đặt máy in tối đa là 350 mét vuông. Mỗi máy A giá 22 triệu đồng và mối máy B giá 42 triệu đồng. Hỏi cần mua bao nhiêu máy in mỗi loại sao cho tốn ít chi phí nhất.

3. Một doanh nghiệp có trong tay 10 dự án sẽ được lựa chọn để thực hiện vào năm sau. Do hạn chế về nhân lực và tài chính nên không thể thực hiện tất cả các dự án. Để lựa chọn, mỗi dự án được gán một trọng số biểu thị giá trị của việc thực hiện dự án đó, các dự án từ 1 đến 10 có các trọng số tương ứng là: 70, 50, 60, 20, 10, 20, 30, 450, 10, 40. Chi phí về nhân lực của các dự án từ 1 đến 10 tương ứng là: 250, 195, 200, 70, 30, 40, 100, 170, 40, 120 người / tuần. Chi phí về tài chính của các dự án từ 1 đến 10 tương ứng là : 400, 300, 350, 100, 70, 70, 250, 250, 100, 200 triệu đồng. Chủ doanh nghiệp hiện có nguồn nhân lực 1000 người/tuần và 1500tiệu đồng để thực hiện các dự án. Cần chọn thực hiện những dự án nào để thu được tổng giá trị lớn nhất.

4. Một xí nghiệp dùng 3 máy M1, M2, M3 để sản xuất một loại sản phẩm gồm 3 chi tiết C1, C2, C3 (mỗi bộ sản phẩm gồm một chi tiết mỗi loại). Mỗi ngày máy M1 có thể sản xuất 8 chi tiết C1 hoặc 3 chi tiết C2 hoặc 12 chi tiết C3; máy M2 có thể sản xuất 12 chi tiết C1 hoặc 16 chi tiết C3 (máy M2 không sản xuất chi tiết C2), máy M3 có thể sản xuất 6 chi tiết C1 hoặc 3 chi tiết C2 hoặc 6 chi tiết C3. Hãy xác định tỷ lệ thời gian trong ngày để mỗi máy sản xuất từng chi tiết sao cho xí nghiệp đạt được số bộ sản phẩm là nhiều nhất ?

5. Một xưởng làm cửa sắt có những thanh thép dài 12 m, cần cắt thành 8 đoạn dài 4m, 5 đoạn dài 5m và 3 đoạn dài 7m. Có 5 mẫu cắt sau. Mẫu 1: 3 đoạn dài 4m, không thừa. Mẫu 2: 1 đoạn 4m, 1 đoạn 5m, thừa 3m. Mẫu 3: 1 đoạn 4m, 1 đoạn 7m, thừa 1m. Mẫu 4: 2 đoạn 5m, thừa 2m. Mẫu 5: 1 đoạn 5m, 1 đoạn 7m, không thừa. Cần dùng những mẫu cắt nào để tiết kiệm nhất.

6. Một xí nghiệp có thể sử dụng tối đa 510 giờ máy cán, 360 giờ máy tiện và 150 giờ máy mài để chế tạo 3 loại sản phẩm A, B, C. Để chế tạo một đơn vị sản phẩm A cần 9h máy cán, 5h máy tiện, 3h máy mài. Để chế tạo một đơn vị sản phẩm B cần 3h máy cán, 4h máy tiện. Để chế tạo một đơn vị sản phẩm C cần 5h máy cán, 3h máy tiện, 2h máy mài. Sản phẩm A trị giá 48 ngàn đồng. Sản phẩm B trị giá 16 ngàn đồng. Sản phẩm C trị giá 27 ngàn đồng. Xí nghiệp cần chế tạo bao nhiêu sản phẩm mỗi loại để tổng giá trị lớn nhất.

Page 19: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm I.15 Quy hoạch rời rạc

7. Một nhà sản xuất đồ gỗ sản xuất 3 loại bàn: loại truyền thống x1, loại cận đại x2, loại hiện đại x3. Loại x1 có lợi nhuận là 36$, cần 2 h để tạo hình, 3 h để đánh bóng. Loại x2 có lợi nhuận là 28$, cần 2 h để tạo hình, 2 h để đánh bóng. Loại x3 có lợi nhuận là 32$, cần 4 h để tạo hình, 1 h để đánh bóng. Xác định phương án sản xuất để cực đại hóa lợi nhuận nếu nhà sản xuất có 60 h để tạo hình và 80 h để đánh bóng.

8. Tìm phương án vận tải có chi phí nhỏ nhất. Khả năng các nơi phát hàng P1, P2, P3 tương ứng là 80, 110, 120 tấn hàng. Nhu cầu các nơi tiêu thụ T1, T2, T3 tương ứng là 100, 120, 900 tấn. Ma trân chi phí từ nơi phát tới nơi thu là ($ / tấn hàng hóa):

200 600 300 C = 400 200 700 500 800 300

9. Bài toán vận tải: khả năng phát A = (65, 95, 85, 55), nhu cầu B = (55, 50, 80 , 50 ,65). 9 20 7 14 8 C = 12 15 19 13 8 11 27 17 23 19 14 11 13 7 10

10. Tìm tập đỉnh có nhiều phần tử nhất trên đồ thị sau sao cho không có hai đỉnh nào kề nhau

1 3 2 10

6 4 5 9

7 8

11. Tìm số màu tối thiểu để tô mọi đỉnh của đồ thị sao cho hai đỉnh kề nhau có màu khác nhau

1 2

4 3

12. Tìm số màu tối thiểu để tô các cạnh của đồ thị sau sao cho hai cạnh kề nhau có màu khác nhau

1

4

2 3

Page 20: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm I.16 Quy hoạch rời rạc

13. Tìm số đỉnh ít nhất trong đồ thị sau sao cho mỗi cạnh có ít nhất một đầu mút được chọn.

5 7

4 6

3 2 1

14. Hãy bố trí số người gác tối thiểu cho khu bảo tàng có sơ đồ sau.

2 3 4

1 6 5

15. Tìm ghép cặp với tổng trọng số lớn nhất của đồ thị sau. Trọng số của các cạnh (1,5), (1,6), (1,7), (2,5), (2,7), (3,6), (3,8), (4,6), (4,7), (4,8) lần lượt là: 5, 8, 2, 3, 4, 9, 6, 7, 2, 4.

1 5

2 6

3 7

4 8

Người Việc

Page 21: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm II.1 Quy hoạch rời rạc

Chương 2

NHỮNG KHÁI NIỆM MỞ ĐẦU Trong chương này sẽ trình bày những khái niệm cơ bản về quy hoạch tuyến tính, phương pháp đơn hình bình thường, phương pháp đơn hình đối ngẫu từ vựng, và khái niệm về bài toán quy hoạch tuyến tính nguyên.

1. NHỮNG KHÁI NIỆM CƠ BẢN VỀ QUY HOẠCH TUYẾN TÍNH 1.1. Bài toán qui hoạch tuyến tính là bài toán có dạng:

01

1

1

a x (1 )

, 1, 2 , .. . , ( 2 )

, 1, . . . , (3 )

0 , 1, .. , ( 4 )

n

j jj

n

i j j ij

n

i j j ij

j

x c x m

a x b i l

a x b i l m

x j n

=

=

=

= →

= =

≤ = +

≥ =

Miền xác định: tập hợp các véc tơ x thoả mãn (2) và (4)

Phương án bài toán: véc tơ x thoả mãn (2) và (4)

Nếu (x1,…,xn) là phương án của bài toán, 01

n

j jj

x c x=

=∑ thì X = (x0 ,x1,…,xn) gọi

là phương án mở rộng của bài toán (1) – (4).

Phương án *X làm cực đại (1) gọi là phương án tối ưu. Phương án mở rộng *X gọi là phương án tối ưu mở rộng nếu X* là phương án tối ưu .

Kí hiệu:

L - miền xác định của bài toán (1)-(4)

( , )L C – kí hiệu bài toán qui hoạch tuyến tính (1) - (4)

( , )X L C – phương án tối ưu của bài toán (1) - (4)

( , )X L C - phương án tối ưu mở rộng của bài toán (1) - (4)

CL là tập hợp các phương án tối ưu của bài toán ( , )L C

Bài toán qui hoạch tuyến tính gọi là giải được nếu tồn tại phương án tối ưu.

Page 22: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm II.2 Quy hoạch rời rạc 1.2. Dạng chính tắc của bài toán qui hoạch tuyến tính

01

1

a x

, 1 , 2 , . . . ,

0 , 1 , 2 , . . . ,

n

j jj

n

i j j ij

j

x c x m

a x b i m

x j n

=

=

= →

= =

≥ =

Gọi

1

2

.

.

j

j

j

mj

a

a

A

a

=

là véc tơ điều kiện thứ j của bài toán (5)-(7)

1

2...

B=

mb

bb

là véc tơ ràng buộc của bài toán (5)-(7).

Phương án X của bài toán (5)-(7) gọi là tựa nếu các véc tơ điều kiện ứng với các thành phần dương của nó là độc lập tuyến tính.

Cơ sở của phương án tựa X là tập hợp | 0 }j{ A jx > . Các thành phần của phương án tựa ứng với các véc tơ cơ sở gọi là các thành phần cơ sở (các biến tương ứng gọi là biến cơ sở), các thành phần còn lại gọi là các thành phần phi cơ sở (các biến tương ứng gọi là biến phi cơ sở).

Nếu 1( ,..., )nX x x= phương án tựa của bài toán quy hoạch tuyến tính,

1( ,..., )j jkA A là cơ sở của phương án tựa, { }1,..., kB j j= , { }1,..., \N n B= thì hàm mục

tiêu 0 1, ,..., nx x x có thể biểu diễn qua các biến phi cơ sở:

0 i j( ), 0,1,...,i i jj N

x x x x i n∈

= + − =∑

Kí hiệu Qn ={0,1,…,n}

B0=B∪{0}, N0=N∪{0}

Bảng đơn hình 0,ij ni Q j NT x

∈ ∈= gọi là bảng đơn hình đầy đủ.

Phương án tựa bài toán (5) - (7) gọi là không suy biến nếu số ràng buộc của hệ (6) - (7) mà phương án thỏa mãn với dấu bằng bằng đúng n (các ràng buộc này là độc lập tuyến tính). Phương án tựa là suy biến nếu số ràng buộc mà phương án tựa thỏa mãn chặt là lớn hơn n.

(5)

(6)

(7)

Page 23: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm II.3 Quy hoạch rời rạc

Phương án tựa X của bài toán (5) - (7) là không suy biến nếu các thành phần cơ sở của nó là dương. Cơ sở của phương án tựa không suy biến xác định duy nhất. Ứng với phương án tựa suy biến có nhiều cơ sở.

Tiêu chuẩn tối ưu: để cho phương án mở rộng ' ' '0 1' ( , ,..., )nX x x x= là tối ưu điều

kiện cần và đủ là tồn tại cơ sở B sao cho '

i j

0

( ), 0,1,...,

0,

i i jj N

j

x x x x i n

x j N∈

= + − =

≥ ∈

Giả sử ràng buộc (6) của bài toán (5) - (7) viết ở dạng:

0 i j( ), 0,1...,i i jj N

x x x x i n∈

= + − =∑ .

Bảng đơn hình tương ứng 0,ij ni Q j NT x

∈ ∈= ,

2 10 20 0

1 11

, ,..., ) ( , ,..., ),

( , ,..., ) ( , ,..., ).

1

0

X=(x

x

n nn

n j j nj

x x x x x

X x x c x x x=

=

= = ∑

Nếu xi0 ≥ 0 (i = 1, 2, . . ., n) thì bảng đơn hình T gọi là chấp nhận được, véc tơ X là phương án tựa của bài toán quy hoạch tuyến tính.

Nếu x0j ≥ 0 , j∈N thì bảng đơn hình T là chuẩn (đối ngẫu chấp nhận được), véc tơ

X gọi là giả phương án, X gọi là giả phương án mở rộng

2. SO SÁNH THEO NGHĨA TỪ VỰNG 2.1. Véc tơ 1 2( , ,..., )nX x x x= gọi là dương từ vựng X>0 nếu X≠(0,…,0) và thành phần đầu tiên khác 0 là dương.

Véc tơ X gọi là không âm từ vựng X ≥ 0 nếu X>0 hay X=0

Véc tơ X gọi là lớn hơn từ vựng véc tơ Y (ký hiệu X > Y) nếu X – Y >0

Véc tơ X ≥ Y (không nhỏ hơn từ vựng) nếu X – Y ≥0

X gọi là âm từ vựng (ký hiệu là X < 0) nếu –X >0

Tương tự ta có các định nghĩa X ≤ 0, X < Y, X ≤ Y.

2.2. Phương án X* (phương án mở rộng *X ) của bài toán (5)- (7) gọi là phương án tối ưu từ vựng (phương án l - tối ưu) nếu đối với mọi phương án mở rộng X ta có

* * * *0 1 0 1( , ,..., ) ( , ,..., )n nX x x x X x x x= ≥ = .

Định lý 1. Nếu tập hợp các phương án tối ưu của bài toán (5) - (7) khác rỗng và bị chặn thì tồn tại phương án tối ưu từ vựng X*

Định lý 2. Nếu X* phương án tối ưu từ vựng của bài toán (5)-(7) thì X* là phương án tựa.

Page 24: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm II.4 Quy hoạch rời rạc

Bảng đơn hình 0,ij ni Q j NT x

∈ ∈= gọi là chuẩn từ vựng (hay là l - chuẩn) nếu

0

1

.

.

.

j

j

j

n j

x

x

R

x

=

> 0 , ∀j∈N

Định lý 3. Để cho phương án tựa X* của bài toán (5) – (7) là l - tối ưu, điều kiện cần và đủ là tồn tại cơ sở B sao cho bảng đơn hình 0,ij ni Q j N

T x∈ ∈

= là l - chuẩn.

Giả phương án X (giả phương án mở rộng X ) của bài toán (5) – (7) gọi là dương từ vựng nếu bảng đơn hình tương ứng là l - chuẩn, nói gọn lại là l - giả phương án ( l - giả phương án mở rộng). 3. BẢNG ĐƠN HÌNH, PHƯƠNG ÁN, GIẢ PHƯƠNG ÁN

Phép biến đổi cơ bản của bảng đơn hình: đưa xk ra khỏi cơ sở, đưa xl vào cơ sở. Phần tử xkl gọi là phần tử quay

Giả sử 0,ij ni Q j NT x

∈ ∈= , cơ sở là B, N={ }1,..., \ , , , 0kln B l N k B x∈ ∈ ≠ .

Gọi { }( ) { }* \N N k l= ∪ , các biến x0, x1, .. , xn có thể biểu diễn qua các biến

*N và ta được bảng 0*

* ,*ij ni Q j N

T x∈ ∈

= và cơ sở mới { }( ) { }* \B B l k= ∪ .

Gọi jR là cột của T, *jR là cột của *T , ta có công thức tính lại như sau

*

*

lk

kl

kjj j l

kl

RRx

xR R R

x

= − = −

hay viết ở dạng toạ độ

{ } { }

*

*

, 0,1,2,..., .

, ( \ ) 0 , 0,1,...,

ilik

kl

kjij ij il

kl

xx i nx

xx x x j N l i n

x

= − = = − ∀ ∈ ∪ =

{ }( ) { }\ 0j N l∀ ∈ ∪

Page 25: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm II.5 Quy hoạch rời rạc 4. PHƯƠNG PHÁP ĐƠN HÌNH 4.1. Thuật toán Phương pháp đơn hình cho phép xây dựng dãy hữu hạn các phương án tựa X0, X1, …, Xk, trong đó Xk là phương án tối ưu của bài toán (5) - (7). Hàm mục tiêu x0 = x0(Xr) không giảm khi r tăng. Ứng với mỗi phương án tựa Xr có Tr, Br, Nr. Quá trình giải gồm bước lặp xuất phát (xây dựng phương án tựa xuất phát X0) và dãy các bước lặp tổng quát.

Bước lặp tổng quát r ≥ 0 có phương án Xr, tương ứng với nó có bảng đơn hình Tr

và các tập Br , Nr . Kiểm tra bảng Tr có là chuẩn không (tức là 0 0j rx j N≥ ∀ ∈ ). Nếu

đúng thì Xr là tối ưu, nếu không thì xác định lx đưa vào cơ sở theo công thức :

{ }0 0min |l j rx x j N= ∈

Đưa biến kx ra khỏi cơ sở theo tiêu chuẩn

0 0min | 1, 2,..., ; 0k iil

kl il

x x i n xx x

= = >

Nếu không có xil (i = 1, 2, ..., n) dương thì bài toán không giải được, hàm mục tiêu tiến ra dương vô cùng.

Tính Xr+1, Tr+1, Br+1, Nr+1 theo các công thức ở tiết 3.

4.2. Cách tính phương án xuất phát Giải bài toán phụ ứng với bài toán (5) – (7) có bi ≥ 0 ( i=1,..,m) :

1 21

1

( , .., ) max

, 1, 2,...,

0, 1, 2,...,

n m

n m jj n

n

ij j n i ij

j

f x x x x

a x x b i m

x j n m

+

+= +

+=

= − ⇒

+ = =

≥ = +

Bài toán này có phương án tựa 1 1( ,..., ) (0,0,....,0 , ,..., )mn mn

x x b b+ = .

Dùng phương pháp đơn hình giải bài toán phụ, nếu * * *1 2( , .., ) 0n mf x x x + = thì

* 0n ix + = (i = 1, ..., m) và véc tơ * * *1 2( , .., )nx x x là phương án tựa phải tìm X0.

Nếu *f < 0 thì bài toán (5) – (7) không giải được (không có phương án chấp nhận được).

Ví dụ. Giải bài toán sau:

Page 26: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm II.6 Quy hoạch rời rạc

0 1 2

1 2

1 2

1 2

1 2

max x2 11 38

74 5 5

, 0

x xx x

x xx x

x x

= +

+ ≤+ ≤− ≤≥

Bài toán được viết lại thành

0 1 2

3 1 2

4 1 2

5 1 2

ax x38 2 1175 4 5 , 0 ( 1, ,5)j

m x xx x xx x xx x x x j

= +

= − −

= − −= − − ≥ =

Ta có các bảng đơn hinh như sau:

1 -x5 -x4

x0 7 0 1

x1 40/9 1/9 5/9

x2 23/9 -1/9 4/9

x3 1 1 -6

x4 0 0 -1

x5 0 -1 0 Vậy phương án tối ưu là (40/9; 23/9; 1; 0 ;0) với trị hàm mục tiêu là 7. Cách trình bày

của bảng đơn hình ở trên còn gọi là dạng toạ độ của phương pháp đơn hình.

5. PHƯƠNG PHÁP ĐƠN HÌNH ĐỐI NGẪU TỪ VỰNG 5.1. Phương pháp đơn hình đỗi ngẫu xây dựng một dãy hữu hạn các giả phương án Xo, X1, ... , Xk. Giả phương án cuối cùng Xk là phương án (vì vậy là phương án tối ưu) của bài toán (5) - (7) . Hàm mục tiêu xo = xo(Xr) không tăng khi r tăng. Mỗi giả phương án Xr ứng với bảng Tr và các tập Br , Nr .

1 -x1 -x2

x0 0 -1 -1

x1 0 -1 0

x2 0 0 -1

x3 38 2 11

x4 7 1 1

x5 5 4* -5

1 -x5 -x2

x0 5/4 1/4 -9/4

x1 5/4 1/4 -5/4

x2 0 0 -1

x3 71/2 -1/2 27/2

x4 23/4 -1/4 9/4*

x5 0 -1 0

Page 27: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm II.7 Quy hoạch rời rạc

Quá trình giải gồm bước lặp ban đầu (xây dựng giả phương án xuất phát Xo) và dãy bước lặp tổng quát.

5.2. Tìm cực đại từ vựng của phương án mở rộng

~X = ( n1o x,...,x,x ) = 1

1, ,...,

n

j j nj

c x x x=

với các điều kiện

1

n

ij j ij

a x b=

=∑ (i = 1, ..., m)

0 ( 1, 2, , )jx j n≥ =

Ký hiệu bài toán là ( , )L C hay l - bài toán. Phương pháp đơn hình đỗi ngẫu từ vựng gọi gọn là l - phương pháp.

5.3. Bước lặp r ≥ 0 tổng quát Có l - giả phương án Xr với x0j ≥ 0, j∈ Nr, và tương ứng Tr , Br , Nr, các cột là

0( )rj rR j N∈ .

Kiểm tra xem Tr có chấp nhận được hay không (tức là xio≥ 0 với mọi i = 1,..,n). Nếu đúng thì Xr là phương án l - tối ưu. Nếu không thì tìm biến xk loại khỏi cơ sở theo quy tắc:

k = min { i | i = 1, ... , n ; xio <0}

Tìm xl đưa vào cơ sở theo quy tắc

min ; 0jlr kj

kl kj

RR lex j N xx x

= ∈ <

Nếu trong các số xkj (j∈ Nr) không có số âm thì bài toán không giải được. Nếu có thì biến đổi bảng đơn hình theo các công thức ở tiết 3 ta được Xr+1, Tr+1 , Br+1 , Nr+1

5.4. Tính l giả phương án Xo Giả sử ta xây dựng bảng đơn hình T ứng với bài toán (5) - (7) không phải

là l -chuẩn, ứng với nó có các tập B và N. Giả sử hàm ∑∈Nj

jx bị chặn trên tập

(6)- (7). Khi đó ta tìm được số M sao cho: ∑∈Nj

jx ≤ M (có thể dùng đơn hình

thường để xác định M).

Đưa vào biến mới

−+=

+

∈+ ∑

0x

)x.(1Mx

1n

Njj1n

Viết ràng buộc mới này vào cuối bảng T, chọn xk loại khỏi cơ sớ theo quy tắc: k = n+1. Chọn biến xl đưa vào cơ số theo quy tắc

Page 28: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm II.8 Quy hoạch rời rạc

Rl = lex min {Rj | j ∈ N }

Thực hiện một bước biến đổi bảng đơn hình theo các công thức của tiết 3 ta nhận được bảng To là l - chuẩn (Rj ≥ 0 với j ∈ No ) và ứng với nó ta có các tập Bo và No:

Bo = (B ∪ { l}), No = (N ∪ {n + 1})\ { l}.

5.5. Ví dụ bằng số Giải bài toán sau bằng phương pháp đơn hình đối ngẫu.

Max 3210 23 xxxx −−=

0002431042

321

321

321

321

≥≥≥=+−≥++≤−+

xxxxxxxxx

xxx

, ,

Sau khi thay ràng buộc đẳng thức bằng hai ràng buộc bất đẳng thức bài toán trên

trở thành:

Max 3210 23 xxxx −−=

0,0,02

243

1042

321

321

321

321

321

≥≥≥−≤−+−

≤+−−≤−−−

≤−+

xxxxxx

xxxxxxxxx

Tiếp theo thêm các biến bù ta được bài toán:

Max 3210 23 xxxx −−=

0,,,,,,2

234

4210

7654321

3217

3216

3215

3214

≥+−+−=

−+−=+++−=+−−=

xxxxxxxxxxx

xxxxxxxxxxxx

Ta có các bảng đơn hình sau khi thêm ràng buộc phụ :

Page 29: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm II.9 Quy hoạch rời rạc

1 -x1 -x2 -x3

x0 0.00000 -3.00000 1.00000 -2.00000

x1 0.00000 -1.00000 0.00000 0.00000

x2 0.00000 0.00000 -1.00000 0.00000

x3 0.00000 0.00000 0.00000 -1.00000

x4 10.00000 2.00000 4.00000 -1.00000

x5 -4.00000 -3.00000 -1.00000 -1.00000

x6 2.00000 1.00000 -1.00000 1.00000

x7 -2.00000 -1.00000 1.00000 -1.00000

x8 100.00000 1.00000* 1.00000 1.00000

Bảng 1 1 -x8 -x2 -x3

x0 300.00000 3.00000 4.00000 1.00000

x1 100.00000 1.00000 1.00000 1.00000

x2 0.00000 - 0.00001 -1.00000 0.00000

x3 0.00000 - 0.00001 0.00000 -1.00000

x4 -190.00000 -2.00000 2.00000 -3.00000*

x5 296.00000 3.00000 2.00000 2.00000

x6 -98.00000 -1.00000 -2.00000 0.00000

x7 98.00000 1.00000 2.00000 0.00000

Bảng 2 1 -x8 -x2 -x4

x0 236.66667 2.33333 4.66667 0.33333

x1 36.66667 0.33333 1.66667 0.33333

x2 0.00000 - 0.00001 -1.00000 0.00000

x3 63.33333 0.66667 - 0.66667 - 0.33333

x4 0.00000 0.00000 0.00000 -1.00000

x5 169.33333 1.66667 3.33333 0.66667

x6 -98.00000 -1.00000* -2.00000 0.00000

x7 98.00000 1.00000 2.00000 0.00000

Bảng 3

Page 30: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm II.10 Quy hoạch rời rạc

1 -x6 -x2 -x4

x0 8.00000 2.33333 0.00000 0.33333

x1 4.00000 0.33333 1.00000 0.33333

x2 0.00000 - 0.00001 -1.00000 0.00000

x3 -2.00000 0.66667 -2.00000* - 0.33333

x4 0.00000 0.00000 0.00000 -1.00000

x5 6.00000 1.66667 0.00000 0.66667

x6 0.00000 -1.00000 0.00000 0.00000

x7 0.00000 1.00000 0.00000 0.00000

Bảng 4

1 -x6 -x3 -x4

x0 8.00000 2.33333 0.00000 0.33333

x1 3.00000 0.66667 0.50000 0.16667

x2 1.00000 - 0.33333 - 0.50000 0.16667

x3 0.00000 0.00000 -1.00000 0.00000

x4 0.00000 0.00000 0.00000 -1.00000

x5 6.00000 1.66667 0.00000 0.66667

x6 0.00000 -1.00000 0.00000 0.00000

x7 0.00000 1.00000 0.00000 0.00000

Bảng 5

Vậy phương án tối ưu là (3, 1, 0, 0, 6, 0, 0) với trị hàm mục tiêu bằng x[0]=-8.

5.6. Chương trình máy tính • Chương trình nhằm giải bài toán quy hoạch tuyến tính có dạng:

max1

0 →=∑=

j

m

jj xcx

ij

m

jij bxa ≤∑

=1, pi ,...,1=

0≥jx , mj ,...,2,1=

Page 31: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm II.11 Quy hoạch rời rạc các b[i] có thể dương và âm, phương án xuất phát không đối ngẫu chấp nhận được. Nếu

bài toán giải có ràng buộc đẳng thức dạng: ii

m

jij bxa =∑

=1thì ta thay thế bằng hai bất

đẳng thức: ii

m

jij bxa ≤∑

=1và ii

m

jij bxa ≥∑

=1.

• Sau khi thêm biến bù bài toán trên có thể viết ở dạng:

max))((1

0 →−−=∑=

m

jjj xcx

mjxx jj ,...,2,1))(1( =−−=

.,...,2,1))((1

pixabx j

m

jijiim =−−+= ∑

=+

.,...,2,10 pmjx j +=≥

•Trong chương trình sử dụng các biến và mảng sau:

- m: số biến chính, n: số biến chính và biến bù của bài toán (n=m+p), gz là một

số dương đủ lớn và thường lấy bằng },,{max jiij cba , ss = 1 nếu bảng s là l- chuẩn

nhưng không chấp nhận được và = 0 nếu bảng không là l- chuẩn.

- Mảng s gồm n + 2 dòng và m+1 cột lúc đầu ghi dữ liệu của bài toán sau đó lưu

bảng đơn hình ở mỗi bước. Dòng n+1 để chứa ràng buộc phụ (8).

- s[0][0] hàm mục tiêu, cột 0 là cột phương án, dòng 0 là các ước lượng

- cs : các biến ở bên trái bảng đơn hình, nc : các biến phi cơ sở

•Cách nhập dữ liệu

Các dữ liệu ban đầu của bài toán được ghi trong một tệp văn bản, gồm:

- n, m,gz, ss.

- Mảng s dữ liệu ban đầu bố trí dạng ở dưới và được ghi vào tệp dữ liệu theo từng

dòng :

Page 32: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm II.12 Quy hoạch rời rạc

- Mảng cs: nhập các số 0,1,2,…,n.

- Mảng nc: nhập các số 1,2,…,m.

Với dữ liệu bài toán trong mục 5.5 thì tệp dữ liệu DN.SLI có dạng :

7 3 100 0

0 -3 1 -2

0 -1 0 0

0 0 -1 0

0 0 0 -1

10 2 4 -1

-4 -3 -1 -1

2 1 -1 1

-2 -1 1 -1

0 1 2 3 4 5 6 7

1 2 3

•Văn bản chương trình.

#include <stdio.h> #include <conio.h> #include <math.h> #include <dos.h> #define M 30 #define N 30 double s[N+2][M+1],r,gz; int blap,kgd, kgd2,ss,sb,cmin; int m,n,i,j,k,l,tg,cs[N+2],nc[M+1]; unsigned long far *t; long int t1,t2; char *s1,*s2; FILE *f1,*f2;

-x1 -x2 . . . . . . . . –xm

0 -c1 -c2 . . . . . . . –cm x0

x1

x2

xm

0

0

0

-1 0 . . . . . . . . . . 0

0 -1 . . . . . . . . . 0

0 0 . . . . . . . . . . -1

xm+1

xn

b1

bp

-a11 . . . . . . . . . - a1m

-ap1 . . . . . . . . . .-ap,m

Page 33: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm II.13 Quy hoạch rời rạc int cotquay(); void biendoi(); void inbang(int cuoi); int dhdoingau(); void main() { clrscr(); t= (unsigned long far *)MK_FP(0,0X46C); t1=*t; printf("\nCo in trung gian hay khong 1/0 ? "); scanf("%d%*c",&tg); // Nhap du lieu ban dau printf("\nVao ten tep so lieu : "); gets(s1); f1= fopen(s1,"r"); fscanf(f1,"%d%d%lf%d",&n,&m,&gz,&ss); for (i=0;i<=n;i++) for (j=0; j<=m;j++) { fscanf(f1,"%lf",&r); s[i][j]=r; } for (i=0; i<=n;i++) fscanf(f1,"%d",&cs[i]) ; for (j=1; j<=m; j++) fscanf(f1,"%d",&nc[j]); fclose(f1); sb=1; // In so lieu de kiem tra printf("\n n,m,gz,ss = %d %d %13.5lf %d\n",n,m,gz,ss); if (tg==1){ printf("\nVao ten tep chua ket qua : "); gets(s2); f2=fopen(s2,"w"); fprintf(f2,"\n n,m,gz,ss = %d %d %13.5lf %d\n",n,m,gz,ss); } printf("\nBang 1, so lieu ban dau"); if (tg==1) fprintf(f2,"\nBang 1, so lieu ban dau"); inbang(0); if (ss==1){ printf("\nBang 1, so lieu ban dau, l- chuan, khong chap nhan duoc"); if (tg==1) fprintf(f2,"\nBang 1, so lieu ban dau, l- chuan, khong c.nhan duoc"); goto L1;} // Them rang buoc phu cs[n+1]=n+1; s[n+1][0]=gz; for (j=1;j<=m; j++) s[n+1][j]=1; printf("\nBang 1, so lieu ban dau them rang buoc phu"); if (tg==1) fprintf(f2,"\nBang 1, so lieu ban dau them rang buoc phu"); inbang(1); l=n+1; // Chon cot quay Rl = lexmin { Rj | j (- N } cmin=1; for (j=2;j<=m;j++) { for (i=0; i<=n;i++) { if (s[i][cmin] > s[i][j]) {cmin=j; break;} if (s[i][cmin] < s[i][j]) break; } } printf("\nDong quay = %d, Cot quay = %d Ptq = %13.5lf",l,cmin,s[l][cmin]); if (tg==1) { fprintf(f2,"\nDong quay = %d, Cot quay = %d Ptq = %13.5lf", l,cmin,s[l][cmin]); } biendoi();sb++; printf("\nBang %d, l- chuan dau tien",sb);

Page 34: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm II.14 Quy hoạch rời rạc if (tg==1) fprintf(f2,"\nBang %d, l- chuan dau tien",sb); inbang(0); L1: kgd2= dhdoingau(); if (kgd2==1) { printf("\nBai toan phu khong giai duoc"); if (tg==1) fprintf(f2,"\nBai toan phu khong giai duoc, STOP"); getch(); return; } getch(); } // Phan cac ham int cotquay() { k=0; for (j=1; j<=m; j++) if (s[l][j]<0) { k=j; break;} if (k==0) return 1; cmin=k; for (j=k+1;j<=m;j++) if (s[l][j]<0) { for (i=0; i<=n;i++) { double t1,t2; t1= s[i][cmin]/fabs(s[l][cmin]); t2=s[i][j]/fabs(s[l][j]); if (t1 > t2) {cmin=j; break;} if (t1 < t2) break; } } return 0; } void biendoi() { for (j=0;j<=m;j++) if (j!= cmin) { for (i=0;i<=n;i++) if (i!=l) s[i][j]=s[i][j]-(s[l][j]/s[l][cmin])*s[i][cmin]; s[l][j]=0; } for (i=0;i<=n;i++) if (i!=l) s[i][cmin]=-s[i][cmin]/s[l][cmin]; s[l][cmin]=-1; nc[cmin]=cs[l]; } void inbang(int cuoi) { int n1; if (cuoi==1) n1=n+1; else n1=n; printf("\nCo so : "); for (i=0; i<=n1;i++) printf("%d ",cs[i]) ; printf("\n"); printf("Phi co so : "); for (j=1; j<=m; j++) printf("%d ",nc[j]);printf("\n"); for (i=0;i<=n1;i++) { for (j=0; j<=m;j++) printf(" %13.5lf ",s[i][j]); printf("\n"); } if (tg==1) { fprintf(f2,"\nCo so : "); for (i=0; i<=n1;i++) fprintf(f2,"%d ",cs[i]) ; fprintf(f2,"\n"); fprintf(f2,"Phi co so : "); for (j=1; j<=m; j++) fprintf(f2,"%d ",nc[j]);fprintf(f2,"\n"); for (i=0;i<=n1;i++) { for (j=0; j<=m;j++) fprintf(f2," %13.5lf ",s[i][j]); fprintf(f2,"\n"); } } getch(); } int dhdoingau()

Page 35: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm II.15 Quy hoạch rời rạc { blap=0; Lap0: blap++; printf("\n-----------------------------------------------------"); printf("\nBuoc lap DHDN %d : ",blap); if (tg==1) { fprintf(f2,"\n-----------------------------------------------------"); fprintf(f2,"\nBuoc lap DHDN %d : ",blap); } l=-1; for (i=1;i<=n;i++) if (s[i][0]<0) {l=i; break;} printf("\nDong quay = %d ",l); if (tg==1) fprintf(f2,"\nDong quay = %d",l); if (l==-1) { printf("\nPhuong an toi uu la: "); for (i=0; i<=n;i++) printf("\nx[%2d] = %13.5lf",cs[i],s[i][0]); printf("\nSo bang da lap : %d bang",sb); if (tg==1) { fprintf(f2,"\nPhuong an toi uu la : "); for (i=0; i<=n;i++) fprintf(f2,"\nx[%2d] = %13.5lf",cs[i],s[i][0]); fprintf(f2,"\nSo bang da lap : %d bang",sb); } t= (unsigned long far *)MK_FP(0,0X46C); t2=*t; printf("\nThoi gian chay chuong trinh: %ld giay", (long int)((t2-t1)/18.21)); if (tg==1) fprintf(f2,"\nThoi gian chay chuong trinh: %ld giay", (long int)((t2-t1)/18.21)); fclose(f2); return 0; } else { kgd= cotquay(); if (kgd==1) return 1; printf("\nCot quay = %d, Phan tu quay = %13.5lf",cmin,s[l][cmin]); biendoi(); sb++; printf("\nBang %d, DHDN",sb); if (tg==1) fprintf(f2,"\nBang %d, DHDN",sb); inbang(0); goto Lap0; } }

Sau khi chạy chương trình ta nhận được lời giải tối ưu bài toán là:

x[ 0] = 8.00000

x[ 1] = 3.00000

x[ 2] = 1.00000

x[ 3] = 0.00000

x[ 4] = 0.00000

x[ 5] = 6.00000

x[ 6] = 0.00000

x[ 7] = 0.00000

Số bảng đã lập : 5 bảng

Page 36: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm II.16 Quy hoạch rời rạc

6. BÀI TOÁN QUY HOẠCH TUYẾN TÍNH NGUYÊN

Bài toán sau gọi là bài toán qui hoạch nguyên :

Max xo = ∑=

n

1jjjxc (8)

1

n

ij jj

a x=∑ = bi , i =1,..,m (9)

xj ≥ 0 , i =1,..,n (10)

xj - nguyên, j = 1,..., n1 (n1 ≤ n) (11)

Nếu n1 = n thì bài toán (8) - (11) gọi là bài toán quy hoạch tuyến tính nguyên hoàn toàn. Nếu n1 < n thì bài toán gọi là bài toán quy hoạch nguyên bộ phận. Điều kiện (11) đôi khi viết dưới dạng: xj nguyên j ∈ J ⊂ {1,..., n}.

Bài toán (8) - (10) ký hiệu (L,C), miền xác định L, phương án tối ưu là X(L,C).

Tập hợp các véc tơ X thoả mãn (9) - (11) gọi là miền xác định của bài toán quy hoạch tuyến tính nguyên. Vécc tơ X thoả (9) - (11) được gọi là phương án (hay lời giải chấp nhận được). Phương án X* làm cực đại (8) gọi là phương án tối ưu.

Nếu X = (x1, ..., xn) là phương án (hay phương án tối ưu) và xo = j jc x∑

thì véc tơ X = ( n1o x,...,x,x ) gọi là phương án mở rộng (phương án tối ưu mở rộng).

Ký hiệu:

LN - miền xác định của bài toán (8) - (11)

(LN,C) là bài toán (8) - (11)

X (LN,C) là phương án tối ưu.

X (LN, C) phương án tối ưu mở rộng.

Bài toán quy hoạch tuyến tính nguyên gọi là giải được nếu tồn tại phương án tối ưu X*.

Một đa diện L mà tất cả các đỉnh của nó đều là nguyên (mọi thành phần là nguyên) gọi là đa diện nguyên.

Bảng đơn hình T mà tất cả các phần tử của nó đều là nguyên gọi là bảng đơn hình nguyên.

Page 37: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm II.17 Quy hoạch rời rạc

BÀI TẬP Dùng phương đơn hình hoặc phương pháp đơn hình đối ngẫu từ vựng để giải các

bài toán quy hoạch tuyến tính sau.

1. Một xưởng sản xuất hai loại thép đặc biệt g1 và g2. Một đơn vị sản phẩm loại g1 cần 2 h để nấu chảy, 4 h để luyện và 10 h để cắt định hình; loại g2 cần 5 h để nấu chảy, 1 h để luyện và 5 h để cắt định hình. Lợi nhuận mang đến bởi loại g1 là 24$ và loại g2 là 8$. Khả năng của xưởng có thể bố trí 40 h để nấu chảy, 20h để luyện và 60 h để cắt định hình. Xác định phương án sản xuất mỗi loại thép là bao nhiêu để mang đến cho nhà sản xuất lợi nhuận cao nhất.

2. Một nhà sản xuất hai loại đá xây dựng: loại lớn x1, loại bé x2. Loại x1 cần 2 h để nghiền, 5 h để phân loại, 8 h để làm sạch. Loại x2 cần 6 h để nghiền, 3 h để phân loại, 2 h để làm sạch. Lợi nhuận mang lại từ loại x1 và x2 tương ứng là 40$ và 50$. Khả năng cho phép sử dụng thiết bị trong một tuần là : 36 giờ để nghiền, 30 h để phân loại, 40 giờ để làm sạch. Xác định phương án sản xuất có lợi nhuận cao nhất.

3. Một nhà vườn muốn tạo một hỗn hợp phân bón từ hai loại sản phẩm cơ bản sao cho tối thiểu nhận được 15 đơn vị potasses, 20 đv nitrates, 24 đv phosphates. Loại x1 có giá 120 $ cung cấp được 3 đơn vị potasses, 1 đv nitrates, 3 đv phosphates. Loại x2 có giá 60 $ cung cấp được 1 đơn vị potasses, 5 đv nitrates, 2 đv phosphates. Xác định phương án chọn lựa để cực tiểu hóa chi phí của nhà vườn.

4. Một nghệ sỹ rất quan tâm đến sức khỏe, mong muốn mỗi ngày có được tối thiểu 36 đv vitamin A, 28 đv vitamin C, 32 đv vitamin D. Loại thuốc thứ nhất giá 3$ có thể cung cấp 2 đv vitamin A, 2 đv vitamin C, 8 đv vitamin D. Loại thuốc thứ hai giá 4$ có thể cung cấp 3 đv vitamin A, 2 đv vitamin C, 2 đv vitamin D. Xác định lượng thuốc sử dụng để chi phí của nghệ sỹ này bé nhất.

5. Một nhà sản xuất thiết bị âm nhạc có khả năng chế tạo 3 loại: tiêu chuẩn y1, chất lượng cao y2, chất lượng đặc biệt y3. Loại tiêu chuẩn cần 3 h để lắp ráp mạch điện, 1 h để hoàn chỉnh, lợi nhuận đem lại là 15$. Loại chất lượng cao cần 1 h để lắp ráp mạch điện, 5 h để hoàn chỉnh, lợi nhuận đem lại là 20$. Loại chất lượng đặc biệt cần 3 h để lắp ráp mạch điện, 2 h để hoàn chỉnh, lợi nhuận đem lại là 24$. Khả năng xưởng có thể bố trí 120 h để lắp ráp mạch điện, 60 h để hoàn chỉnh. Xác định phương án sản xuất để cực đại lợi nhuận.

6. Chủ doanh nghiệp có 3000 ha đất để trồng 3 loại nông sản A, B, C. Để sản xuất nông sản A cần chi phí về vốn là 300 ngàn đồng/ha, chi phí về lao động là 500 ngàn đồng/ha, sản lượng thu được trị giá 2000 ngàn đồng/ha. Để sản xuất nông sản B cần chi phí về vốn là 350 ngàn đồng/ha, chi phí về lao động là 400 ngàn đồng/ha, sản lượng thu được trị giá 1500 ngàn đồng/ha. Để sản xuất nông sản C cần chi phí về vốn là 400 ngàn đồng/ha, chi phí về lao động là 450 ngàn đồng/ha, sản lượng thu được trị giá 2500 ngàn đồng/ha. Khả năng chi về vốn của doanh nghiệp là 1,2 tỷ đồng, chi về lao động là 1,6 tỷ đồng. Để đảm bảo các hợp đồng đã ký thì nông sản A cần trồng ít nhất là 600 ha. Cần xác định mỗi nông sản cần trồng bao nhiêu ha để sản lượng thu được là nhiều nhất ?

7. Một trại chăn nuôi gia súc cần mua 3 loại thức ăn tổng hợp T1, T2, T3. Trong 1 kg T1 có 3 đơn vị dinh dưỡng D1, 1 đv dinh dưỡng D2. Trong 1 kg T2 có 4 đơn vị dinh dưỡng D1, 2 đv dinh dưỡng D2. Trong 1 kg T3 có 2 đơn vị dinh dưỡng D1, 3 đv dinh dưỡng D2. Giá 1 kg T1, T2, T3 tương ứng là 15, 12, 10 ngàn đồng. Mỗi bữa ăn cho gia

Page 38: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm II.18 Quy hoạch rời rạc súc cần tối thiểu 160 đv dinh dưỡng d1, 140 đv dinh dưỡng D2. Cần mua mỗi loại thức ăn T1, T2, T3 bao nhiêu kg để chi phí cho một bữa ăn là nhỏ nhất.

8. Min CX, AX = B, X>=0 2 4 3 1 0 0 152 A = 4 2 3 0 1 0 B = 60 3 0 1 0 0 1 36 C = (-5 -4 -5 -2 -1 -3)

9. Tìm x1, x2, x3, x4, x5, x6, x7 >= 0 sao cho 6x1 + x2 + x3 + 3x4 + x5 + -7x6 + 6x7 -> min -x1 + x2 -x4 +x6 + x7 = 15 -2x1 + x3 -2x6 - x7 = 9 4x1 +2x4 + x5 -3x6 = 2

10. Tìm x1, x2, x3, x4, x5 >= 0 sao cho 4x1 + x2 + x3 + 3x4 -> min 2x2 + x3 + x4 = 16 4x2 + 2x5 <= 8 x1 + x2 + 2x4 + x5 = 2

11. Tìm x1, x2, x3, x4, x5 >= 0 sao cho 2x1 + 3x2 - x3 - 4x4 + 6x5 -> max 2x1 + x2 - x3 = 40 5x1 - 2x3 + 2x4 - x5 <= 0 x1 + 2x3 - 4 x4 + x5 >= 12 3x1 + 2x3 + x4 + 2x5 <= 14

12. Tìm x1, x2, x3, x4, x5, x6 >= 0 sao cho 4x1 + 2x2 + 3x3 + 6x4 + 3x5 + 2x6 ---> MIN 3x1 + 6x3 +2x4 + 3x5 = 30 x2 + x3 - 2x4 + x5 + 3x6 = 14 -x1 + 2x3 - x4 + 12 x6 >= 0 -2x1 + x3 + 3x4 + 2x5 + x6 <= 18

13. Tìm x1, x2, x3, x4, x5 >= 0 sao cho x1 + 3x2 - 2 x3 - 5x4 - 3x5 -----> Max x1 - x3 + 2x4 - x5 = 0 3x1 + 4x2 + 4x4 - 3x5 = 40 x1 + 4x2 + 2x4 <= 29 7x1 - 4x2 -10x4 + x5 = -152

Page 39: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm III.1 Quy hoạch rời rạc

Chương 3

THUẬT TOÁN GOMORY THỨ NHẤT Trong chương này sẽ trình bày thuật toán Gomory thứ nhất và chứng minh sự hội tụ của nó.

1. TƯ TƯỞNG PHƯƠNG PHÁP CẮT 1.1. Việc giải bài toán quy hoạch tuyến tính nguyên ( , )NL C có dẫn tới việc giải một bài toán quy hoạch tuyến tính ( , )AC không ?

Định lý 1. Giả sử L là một đa diện lồi, NL là tập các điểm nguyên của nó, ( )NR V L≡ là bao lồi tuyến tính của tập các điểm nguyên NL . Khi đó:

1) ( )NR V L≡ là một đa diện nguyên (các đỉnh đều là nguyên)

2) N NR L= (1)

3) Tập *R các phương án tựa của đa diệnR chứa trong NR :

* NR R⊆ (2)

Chứng minh

1) Chứng minh R là một đa diện nguyên ? Vì L là một đa diện lồi nên NL là tập hữu hạn ⇒ ( )NR V L≡ là tổ hợp lồi tuyến tính của một tập hữu hạn . Vì vậy, R là một đa diện , đồng thời

* NR L⊆ (3)

(tức là R là đa diện nguyên).

2) Chứng minh N NR L= ?

Từ định nghĩa bao lồi tuyến tính suy ra

( )N NL V L R⊆ ≡ ⇒ N NL R⊆ . (4)

Ta phải chứng minh:

N NR L⊆ ? (5)

Thật vậy, giả sử lấy

Nx R∈ , (6)

vì NL L⊆ nên ( )NR V L= ( )V L⊆ L= . Vì vậy

Nx R R L∈ ⊆ ⊆ (7)

Từ (6) và (7) suy ra Nx L∈ (vì x là nguyên thuộc L), vậy (5) được chứng minh.

Từ (4) và (5) suy ra đẳng thức (1) đúng.

3) Chứng minh * NR R⊆ ? Từ (3) và (1) suy ra (2) đúng.

Page 40: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm III.2 Quy hoạch rời rạc

Hệ quả 1. Giả sử ( , )X R C là phương án tựa tối ưu của bài toán ( , )R C , khi đó

( , )X R C cũng là phương án tối ưu của bài toán ( , )NL C . Vì vậy để giải bài toán quy hoạch tuyến tính nguyên( , )NL C ta đi giải bài toán ( , )R C .

1.2. Ta sẽ chứng minh: ( )NR V L= là đa diện nguyên duy nhất mà tập các điểm nguyên của nó trùng với NL .

Định lý 2. Giả sử L là một đa diện lồi, U là một đa diện lồi nguyên và

N NU L= (8)

Khi đó

( )NU R V L= = (9)

Chứng minh. Từ (8) trực tiếp suy ra

R U⊆ (10)

( vì ( ) ( )N NR V L V U U= = ⊆ )

Ta phải chứng minh:

U ⊆ R ? (11)

Vì U là đa diện nguyên (tất cả các đỉnh của nó là nguyên) và (8) nên *U ⊆ N NU L= , suy ra U = *( )V U ⊆ ( )NV L ≡ R . Vậy (11) là đúng..

Từ (10) và (11) ta có điều cần chứng minh (9).

1.3.Ví dụ

Page 41: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm III.3 Quy hoạch rời rạc

BÀI TOÁN( , )NL C BÀI TOÁN( , )L C BÀI TOÁN ( , )NR V L C≡

Max 1x + 2x

1 22 11 38x x+ ≤

1 2 7x x+ ≤

1 24 5 5x x− ≤

0jx ≥

nguyênjx

Max( 1x + 2x )

1 22 11 38x x+ ≤ (a)

1 2 7x x+ ≤ (b)

1 24 5 5x x− ≤ (c)

0jx ≥

Max( 1x + 2x )

2 3x ≤

1 2 5x x+ ≤

1 2 1x x− ≤

0jx ≥

Max=5. Max=7 Max=5

Tối ưu là 2 điểm Tối ưu là một đoạn Tối ưu là đoạn

(2,3); (3,2) [ (133

; 83

); ( 409

; 239

)] [(2,3);(3,2) ]

1.4. Từ Hệ quả 1 chỉ ra khả năng xấp xỉ đúng bài toán ( , )NL C bằng bài toán quy

hoạch tuyến tính ( , )R C nhưng không cho phương pháp xác định bài toán ( )NR V L= . Do đó xuất hiện vấn đề: cho một đa diện lồi L , tìm bao lồi ( )NV L các điểm nguyên của nó? Vấn đề này nói chung cũng khó như chính việc giải bài toán quy hoạch tuyến tính nguyên.

1.5. Khi xây dựng ( )NV L ta đã không sử dụng thông tin về hàm mục tiêu CX của bài toán quy hoạch tuyến tính nguyên. Vậy có nên tìm một bài toán quy hoạch tuyến tính ( , )AC theo bài toán ( , )NL C sao cho thoả mãn 3 điều kiện:

1) ( , )NCX L C = ( , )CX AC (các trị tối ưu trùng nhau) (12)

Page 42: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm III.4 Quy hoạch rời rạc

2) N NA L= ( tập các điểm nguyên bằng nhau ) (11)

3) Tất cả các phương án tựa tối ưu của bài toán quy hoạch tuyến tính ( , )AC đều thoả mãn điều kiện nguyên:

*c NA A A∩ ⊆ (14)

(tong đó cA là tập hợp các phương án tối ưu của bài toán (A,C); *A là tập hợp các đỉnh của đa diện lồi A)

Nói chung, việc xây dựng đa diện lồi A thoả mãn (12) – (14) cũng rất phức tạp và chưa có thuật toán hữu hiệu.

1.6. Khái niệm lát cắt đúng

Giả sử bài toán ( , )NL C là bài toán quy hoạch nguyên nào đó và phương án tựa tối ưu của bài toán quy hoạch tuyến tính tương ứng ( , )X L C không thoả mãn điều kiện nguyên, tức là ( , )X L C NL∉ . Khi đó bất đẳng thức:

j jja x β≤∑ hay aX β≤ (15)

gọi là lát cắt đúng nếu thoả mãn 2 điều kiện:

- Điều kiện cắt: ( , )X L C không thoả mãn (15), tức là ( , )aX L C β>

- Điều kiện đúng: nếu X là phương án của ( , )NL C thì X thoả mãn (15) , tức là

{ }NL X aX β⊂ ≤ .

Nói cách khác, ràng buộc thêm không cắt đi một phương án nguyên nào của bài toán ( , )NL C .

Page 43: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm III.5 Quy hoạch rời rạc

1.7. Tư tưởng phương pháp cắt của Danzig

1. Việc giải ( , )NL C là một quá trình gồm nhiều bước:

a) Ở bước thứr giải bài toán bài toán quy hoạch tuyến tính phụ ( , )rL C , r = 0, 1, … với 0L L=

b) Tập các điểm nguyên của tất cả các đa diện lồi là như nhau

0 1N NL L= =…= N

rL = .............

Do đó, nếu phương án tối ưu ( , )rX L C của bài toán( , )rL C thoả mãn điều kiện nguyên thì nó cũng là phương án tối ưu 0( , )NX L C của bài toán xuất phát 0( , )NL C và quá trình kết thúc.

c) Nếu ( , )rX L C không thoả mãn điều kiện nguyên thì ( , )rX L C không phải là phương án của bài toán 1( , )rL C+ , tức là ( , )rX L C 1rL +∉

2. Chuyển từ bước r sang bước 1r + , tức là chuyển từ bài toán ( , )rL C sang 1( , )rL C+ khi ( , )rX L C không nguyên được thực hiện nhờ một lát cắt đúng r ra x β≤ .

Việc bổ sung lát cắt này vào ràng buộc của bài toán( , )rL C sẽ chuyển đa diện lồi rL thành 1rL + .

Như vậy, phương pháp cắt có hai việc: xấp xỉ tuyến tính nhiều bước đối với bài toán ( , )NL C , chuyển từ bước này sang bước khác nhờ một lát cắt đúng. Có ba vấn đề tồn tại cần giải quyết: xây dựng lát cắt đúng, đảm bảo tính hữu hạn của quá trình giải, số lượng lát cắt đúng không được tăng mãi. Thuật toán Gomory thứ nhất sẽ giải quyết được cả ba vấn đề này một cách hiệu quả.

2. THUẬT TOÁN GOMORY THỨ NHẤT Thuật toán Gomory lần đầu tiên thực hiện phương pháp cắt để giải bài toán quy

hoạch tuyến tính nguyên mà đối với nó việc xây dựng lát cắt đúng được tiến hành một cách thuật toán, việc chứng minh tính hữu hạn của thuật toán cũng dễ dàng hơn.

2.1. Xét bài toán quy hoạch tuyến tính nguyên hoàn toàn

Page 44: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm III.6 Quy hoạch rời rạc

Max 0x =1

n

j jjc x

=∑ (16)

1

n

ij j ija x b

==∑ ( 1,..., )i m= (17)

jx 0≥ (j=1,...,n) (18)

jx nguyên (j=1,...,n) (19)

Giả sử ( , )X L C là phương án tựa tối ưu của bài toán ( , )L C , từ đó ta có thể biểu diễn các biến qua các biến phi cơ sở :

0 ij( )i i jj N

x x x x∈

= + −∑ , ( 0,..., )i n= (20)

Giả sử x là một số thực, ký hiệu [ ]x là phần nguyên (số nguyên lớn nhất không vượt quá x), { } [ ]x x x= − là phần lẻ. Ví dụ [-1.3] = -2, {-1.3} = 0.7, {1.3} = 0.3.

Định lý 3. Giả sử X(L,C) có 0ix không nguyên với 1 i n≤ ≤ và:

1) { } { }0 ij( ) ( )( )i i i jj N

z z X x x x∈

≡ = − + − −∑ , ( 1, 2,...., )i n= (21)

2) X là phương án của bài toán ( , )NL C

Khi đó:

a) iz nguyên (22)

b) iz 0≥ . (23)

Chứng minh. a) Chứng minh iz nguyên ? Từ (20) ta có:

[ ] { } [ ] { }0 0 ij ij( )( )i i i jj N

x x x x x x∈

= + + + −∑

Kết hợp với (21) suy ra [ ] [ ]0 ij ( )i i i jj N

z x x x x∈

= − + + −∑ . Do giả thiết 2) ta có ix , jx

nguyên, nên từ biểu thức trên suy ra iz nguyên.

b) Chứng minh iz ≥0. Giả sử phản chứng iz < 0 , từ (21) ta có:

{ } { }0 ij( ) ( )( ) 0i i i jj N

z z x x x x∈

≡ = − + − − <∑

Vì { }0ix− > -1 ; jx ≥0 và { }ijx [ )0,1∈ nên 1 0iz− < < , tức là iz không nguyên. Điều này mâu thuẫn với chứng minh câu a), do đó iz 0≥ .

Chú ý, nếu 0x được đảm bảo tính nguyên (chẳng hạn mọi jc đều là nguyên) thì Định lý 3 cũng đúng với 0i = .

Page 45: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm III.7 Quy hoạch rời rạc

Hệ quả 2. Giả sử ( , )X L C không thoả mãn điều kiện nguyên (19), như vậy đối với i nào đó (1≤ i ≤n) 0ix không nguyên . Khi đó các hệ thức (21) và (23) xác định một lát cắt đúng.

Chứng minh.

a) Mọi phương án của bài toán ( , )NL C đều thoả mãn (21) và (23) (trong chứng minh định lý), do đó điều kiện đúng của lát cắt được thoả mãn.

b) Đặt vào (21) phương án tối ưu không nguyên ( , )X L C . Do ( , )jx L C =0, j N∈ , suy ra { }0( ( , )) 0 0i iz X L C x= − + < , trái với (23), tức là điều kiện cắt thoả mãn.

2.2. Trong lược đồ phương pháp cắt ở trên, vì bài toán ( , )rL C có thể có nhiều lời giải nên ( , )rX L C không duy nhất. Gomory giải bài toán ( , )rL C thay cho bài toán( , )rL C , do đó phương án l - tối ưu ( , )rX L C là tựa và xác định duy nhất, các tính toán trên tiến hành nhờ l - phương pháp.

2.3. Trong phương pháp cắt vấn đề quan trọng là việc tăng số lượng ràng buộc. Gomory đặt kích thước hạn chế cho bảng đơn hình mở rộng bằng số (n+2) x (k+1). Các ràng buộc r ra X β≤ chỉ là phương pháp để cắt phương án tối ưu không nguyên

( , )rX L C và chuyển từ bài toán ( , )rL C sang bài toán 1( , )rL C+ . Chú ý rằng biến 1n rx + + ( 0r ≥ ) lập tức đưa ra khỏi cơ sở sau khi đưa vào ràng buộc :

1

1 0n r r r

n r

x a X

x

β+ +

+ +

= − ≥

Tư tưởng của Gomory như sau:

- Ngay sau khi 1n rx + + đưa ra khỏi cơ sở dòng tương ứng xoá khỏi bảng đơn hình mở rộng.

- Nếu trong qúa trình tính toán tiếp theo 1n rx + + lại đưa vào cơ sở thì dòng tương ứng trong bảng đơn hình không được khôi phục và 1n rx + + không tham gia vào các tính toán tiếp theo. Như vậy ở bước lặp bất kỳ của tính toán, bảng đơn hình bao gồm (k+1) cột như bảng đơn hình xuất phát, số lượng các dòng không vượt quá n+2. Suy ra cỡ của bảng không vượt quá (n+2) x (k+1).

2.4. Nếu bài toán ( , )L C không có lời giải vì hàm mục tiêu 0x CX= không bị chặn trên khúc lồi L thì thuật toán Gomory thứ nhất không áp dụng được.

Thuật toán Gomory cũng không áp dụng được trong trường hợp bài toán ( , )L C có lời giải nhưng l - bài toán ( , )L C không có lời giải. Điều đó dường như là tập hợp các phương án tối ưu của bài toán( , )L C khác trống nhưng không bị chặn .

Page 46: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm III.8 Quy hoạch rời rạc

Về sau ta sẽ giả thiết :

1) 0x CX≡ bị chặn trên trênL

2) Nếu tập hợp các phương án tối ưu của ( , )L C khác trống thì nó phải bị chặn, tức là nếu bài toán( , )L C giải được thì bài toán ( , )L C cũng giải được

2.5. Thuật toán Gomory thứ nhất Bước lặp ban đầu.

Giải bài toán ( , )L C ≡ 0( , )L C nhờ l - phương pháp, nếu nó không giải được thì bài toán 0( , )NL C cũng không giải được .

Nếu bài toán 0( , )L C giải được và 0( , )X L C thoả mãn điều kiện nguyên thì

0( , )X L C là phương án tối ưu của bài toán nguyên ban đầu 0( , )NL C . Nếu không thoả mãn điều kiện nguyên thì chuyển sang bước 0r = .

Bước lặp 0r ≥ .

Giả sử ( , )rX L C không thoả mãn điều kiện nguyên thì ta biểu diễn 0x CX≡ và 1 2, ,..., nx x x qua các biến phi cơ sở ( )j rx j N∈ . Ta có:

rij( )

r

ri io j

j Nx x x x

∈= + −∑ , 0,1,...,i n= .

Ta nhận được bảng đơn hình: 0rij ,n r

r i Q j NT x ∈ ∈= là chấp nhận được và l - chuẩn.

Chọn dòng đầu tiên ứng với thành phần không nguyên:

k { }{ }min 1.. , không nguyênrioi i n x= ∈

và xây dựng lát cắt đúng:

{ } { }( )( )r1 0 kj

1

1

0

nguyên

rn r jk

j Nr

n r

n r

x x x x

x

x

+ +∈

+ +

+ +

= − + − − ≥

∑ (24)

Page 47: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm III.9 Quy hoạch rời rạc

Viết dòng thứ nhất của (24) vào cuối bảng đơn hình rT . Ta được bảng đơn hình không chấp nhận được (chỉ với 1n rx + + ) và l - chuẩn. Dùng l -phương pháp đối với bảng này, đồng thời sau khi đưa khỏi cơ sở 1n rx + + thì dòng tương ứng 1n r+ + bị xoá, sau khi đưa vào cơ sở lx ( 1l r≥ + ) thì dòng tương ứng không được khôi phục. Nếu cuối cùng ta nhận được bảng đơn hình ứng với bài toán quy hoạch tuyến tính không giải được thì bài toán 0( , )NL C cũng không giải được .

Nếu ta nhận được bảng 1rT + chấp nhận được và l - chuẩn thì kiểm tra tính nguyên của 1( , )rX L C+ . Nếu 1( , )rX L C+ thoả mãn điều kiện nguyên thì nó đồng thời là phương án tối ưu của bài toán 0( , )NL C , nếu không thoả mãn thì chuyển sang bước r+1.

3. TÍNH HỮU HẠN CỦA THUẬT TOÁN GOMORY THỨ NHẤT Giả sử tập các phương án tối ưu của bài toán 0( , )L C là bị chặn.

Định lý 4. Giả sử có các điều kiện sau:

1) Tính nguyên của hàm mục tiêu 0x CX≡ được đảm bảo và 0x được xét khi chọn dòng xây dựng lát cắt đúng.

2) Một trong các khẳng định sau là đúng:

i) Hàm mục tiêu 0x bị chặn dưới trên 0L .

ii) Bài toán 0( , )NL C có ít nhất một phương án 'X .

Khi đó thuật toán Gomory thứ nhất kết thúc sau một số hữu hạn bước lặp lớn.

Trước khi chứng minh định lý ta cần chứng minh ba bổ đề. Giả sử ( , )rX L C 0 1( , ,..., )r r r r

nX x x x≡ ≡ . Kí hiệu rX là giả phương án ứng với bảng rT nhận được từ bảng rT sau khi loại khỏi cơ sở 1n rx + + và xoá dòng tương ứng .

Bổ đề 1. Ta có: 1rr rX X X +> ≥ .

Bất đẳng thức đầu tiên suy ra từ công thức biến đổi bảng đơn hình và tính l - chuẩn của bảng đơn hình (cột đầu tiên của rT được tính theo công thức

{ }{ }

00

( ). ,

( )

rkr r r

l lrkl

xR R R

x

−−

− có số đầu tiên khác 0 là dương). Bất đẳng thức thứ hai là do cột

0 giảm khi dùng phương pháp đơn hình đối ngẫu từ vựng.

Bổ đề 2. Các số ( 0,1,..., )rix i n= bị chặn dưới.

Chứng minh. Với i = 1, ..., n điều đó suy ra từ điều kiện không âm 0jx ≥ ( 1,..., )j n= . Với 0i = điều đó suy ra từ điều kiện 2) của định lý 4. Thật vậy,

nếu i) là đúng thì bổ đề 2 là hiển nhiên đúng. Nếu điều kiện ii) được thoả mãn thì 'rX X≥ suy ra '

0 0rx x≥ .

Bổ đề 3. Nếu rX không thoả mãn điều kiện nguyên và 0r rp px x≡ không nguyên

thì:

Page 48: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm III.10 Quy hoạch rời rạc

[ ]0 1 1 0( , ,..., , ) ( ,..., )r r r r r rpp px x x x x x− ≥ .

Chứng minh Giả sử k { }{ }min 0,1,..., , không nguyênr

ioi i n x= ∈ , suy ra k p≤ . Giả sử

{ } { } { }lex min , 0rrj rl

rr kjrkl kj

RRj N x

x x

= ∈ ≠

(dòng quay là lát cắt mới thêm) và { }{ }( ) min i i 0,1,...n ; 0r rl ilh R x= ∈ ≠ ( hàng đầu

tiên của cột lR có hệ số 0≠ , cụ thể là 0rhlx > do 0r

lR > ).

Vì { } 0 0 ( )r r rkl kl lx x h R k p≠ ⇒ ≠ ⇒ ≤ ≤ . Có hai khả năng xảy ra:

1) ( )rlh R q p≡ < .

2) ( )rlh R q p≡ = .

Trong trường hợp 1) theo quy tắc của l -phương pháp rrq qx x< vì { }{ }

0 (do 0)r

r r r rr kq q qr ql qlkl

xx x x x x

x= − < > , và bổ đề được chứng minh.

Trong trường hợp 2) ta có ( )rlh R k p= = . Vì vậy 00rriix x= với ( )rli k h R< =

(h là chỉ số đầu tiên rhlx khác không) và

{ }{ }

00 0

rr rr k

rk k klkl

xx x x

x= − .

Vì rklx = 0rhlx > , nên { }r r

kl klx x≥ . Từ đó ta có :

{ } [ ]0 0 0 0r r rr

k k k kx x x x≤ − = .

Do k = p nên bổ đề được chứng minh.

Chứng minh định lý 4 Giả sử dãy :

0 1, ,..., ,...rX X X vô hạn (25)

Khi đó theo Bổ đề 1 và Bổ đề 2 tồn tại 0i , 00 i n≤ ≤ ; tồn tại 0 0r ≥ và một dãy vô hạn :

1 2 1 0... ...( )r r r r rν< < < < ≥ (26)

sao cho ta có :

1r riix x+ = ; 0r r≥ ; 00 1i i≤ ≤ − (27)

0 0

1r ri ix xν ν+ < ,(ν = 1,2,...) (28)

Từ Bổ đề 1 và (27) ta có

001

0,r riix x r r+ ≤ ≥ (29)

Page 49: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm III.11 Quy hoạch rời rạc

Từ (28), (29) và bổ đề 2 suy ra tồn tại số '0r r> và các số nguyên 0z và 0z +1

sao cho:

00 0 1riz x z< < + , '( )r r≥ (30)

Từ (27), (30) và Bổ đề 3 suy ra: [ ]00 01

0r rr

ii ix x x z+ ≤ ≤ = . Điều này là mâu thuẫn với (30), định lý được chứng minh.

4. GIẢI VÍ DỤ SỐ Giải bài toán sau bằng thuật toán Gomory thứ nhất:

Max 3210 2 xxxx −+=

82 321 ≤−+ xxx

94 321 ≤++ xxx (31)

322 321 ≤+−− xxx

63 321 ≤−− xxx

01 ≥x , 02 ≥x , 03 ≥x

321 ,, xxx nguyên.

Sau khi thêm biến bù bài toán viết lại thành:

Max 3210 2 xxxx −+=

3214 28 xxxx +−−=

3215 49 xxxx −−−= (32)

3216 223 xxxx −++=

3217 36 xxxx ++−=

0,,,,, 7654321 ≥xxxxxxx , ;

7654321 ,,,,, xxxxxxx nguyên.

Từ đây ta có bảng đơn hình xuất phát. Vì bảng đơn hình xuất phát không là l-

chuẩn ta phải thêm ràng buộc phụ: 100321 =≤++ gzxxx hay

0100 3218 ≥−−−= xxxx và 08 ≥x và viết vào phía dưới bảng 1.

Bảng đơn hình xuất phát sau khi thêm ràng buộc phụ:

Page 50: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm III.12 Quy hoạch rời rạc

Bảng 1 x8 100.00000 1.00000 1.00000* 1.00000

Thực hiện một bước của đơn hình đối ngẫu từ vựng ta được bảng 2 là l- chuẩn.

Bảng 2

Tiếp tục dùng thuật toán đơn hình đối ngẫu từ vựng giải bài toán phụ quy hoạch

tuyến tính cho đến tối ưu ta được các bảng 3, bảng 4, bảng 5, bảng 6.

Bảng 3

1 - x1 -x2 -x3

x0 0.00000 -1.00000 -2.00000 1.00000

x1 0.00000 -1.00000 0.00000 0.00000

x2 0.00000 0.00000 -1.00000 0.00000

x3 0.00000 0.00000 0.00000 -1.00000

x4 8.00000 2.00000 1.00000 -1.00000

x5 9.00000 1.00000 4.00000 1.00000

x6 3.00000 -1.00000 -2.00000 2.00000

x7 6.00000 3.00000 -1.00000 -1.00000

1 - x1 -x8 -x3

x0 200.00000 1.00000 2.00000 3.00000

x1 0.00000 -1.00000 - 0.00001 0.00000

x2 100.00000 1.00000 1.00000 1.00000

x3 0.00000 0.00000 -0.00001 -1.00000

x4 -92.00000 1.00000 -1.00000 -2.00000*

x5 -391.00000 -3.00000 -4.00000 -3.00000

x6 203.00000 1.00000 2.00000 4.00000

x7 106.00000 4.00000 1.00000 0.00000

1 - x1 -x8 -x4

x0 62.00000 2.50000 0.50000 1.50000

x1 0.00000 -1.00000 - 0.00001 0.00000

x2 54.00000 1.50000 0.50000 0.50000

x3 46.00000 -0.50000 0.50000 -0.50000

x4 0.00000 0.00000 0.00000 -1.00000

x5 -253.00000 -4.50000 -2.50000* -1.50000

x6 19.00000 3.00000 0.00000 2.00000

x7 106.00000 4.00000 1.00000 0.00000

Page 51: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm III.13 Quy hoạch rời rạc

1 - x1 -x5 -x4

x0 11.40000 1.60000 0.20000 1.20000

x1 0.00000 -1.00000 - 0.00001 0.00000

x2 3.40000 0.60000 0.20000 0.20000

x3 -4.60000 -1.40000* 0.20000 - 0.80000

x4 0.00000 -0.00001 0.00000 -1.00000

x5 0.00000 0.00000 -1.00000 0.00000

x6 19.00000 3.00000 0.00000 2.00000

x7 4.80000 2.20000 0.40000 -0.60000

Bảng 4

Bảng 5

Tám dòng đầu của bảng 6 là bảng đơn hình l- chuẩn và chấp nhận được.

Do x0 lẻ nên từ dòng 0 sinh lát cắt ở dòng x9 theo công thức (24) và ta được bảng 6.

Chọn dòng x9 làm dòng quay

Bảng 6

x9 -0.76923 -0.38462 -0.53846 * -0.15385

1 - x3 -x5 -x4

x0 6.14286 1.14286 0.42857 0.28571

x1 3.28571 -0.71429 -0.14286 0.57143

x2 1.42857 0.42857 0.28571 -0.14286

x3 0.00000 -1.00000 0.00000 0.00000

x4 0.00000 0.00000 0.00000 -1.00000

x5 0.00000 0.00000 -1.00000 0.00000

x6 9.14286 2.14286 0.42875 0.28571

x7 -2.42857 1.57143 0.71429 -1.85714*

1 - x3 -x5 -x7

x0 5.76923 1.38462 0.53846 0.15385

x1 2.53846 -0.23077 0.07692 0.30769

x2 1.61538 0.30769 0.23077 -0.07692

x3 0.00000 -1.00000 0.00000 0.00000

x4 1.30769 -0.84615 -0.38462 -0.53846

x5 0.00000 0.00000 -1.00000 0.00000

x6 8.76923 2.38462 0.53846 0.15385

x7 0.00000 0.00000 0.00000 -1.00000

Page 52: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm III.14 Quy hoạch rời rạc

Thực hiện một bước của thuật toán đơn hình đối ngẫu từ vựng ta được bảng đơn

hình l- chuẩn và chấp nhận được. Biến x1 lẻ nên từ dòng x1 sinh ra lát cắt ở dòng x10 .

Bảng 7 x10 -0.42857 -0.71429 -0.14286 -0.28571 *

Thực hiện một bước của thuật toán đơn hình đối ngẫu từ vựng ta được bảng đơn

hình l- chuẩn và chấp nhận được. Biến x2 lẻ nên từ dòng x2 sinh ra lát cắt ở dòng x11 .

Bảng 8 x11 -0.50000 -0.50000 -0.50000 -0.50000*

Thực hiện một bước của thuật toán đơn hình đối ngẫu từ vựng ta được bảng đơn

hình l- chuẩn và chấp nhận được, có cột phương án là nguyên và quá trình lặp kết thúc.

1 - x3 -x9 -x7

x0 5.00000 1.00000 1.00000 0.00000

x1 2.42857 -0.28571 0.14286 0.28571

x2 1.28571 0.14286 0.42857 -0.14286

x3 0.00000 -1.00000 0.00000 0.00000

x4 1.85714 -0.57143 -0.71429 -0.42857

x5 1.42857 0.71429 -1.85714 0.28571

x6 8.00000 2.00000 1.00000 0.00000

x7 0.00000 0.00000 0.00000 -1.00000

1 - x3 -x9 -x10

x0 5.00000 1.00000 1.00000 0.00000

x1 2.00000 -1.00000 0.00000 1.00000

x2 1.50000 0.50000 0.50000 -0.50000

x3 0.00000 -1.00000 0.00000 0.00000

x4 2.50000 0.50000 -0.50000 -1.50000

x5 1.00000 0.00000 -2.00000 1.00000

x6 8.00000 2.00000 1.00000 0.00000

x7 1.50000 2.50000 0.50000 -3.50000

Page 53: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm III.15 Quy hoạch rời rạc

Bảng 9

Vậy phương án tối ưu là ( 1; 2; 0; 4; 0; 8; 5) với trị hàm mục tiêu x[0]=5

5. CHƯƠNG TRÌNH MÁY TÍNH • Thuật toán này dùng để giải bài toán quy hoạch tuyến tính nguyên hoàn toàn, có

dạng:

max1

0 →=∑=

j

m

jj xcx

ij

m

jij bxa ≤∑

=1, pi ,...,1=

0≥jx và nguyên , mj ,...,2,1=

các b[i] có thể dương và âm, phương án xuất phát có thể không đối ngẫu chấp nhận

được. Nếu bài toán giải có ràng buộc đẳng thức dạng: ii

m

jij bxa =∑

=1 thì ta thay thế bằng

hai bất đẳng thức: ii

m

jij bxa ≤∑

=1và ii

m

jij bxa ≥∑

=1.

Sau khi thêm biến bù bài toán trên có thể viết ở dạng:

max))((1

0 →−−=∑=

m

jjj xcx

mjxx jj ,...,2,1))(1( =−−=

.,...,2,1))((1

pixabx j

m

jijiim =−−+= ∑

=+

1 - x3 -x9 -x11

x0 5.00000 1.00000 1.00000 0.00000

x1 1.00000 -2.00000 -1.00000 2.00000

x2 2.00000 1.00000 1.00000 -1.00000

x3 0.00000 -1.00000 0.00000 0.00000

x4 4.00000 2.00000 1.00000 -3.00000

x5 0.00000 -1.00000 -3.00000 2.00000

x6 8.00000 2.00000 1.00000 0.00000

x7 5.00000 6.00000 4.00000 -7.00000

Page 54: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm III.16 Quy hoạch rời rạc

.,...,2,10 pmjx j +=≥

jx nguyên. .,...,2,1 pmj +=

•Trong chương trình sử dụng các biến và mảng sau:

- m: số biến chính, n: số biến chính và biến bù của bài toán (n=m+p), gz là một

số dương đủ lớn và thường lấy bằng },,{max jiij cba .

- x0 =0 nếu có kể x0 nguyên và bằng 1 nếu x0 không cần nguyên.

- ss = 1 nếu bảng đơn hình s ban đầu là l- chuẩn và chấp nhận được , = 2 nếu

bảng là l- chuẩn và không chấp nhận được, =3 nếu bảng không là l - chuẩn

- Mảng s gồm n + 2 dòng và m+1 cột lúc đầu ghi dữ liệu của bài toán sau đó lưu

bảng đơn hình ở mỗi bước. Dòng n+1 để chứa ràng buộc phụ.

- s[0][0] hàm mục tiêu, cột 0 là cột phương án, dòng 0 là các ước lượng

- cs : các biến ở bên trái bảng đơn hình, nc : các biến phi cơ sở

•Cách nhập dữ liệu

Dữ liệu ban đầu của bài toán được ghi trong một tệp văn bản, gồm có :

- n, m, gz, x0, ss.

- Mảng s dữ liệu ban đầu bố trí dạng ở dưới và được ghi vào tệp dữ liệu theo từng

dòng :

- Tiếp đến là mảng cs: nhập các số từ 0, 1, 2,…, n.

- Cuối cùng là mảng nc: nhập các số từ 1, 2,…, m.

• Với dữ liệu bài toán (31) thì tệp dữ liệu VDG1.sli, có dạng:

-x1 -x2 . . . . . . . . . –xm

0 -c1 -c2 . . . . . . . . –cm x0

x1

x2

xm

0

0

0

-1 0 . . . . . . . . . . 0

0 -1 . . . . . . . . . 0

0 0 . . . . . . . . . . -1

xm+1

xn

b1

bp

-a11 . . . . . . . . . - a1m

-ap1 . . . . . . . . . .-apm

Page 55: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm III.17 Quy hoạch rời rạc

7 3 100 0 3

0 -1 -2 1

0 -1 0 0

0 0 -1 0

0 0 0 -1

8 2 1 -1

9 1 4 1

3 -1 -2 2

6 3 -1 -1

0 1 2 3 4 5 6 7

1 2 3

• Văn bản chương trình

#include <stdio.h>

#include <conio.h>

#include <math.h>

#include <dos.h>

#define M 30

#define N 30

double s[N+2][M+1],r,gz;

int kgd,kgd2,blap,blap2,sb,cmin,x0,ss;

int m,n,i,j,k,l,le,lc,tg,cs[N+2],nc[M+1];

unsigned long far *t; long int t1,t2;

char *s1,*s2; FILE *f1,*f2;

int ktnguyen(double x);

int cotquay();

void biendoi();

void inbang(int cuoi);

int dhdoingau();

void main()

{ clrscr();

t= (unsigned long far *)MK_FP(0,0X46C); t1=*t;

printf("\nCo in trung gian hay khong 1/0 ? ");

scanf("%d%*c",&tg);

// Nhap du lieu

printf("\nVao ten tep so lieu : "); gets(s1);

Page 56: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm III.18 Quy hoạch rời rạc

f1= fopen(s1,"r"); fscanf(f1,"%d%d%lf%d%d",&n,&m,&gz,&x0,&ss);

for (i=0;i<=n;i++) for (j=0; j<=m;j++)

{ fscanf(f1,"%lf",&r); s[i][j]=r; }

for (i=0; i<=n;i++) fscanf(f1,"%d",&cs[i]) ;

for (j=1; j<=m; j++) fscanf(f1,"%d",&nc[j]);

fclose(f1);

sb=1; blap=0;

// In du lieu nhap de kiem tra

printf("\nn,m,ep,gz,x0,ss = %d %d %13.5lf %d %d",n,m,gz,x0,ss);

if (tg==1){ printf("\nVao ten tep chua ket qua : "); gets(s2);

f2=fopen(s2,"w");

fprintf(f2,"\nn,m,ep,x0,ss = %d %d %13.5lf %d %d",n,m,gz,x0,ss);

}

printf("\nBang 1, so lieu ban dau");

if (tg==1) fprintf(f2,"\nBang 1, so lieu ban dau");

inbang(0);

if (ss==1){

printf("\nBang 1, so lieu ban dau, l- chuan, chap nhan duoc");

if (tg==1)

fprintf(f2,"\nBang 1, so lieu ban dau, l- chuan, chap nhan duoc");

lc = n; goto Lap1;}

if (ss==2){ printf("\nBang 1, so lieu ban dau, l- chuan, khong chap nhan duoc, chay ngay DHDN");

if (tg==1) fprintf(f2,"\nBang 1, so lieu ban dau, l- chuan, khong chap nhan duoc, chay ngay DHDN");

goto L1;}

// Them rang buoc phu

sb=1; cs[n+1]=n+1; s[n+1][0]=gz;

for (j=1;j<=m; j++) s[n+1][j]=1;

printf("\nBang 1, so lieu ban dau them rang buoc phu");

if (tg==1) fprintf(f2,"\nBang 1, so lieu ban dau them rang buoc phu");

inbang(1);

l=n+1; // dong quay la dong cuoi cung

// Xac dinh cot quay

cmin=1;

for (j=2;j<=m;j++)

Page 57: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm III.19 Quy hoạch rời rạc

{ for (i=0; i<=n;i++)

{ if (s[i][cmin] > s[i][j]) {cmin=j; break;}

if (s[i][cmin] < s[i][j]) break;

}

}

printf("\nDong quay= %d, Cot quay= %d, Phan tu quay= %13.5lf", l,cmin,s[l][cmin]);

if (tg==1) { fprintf(f2,"\nDong quay= %d, Cot quay = %d, Phan tu quay= %13.5lf",

l,cmin,s[l][cmin]);

}

biendoi(); sb++;

printf("\nBang %d, l- chuan dau tien",sb);

if (tg==1) fprintf(f2,"\nBang %d, l- chuan dau tien",sb);

inbang(0);

L1: kgd2= dhdoingau();

if (kgd2==1) {

printf("\nBai toan phu khong giai duoc, STOP");

if (tg==1) fprintf(f2,"\nBai toan phu khong giai duoc, STOP");

getch(); getch(); return;

}

lc=n+1;

// Tim xong bang l- chuan + chap nhan duoc, sang Buoc lap lon

Lap1: blap = blap+1;

printf("\n-------------------------------------------------");

printf("\n\nBUOC LAP LON THU %d: ",blap);

if (tg==1)

{ fprintf(f2,"\n----------------------------------------------");

fprintf(f2,"\n\nBUOC LAP LON THU %d: ",blap);}

// Kiem tra loi giai toi uu bai toan phu co nguyen khong

le=-1;

for (i=x0; i<=n; i++)

if (ktnguyen(s[i][0])==0) {le = i; break; }

printf("\nThanh phan le thuoc dong = %d",le);

if (tg==1) fprintf(f2,"\nThanh phan le thuoc dong = %d",le);

if (le==-1) {

printf("\nPHUONG AN TOI UU QHTT NGUYEN: ");

if (tg==1) fprintf(f2,"\nPHUONG AN TOI UU QHTT NGUYEN: ");

for (i=0; i<=n;i++)

Page 58: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm III.20 Quy hoạch rời rạc

printf("\nx[%2d] = %13.5lf",cs[i],s[i][0]);

printf("\nSo luong lat cat: %d lat cat",blap-1);

printf("\nSo bang don hinh da lap : %d bang",sb);

if (tg==1){ for (i=0; i<=n;i++)

fprintf(f2,"\nx[%2d] = %13.5lf",cs[i],s[i][0]);

fprintf(f2,"\nSo luong lat cat: %d lat cat",blap-1);

fprintf(f2,"\nSo bang don hinh da lap : %d bang",sb);

}

t= (unsigned long far *)MK_FP(0,0X46C);

t2=*t;

printf("\nThoi gian chay chuong trinh: %ld giay", (long int)((t2-t1)/18.21));

if (tg==1) fprintf(f2,"\nThoi gian chay chuong trinh: %ld giay",

(long int)((t2-t1)/18.21));

fclose(f2); getch();

return;

}

// Tao lat cat moi va ghi vao cuoi bang

lc++;

cs[n+1]=lc;

for (j=0; j<=m; j++)

{ if (ktnguyen(s[le][j])) s[n+1][j]=0;

else s[n+1][j]= -(s[le][j]- floor(s[le][j])); }

printf("\nBang %d, sau khi them lat cat",sb);

if (tg==1) fprintf(f2,"\nBang %d, sau khi them lat cat",sb);

inbang(1);

// Xac dinh dong quay va cot quay

l=n+1 ;

printf("\nDong quay = %d",l);

if (tg==1) fprintf(f2,"\nDong quay = %d",l);

cotquay();

printf("\nCot quay = %d, Phan tu quay = %13.5lf",cmin,s[l][cmin]);

if (tg==1)

fprintf(f2,"\nCot quay = %d, Phan tu quay = %13.5lf",cmin,s[l][cmin]);

// Bien doi bang don hinh

biendoi(); sb++;

printf("\nBang %d, bang dau tien bai toan phu",sb);

if (tg==1) fprintf(f2,"\nBang %d, bang dau tien bai toan phu",sb);

Page 59: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm III.21 Quy hoạch rời rạc

inbang(0);

kgd2= dhdoingau();

if (kgd2==1) {

printf("\nBai toan phu khong giai duoc");

if (tg==1) fprintf(f2,"\nBai toan phu khong giai duoc, STOP");

getch(); getch(); return;

}

goto Lap1;

}

int ktnguyen(double x)

{ long int h; double z; z=fabs(x); h=(int)(z+0.5);

if (fabs(z-h)<=0.0001) return 1; else return 0;

}

int cotquay()

{ k=0;

for (j=1; j<=m; j++) if (s[l][j]<-0.000001) { k=j; break;}

if (k==0) return 1;

cmin=k;

for (j=k+1;j<=m;j++) if (s[l][j]< -0.000001)

{ // so sanh cot cmin voi cot j, neu j < cmin thi cmin = j

for (i=0; i<=n;i++)

{ double t1,t2;

t1= s[i][cmin]/fabs(s[l][cmin]); t2=s[i][j]/fabs(s[l][j]);

if (t1 > t2) {cmin=j; break;}

if (t1 < t2) break;

}

}

return 0;

}

void biendoi()

{ for (j=0;j<=m;j++) if (j!= cmin)

{ for (i=0;i<=n;i++) if (i!=l) s[i][j]=s[i][j]-(s[l][j]/s[l][cmin])*s[i][cmin];

s[l][j]=0;

}

for (i=0;i<=n;i++) if (i!=l) s[i][cmin]=-s[i][cmin]/s[l][cmin];

s[l][cmin]=-1;

nc[cmin]=cs[l];

Page 60: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm III.22 Quy hoạch rời rạc

}

void inbang(int cuoi)

{ int n1; if (cuoi==1) n1=n+1; else n1=n;

printf("\nCo so : ");

for (i=0; i<=n1;i++) printf("%d ",cs[i]) ; printf("\n");

printf("Phi co so : ");

for (j=1; j<=m; j++) printf("%d ",nc[j]);printf("\n");

for (i=0;i<=n1;i++) { for (j=0; j<=m;j++)

printf(" %10.5lf ",s[i][j]);

printf("\n"); }

if (tg==1) {

fprintf(f2,"\nCo so : ");

for (i=0; i<=n1;i++) fprintf(f2,"%d ",cs[i]) ; fprintf(f2,"\n");

fprintf(f2,"Phi co so : ");

for (j=1; j<=m; j++) fprintf(f2,"%d ",nc[j]);fprintf(f2,"\n");

for (i=0;i<=n1;i++) { for (j=0; j<=m;j++)

fprintf(f2," %13.5lf ",s[i][j]);

fprintf(f2,"\n"); }

}

getch();

}

int dhdoingau()

{ blap2 =0;

Lap2: blap2++;

printf("\nBuoc lap Don hinh doi ngau thu %d : ",blap2);

if (tg==1) fprintf(f2,"\nBuoc lap Don hinh doi ngau thu %d : ",blap2);

l=-1;

for (i=1;i<=n;i++) if (s[i][0]<0) {l=i; break;}

printf("\nDong quay %d ",l);

if (tg==1) fprintf(f2,"\nDong quay = %d",l);

if (l==-1) {

printf("\nBang tren ung phuong an toi uu cua bai toan phu");

if (tg==1) fprintf(f2,"\nBang tren ung phuong an toi uu bai toan phu");

return 0;

}

else { kgd=cotquay();

Page 61: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm III.23 Quy hoạch rời rạc

if (kgd==1) return 1;

printf("\nCot quay = %d, Phan tu quay = %13.5lf",cmin,s[l][cmin]);

if (tg==1) fprintf(f2,"\nCot quay = %d, Phan tu quay = %13.5lf", cmin,s[l][cmin]);

biendoi(); sb++;

printf("\nBang %d, DHDN",sb);

if (tg==1) fprintf(f2,"\nBang %d, DHDN",sb);

inbang(0);

goto Lap2;

}

} • Sau khi chạy chương trình ta nhận được lời giải tối ưu của bài toán (31) là:

x[ 0] = 5.00000

x[ 1] = 1.00000

x[ 2] = 2.00000

x[ 3] = 0.00000

x[ 4] = 4.00000

x[ 5] = 0.00000

x[ 6] = 8.00000

x[ 7] = 5.00000

Số lượng lát cắt: 3 lát cắt.

Số bảng đã lập :9 bảng.

BÀI TẬP Giải các bài toán quy hoạch tuyến tính nguyên hoàn toàn sau bằng thuật toán

Gomory thứ nhất

Bài 1. Max 210 xxx +=

38112 21 ≤+ xx

721 ≤+ xx

554 21 ≤− xx

0;0 21 ≥≥ xx

21, xx nguyên.

Đáp số: ( x0, x1, x2, x3, x4, x5) = (5, 3, 2, 10, 2, 3), dùng 4 lát cắt, 12 bảng.

Bài 2. x0 = x1 + 4 * x2 ----> Max

Page 62: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm III.24 Quy hoạch rời rạc

- x1 + 2 * x2 <= 2

3* x1 + 2 * x2 <= 6

x1, x2 => 0 và nguyên

Đáp số : ( x0, x1, x2, x3, x4) = ( 5; 1; 1; 1; 1 ), dùng 2 lát cắt, 6 bảng.

Bài 3. Max x0 = 3 * x1 + 4 * x2

3 * x1 + 2 * x2 <= 8

x1 + 4 * x2 <= 10

x1, x2 => 0 và nguyên

Đáp số : ( x0, x1, x2, x3, x4) = ( 11; 1; 2; 1; 1 ), dùng 4 lát cắt , 9 bảng.

Bài 4. Tìm Max (C, X) : AX <= B, X => 0 và nguyên.

-1 8 -4 6 -5 20

9 -7 1 -2 4 15

A = 1 1 1 1 1 B = 25

-2 -4 -3 -5 -1 -26

3 2 -6 -7 1 -10

C = ( 2 -4 7 -5 3 )

Đáp số : (x0, x1, x2, x3, x4, x5) = ( 153 / 0 / 2 / 23 / 0 / 0 ), dùng 18 lát cắt và 19 bảng đơn hình.

Page 63: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.1 Quy hoạch rời rạc

Chương 4

THUẬT TOÁN GOMORY THỨ HAI

Chương này trình bày hai thuật toán: thuật toán Gomory thứ hai dùng để giải bài toán quy hoạch tuyến tính nguyên bộ phận, thuật toán Dalton - Llewellyn dùng để giải bài toán quy hoạch tuyến tính với các biến nhận giá trị rời rạc.

1. LƯỢC ĐỒ LOGIC CHUNG CỦA THUẬT TOÁN Xét bài toán quy hoạch rời rạc:

01

ij1

1 1

Max (1)

1,..., (2)

0 1,..., (3)

1,..., ; (4)

n

j jj

n

j ij

j

j j

x c x

a x b i m

x j n

x D j n n n

=

=

=

= =

≥ =

∈ = ≤

Bài toán này kí hiệu là (LD,C) =(L0

D,C) LD là miền chấp nhận được của bài toán (LD

,C) Dj là các tập rời rạc. Điều kiện rời rạc (4) có thể có các dạng khác nhau trong các trường hợp cụ thể. Ta giả sử rằng:

1) Hàm mục tiêu x0 bị chặn trên trên miền (2)- (3) 2) Nếu tập phương án tối ưu của bài toán (1) – (3) khác rỗng thì nó phải bị chặn

Lược đồ logic của thuật toán như sau: Bước lặp ban đầu. Giải l - bài toán ( ) ( )0, ,L C L C≡ xác định bởi (1) – (3). Nếu

nó không giải được thì bài toán ( )0 ,DL C cũng không giải được. Nếu bài toán ( )0 ,L C giải

được và phương án ( )0 ,X L C thoả mãn điều kiện rời rạc (4) thì nó đồng thời là phương

án tối ưu của bài toán ( ),DL C . Nếu ( )0 ,X L C không thoả mãn điều kiện rời rạc thì

chuyển sang bước lặp thứ r = 0 Bước lặp thứ r (r ≥ 0). Giả sử ( ),rX L C không thoả mãn điều kiện rời rạc, ta

biểu diễn hàm mục tiêu x0 = CX và x1 ,x2 , …,xn qua các biến phi cơ sở xj (j rN∈ )

( )r

r0 ij

j N

, 0,1,...,ri i jx x x x i n

= + − =∑

và nhận được bảng đơn hình rijrT x= là chấp nhận được và là l - chuẩn.

Chọn k là dòng có chỉ số nhỏ nhất ứng với thành phần không thoả mãn điều kiện rời rạc

{ }{ }1 0min 1,..., ; ri ik i i n x D= ∈ ∉

Page 64: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.2 Quy hoạch rời rạc

và theo một qui tắc nào đó (tùy từng thuật toán) ta xây dựng lát cắt đúng :

( )r

1 0j N

1

(5)

0 (6)

n r j j

n r

x x

x

γ γ+ +∈

+ +

= + −

Viết dòng (5) vào cuối bảng đơn hình Tr ta được bảng mới là không chấp nhận

được (chỉ đối với dòng cuối cùng vừa thêm vào) và là l - chuẩn. Sau khi đưa xn+r+1 ra khỏi cơ sở thì dòng tương ứng sẽ bị xoá, nếu đưa vào cơ sở xl ( 1l n≥ + ) thì dòng tương ứng không phục hồi. Nếu nhận được bảng đơn hình ứng với bài toán qui hoạch tuyến tính không giải được thì bài toán ( )0 ,DL C không giải được. Nếu nhận được bảng đơn hình Tr+1 là chấp nhận được và l - chuẩn thì kiểm tra phương án l - tối ưu

( )1,rX L C+ có thoả mãn điều kiện rời rạc (4) hay không, nếu nó thoả mãn thì nó là

phương án tối ưu của bài toán ( )0 ,DL C , nếu không thoả mãn thì chuyển sang bước lặp thứ r+1 2. THUẬT TOÁN GOMORY THỨ HAI 2.1. Thuật toán này cho phép ta giải các bài toán qui hoạch tuyến tính nguyên bộ phận

01

ij1

1 1

Max (7)

1,..., (8)

0 1,..., (9)

nguyên 1,..., ; (10)

n

j jj

n

j ij

j

j

x c x

a x b i m

x j n

x j n n n

=

=

=

= =

≥ =

= ≤

2.2. Định lý 1. Giả sử ( ), rrX L C X≡ là phương án tựa tối ưu của bài toán

( ),rL C và Tr là bảng đơn hình tương ứng, 0rix không nguyên với 11 i n≤ ≤ (hoặc

10 i n≤ ≤ nếu hàm mục tiêu cũng yêu cầu đảm bảo tính nguyên). Khi đó bất đẳng thức

0r

j jj N

xγ γ∈

≥∑ (11)

hoặc nó được viết lại là 0

r

j jj N

Z xγ γ∈

= − + ∑ (12)

0Z ≥ (13) là một lát cắt đúng, trong đó:

Page 65: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.3 Quy hoạch rời rạc

{ }{ } { } { }{ }{ } { }( ) { } { }

{ }{ } ( )

0 0

r rij 1 ij 0

0 r rij 1 ij 0

0

r rij 1 ij

0 r rij 1 ij

0

,

1 ,1

1, 0

1, 01

ri

ri

ri r

iri

j

ri

ri

x

x j n x x

xx j n x x

x

x j n x

xx j n x

x

γ

γ

=

≤ ≤ − ≤ >−=

≥ + ≥ − ≥ + < −

(14)

Chứng minh định lý 1. Trước hết điều kiện cắt được thỏa mãn là do { }0 00

r

r rj j i

j Nx xγ γ

= < =∑ (vì 0rix không nguyên)

Kiểm tra điều kiện đúng. Viết khai triển của xi theo các biến phi cơ sở:

( )r0 ij

r

ri i j

j N

x x x x∈

= + −∑ .

Giả sử 'ij 1r

ij 'ij ij 1

, 1

,r

r

x j N j nx

x y j N j n

∈ ≥ += + ∈ ≤

ở đây ijy là số nguyên nào đó chọn sau sao cho các hệ số của lát cắt là nhỏ nhất. Khi đó

{ }1

'0 0

,

( ) ( )r r

r ri i i j j i i j j i

j N j n j N

x x y x x x x Z X∈ ≤ ∈

− + = + − ≡ ∑ ∑ .

Nếu X là một phương án của bài toán qui hoạch tuyến tính nguyên thì ( )iZ X là nguyên. Ta đặt:

{ }{ }

( )

( )

'ij

'ij

'ij

'ij

, 0

, 0

( ) 0 (15)

( ) 0 (16)r

r

r r

r r

jj N

jj N

N j j N x

N j j N x

S X x x

S X x x

+

+

+

= ∈ − >

= ∈ − ≤

= − ≥

= − ≤

và viết lại

{ }{ }

0

0

( ) 0 (17)1

( ) 0 (18)

ri

ri

xS X

x

S X

+

≥−

− ≥

Page 66: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.4 Quy hoạch rời rạc

Tiếp tục ta nhận được:

{ }0 ( ) ( ) ( )ri ix S X S X Z X+ −+ + = ( ( )iZ X nguyên).

Ta có hai trường hợp sau: Trường hợp 1: ( ) ( ) 0S X S X+ −+ ≥ . Khi đó { }0( ) 0r

i iZ X x≥ > , và do

( )iZ X nguyên nên ( ) 1iZ X ≥ , suy ra { }0( ) ( ) 1 riS X S X x+ −+ ≥ − , tiếp theo do

(18) { } { }0 0( ) 1 ( ) 1r r

i iS X x S X x+ −≥ − − ≥ − . Vì vậy

{ }{ } { }0

00

( )1

ri r

iri

xS X x

x+ ≥

− (19)

Trường hợp 2: ( ) ( ) 0S X S X+ −+ < . Khi đó { }0( ) ri iZ X x< , và do ( )iZ X

nguyên nên ( ) 0iZ X ≤ . Suy ra

{ }{ } { }{ }

0

0 0

0

( ) ( ) ( ) 0

( ) ( ) (do ( ) 0)

( ) (20)

ri i

r ri i

ri

x S X S X Z X

S X x S X x S X

S X x

+ −

− + +

+ + = ≤

− ≥ + ≥ ≥

− ≥

Hợp nhất trong Trường hợp 1 gồm (19) và (18), trong Trường hợp 2 gồm (20) và (17) ta được bất đẳng thức

{ }{ } { }0

00

( ) ( )1

ri r

iri

xS X S X x

x+ −− ≥

−,

hay viết lại là

{ }{ } ( ) ( ) { }0 ' '

ij ij 00

(21)1

r r

ri r

j j irj N j Ni

xx x x x x

x+ −∈ ∈

− + ≥−∑ ∑

Chú ý rằng bất đẳng thức (21) có dạng

{ }0

ij 1( ) ,r

rj j i

j N

j j

x x

y j n

γ

γ γ∈

= ≤

ở đây 0jγ ≥ và { }0 0rixγ = không phụ thuộc vào cách chọn ijy . Vì vậy các số ijy nên

chọn sao cho ij( )j yγ là nhỏ nhất, trong trường hợp đó sẽ cắt được phần đa diện Lr nhiều nhất. a) Từ (21) và ' r

ij ij ij 1, ,rx x y j N j n= − ∈ ≤ ta có

Page 67: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.5 Quy hoạch rời rạc

( ){ }{ } ( )0 r r

ij ij ij ij0ij

r rij ij ij ij

khi 01

khi 0

ri

rij

xy x y x

xy

x y x y

γ

− − > −=

− − ≥

Khi rijx nguyên ta có thể đặt r

ij ijy x= và ta nhận được ij( ) 0j j yγ γ= = , đó là cực

tiểu của ij( )j yγ (vì ij( ) 0j yγ ≥ ).

Trường hợp rijx không nguyên, khi đó

{ }{ } ( ) { }

{ } { }( )0 0r r rij ij ij ij ij

0 0

min 0 11 1

r ri i

r ri i

x xA y x y x x

x x

= − − > = − − −

(vì { }r r rij ij ij ij ijy x y x x − = − − nên A đạt cực tiểu khi ta chọn r

ij ij 1y x = + ).

{ } { }r r rij ij ij ij ijmin 0B x y x y x= − − ≥ =

(vì { }r r rij ij ijx x x = + nên B đạt cực tiểu khi ta chọn r

ij ijy x = ).

Như vậy khi tính đến điều kiện cực tiểu ta nhận được

{ }{ } { }( ) { }0 r r

ij ij0

min 1 ,1

ri

j ri

xx x

= − −

Đối với hàm tuyến tính { }{ } ( )0

0

( ) 11

ri

ri

xZ x x

x= −

− với (0 1)x≤ ≤ ta có:

{ }{ } { }

{ }( ) { }

00

0

0 0

(0)1

(1) 0 1.

ri r

iri

r ri i

xZ x

x

Z x x

Z

= >−

=

= <

Do đó ta có { }{ }{ }

0

0

khi min ( ),

( ) khi .

ri

ri

x x xZ x x

Z x x x

≤= >

Áp dụng điều đó để tính hệ số của lát cắt ta nhận được biểu thức:

{ } { } { }{ }{ } { }( ) { } { }

r rij ij 0

0 r rij ij 0 1

0

khi

1 khi ,1

ri

rj i r

i rri

x x x

xx x x j N j n

x

γ

≤=

− > ∈ ≤−

b) Còn với 1, 1rj N j n∈ ≥ + thì ' r

ij ijx x= . Từ (21) ta có

Page 68: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.6 Quy hoạch rời rạc

{ }{ } ( )

r rij 1 ij

0 r rij 1 ij

0

khi , 0

khi , 0 1

rj i

ri

x j n x

xx j n x

x

γ

> ≥=

− > < −

Định lý đã được chứng minh xong. 2.3. Quy tắc xây dựng lát cắt đúng. Giả sử ( ),rX L C không thoả mãn điều

kiện nguyên (10) và Tr = rijx là bảng đơn hình tương ứng. Chọn

{ }{ }1 0min 1,2,..., ; không nguyênrik i i n x= ∈

Nếu hàm mục tiêu x0 cũng thoả mãn điều kiện nguyên thì chọn

{ }{ }1 0min 0,1,2,..., ; không nguyênrik i i n x= ∈

và xây dựng lát cắt đúng:

( )( )1

1 0

0

r

n r

n r j jj N

x

x xγ γ+ +

+ +∈

= − + − −∑

trong đó 0 , jγ γ tính theo (14) với i = k.

2.4. Tính hữu hạn của thuật toán Gomory thứ 2 chứng minh tương tự như chứng minh tính hữu hạn của thuật toán Gomory thứ nhất. Khi đó đòi hỏi các điều kiện:

1) Hàm mục tiêu x0 thoả mãn điều kiện nguyên, điều đó được tính đến khi chọn dòng k để xây dựng lát cắt đúng.

2) Thực hiện một trong hai điều kiện:

- Hàm mục tiêu x0 bị chặn dưới trên tập đa diện lồi L ≡ L0

- Bài toán ( )0 ,NL C có ít nhất một phương án

Nhờ thuật toán Gomory thứ 2 (khi n1 = n) ta có thể giải bài toán qui hoạch tuyến tính nguyên toàn phần, nhưng không có cơ sở để so sánh hiệu quả của hai phương pháp

2.5. Giải ví dụ bằng số Giải bài toán quy hoạch tuyến tính nguyên bộ phận sau:

Max 3210 43 xxxx +−=

4259 321 ≥+− xxx

18263 321 ≤−+ xxx

2757 321 ≥++ xxx

31052 321 ≤++− xxx

0≥jx , .3,2,1=j

Page 69: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.7 Quy hoạch rời rạc

21, xx nguyên

0x nguyên.

Sau khi thêm các biến bù bài toán trở thành:

Max 3210 43 xxxx +−=

3214 2594 xxxx +−+−=

3215 26318 xxxx +−−=

3216 7572 xxxx +++−=

3217 10523 xxxx −−+=

0,,,,,, 7654321 ≥xxxxxxx

210 , xxx , nguyên.

Vì bảng đơn hình ban đầu không l- chuẩn ta cần thêm ràng buộc phụ:

100321 =≤++ gz xxx hay 3218 100 xxxx −−−= và 08 ≥x và viết vào phía

dưới bảng 1.Ta có bảng đơn hình xuất phát sau khi thêm ràng buộc phụ:

Bảng 1 x8 100.00000 1.00000 1.00000 1.00000*

Thực hiện một bước của đơn hình đối ngẫu từ vựng ta được bảng 2 là l-chuẩn

và tiếp tục một bước đơn hình đối ngẫu từ vựng ta được bảng 3 và bảng 4

1 - x1 -x2 -x3

x0 0.00000 -3.00000 1.00000 -4.00000

x1 0.00000 -1.00000 0.00000 0.00000

x2 0.00000 0.00000 -1.00000 0.00000

x3 0.00000 0.00000 0.00000 -1.00000

x4 -4.00000 -9.00000 5.00000 -2.00000

x5 18.00000 3.00000 6.00000 -2.00000

x6 -2.00000 -7.00000 -5.00000 -7.00000

x7 3.00000 -2.00000 5.00000 10.00000

Page 70: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.8 Quy hoạch rời rạc

Bảng 2

Bảng 3

Bảng 4 x9 -0.38462 -0.69231* -0.23077 -1.46154

1 - x1 -x2 -x8

x0 400.00000 1.00000 5.00000 4.00000

x1 0.00000 -1.00000 0.00000 -0.00001

x2 0.00000 0.00000 -1.00000 -0.00001

x3 100.00000 1.00000 1.00000 1.00000

x4 196.00000 -7.00000 7.00000 2.00000

x5 218.00000 5.00000 8.00000 2.00000

x6 698.00000 0.00000 2.00000 7.00000

x7 -997.00000 -12.00000* -5.00000 -10.00000

1 - x7 -x2 -x8

x0 316.91667 0.08333 4.58333 3.16667

x1 83.08333 -0.08333 0.41667 0.83333

x2 0.00000 0.00000 -1.00000 -0.00001

x3 16.91667 0.08333 0.58333 0.16667

x4 777.58333 -0.58333 9.91667 7.83333

x5 -197.41667 0.41667 5.91667 -2.16667 *

x6 698.00000 0.00000 2.00000 7.00000

x7 0.00000 -1.00000 0.00000 0.00000

1 - x7 -x2 -x5

x0 28.38462 0.69231 13.23077 1.46154

x1 7.15385 0.07692 2.69231 0.38462

x2 0.00000 0.00000 -1.00000 -0.00001

x3 1.73077 0.11538 1.03846 0.07692

x4 63.84615 0.92308 31.30769 3.61538

x5 0.00000 0.00000 0.00000 -1.00000

x6 60.19231 1.34615 21.11538 3.23077

x7 0.00000 -1.00000 0.00000 0.00000

Page 71: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.9 Quy hoạch rời rạc

Tám dòng đầu của bảng 4 là bảng đơn hình l- chuẩn và chấp nhận được.

Do x0 lẻ nên từ dòng 0 sinh ra lát cắt ở dòng x9 theo quy tắc lát cắt đúng và ta được bảng

4. Thực hiện một bước của thuật toán đơn hình đối ngẫu từ vựng ta được bảng 5 là bảng

đơn hình l- chuẩn và chấp nhận được. Biến x1 lẻ nên từ dòng x1 sinh ra lát cắt ở dòng

x10.

Bảng 5 x10 -0.11111 -0.11111 -0.04167 -0.22222*

Thực hiện một bước của thuật toán đơn hình đối ngẫu từ vựng ta được bảng 6 là bảng

đơn hình l- chuẩn và không chấp nhận được (do x7 nhận giá trị âm).

Bảng 6

Tiếp tục dùng thuật toán đơn hình đối ngẫu từ vựng giải bài toàn quy hoạch tuyến

tính phụ ta được bảng 7. Bảy dòng đầu của bảng là bảng đơn hình l- chuẩn và chấp nhận

được. Do x0 lẻ nên từ dòng 0 sinh ra lắt cắt ở dòng x11 theo quy tắc . Chọn dòng x11 làm

dòng quay.

1 - x9 -x2 -x5

x0 28.00000 1.00000 13.00000 0.00000

x1 7.11111 0.11111 2.66667 0.22222

x2 0.00000 0.00000 -1.00000 -0.00000

x3 1.66667 0.16667 1 -0.16667

x4 63.33333 1.33333 31 1.66667

x5 0.00000 0.00000 0.00000 -1.00000

x6 59.44444 1.94444 20.66667 0.38889

x7 0.55556 -1.44444 0.33333 2.11111

1 - x9 -x2 -x10

x0 28.00000 1.00000 13.00000 0.00000

x1 7.00000 0.00000 2.625 1.00000

x2 0.00000 0.00000 -1.00000 -0.00001

x3 1.75000 0.25000 1.03125 -0.75000

x4 62.50000 0.50000 30.6875 7.50000

x5 0.50000 0.50000 0.1875 -4.50000

x6 59.25000 1.75000 20.59375 1.75000

x7 -0.50000 -2.50000* -0.0625 9.50000

Page 72: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.10 Quy hoạch rời rạc

Bảng 7 x11 -0.80000 -0.40000* -0.1 -3.80000

Thực hiện một bước của thuật toán đơn hình đối ngẫu từ vựng ta được bảng 8 là

bảng đơn hình l- chuẩn và không chấp nhận được (do x5 nhận giá trị âm).

Bảng 8

Tiếp tục dùng thuật toán đơn hình đối ngẫu từ vựng giải bài toàn quy hoạch tuyến

tính phụ ta được bảng 9 là bảng đơn hình l- chuẩn và chấp nhận được, có cột phương án

là nguyên và quá trình lặp kết thúc.

1 - x7 -x2 -x10

x0 27.80000 0.40000 12.975 3.80000

x1 7.00000 0.00000 2.625 1.00000

x2 0.00000 0.00000 -1.00000 0.00000

x3 1.70000 0.10000 1.025 0.20000

x4 62.40000 0.20000 30.675 9.40000

x5 0.40000 0.20000 0.175 -2.60000

x6 58.90000 0.70000 20.55 8.40000

x7 0.00000 -1.00000 0.00000 0.00000

1 - x11 -x2 -x10

x0 27.00000 1.00000 12.875 0.00000

x1 7.00000 0.00000 2.625 1.00000

x2 0.00000 0.00000 -1.00000 0.00000

x3 1.50000 0.25000 1 -0.75000

x4 62.00000 0.50000 30.625 7.50000

x5 -0.0000001 0.50000 0.125 -4.50000*

x6 57.50000 1.75000 20.375 1.75000

x7 2.00000 -2.50000 0.25 9.50000

1 - x11 -x2 -x5

x0 27.00000 1.00000 12.875 0.00000

x1 7.00000 0.11111 2.65278 0.22222

x2 0.00000 0.00000 -1.00000 0.00000

x3 1.50000 0.16667 0.97917 -0.16667

x4 62.00000 1.33333 30.83333 1.66667

x5 0.00000 0.00000 0 -1.00000

x6 57.50000 1.94444 20.42361 0.38889

x7 2.00000 -1.44444 0.51389 2.11111

Page 73: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.11 Quy hoạch rời rạc

Bảng 9

Vậy phương án tối ưu là (7, 0, 1.5, 62, 0, 57.5, 2) với trị tối ưu là x[ 0] = 27 .

2.6. Chương trình máy tính

• Thuật toán này dùng để giải bài toán quy hoạch tuyến tính nguyên bộ phận, có

dạng:

max1

0 →=∑=

j

m

jj xcx

ij

m

jij bxa ≤∑

=1, pi ,...,1=

0≥jx , mj ,...,2,1=

mnjDx jj ≤=∈ 1 n; 1,...,2,1,

các b[i] có thể dương và âm, phương án xuất phát không đối ngẫu chấp nhận được. Nếu

bài toán giải có ràng buộc đẳng thức dạng: ii

m

jij bxa =∑

=1thì ta thay

thế bằng hai bất đẳng thức: ii

m

jij bxa ≤∑

=1 và ii

m

jij bxa ≥∑

=1.

Sau khi thêm biến bù bài toán trên có thể viết ở dạng:

max))((1

0 →−−=∑=

m

jjj xcx

mjxx jj ,...,2,1))(1( =−−=

.,...,2,1))((1

pixabx j

m

jijiim =−−+= ∑

=+

.,...,2,10 pmjx j +=≥

mnjDx jj ≤=∈ 1 n; 1,...,2,1,

•Trong chương trình sử dụng các biến và mảng sau:

- m: số biến chính, n: số biến chính và biến bù của bài toán (n=m+p), gz là một

số dương đủ lớn và thường lấy bằng },,{max jiij cba ,

Page 74: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.12 Quy hoạch rời rạc

- x0 =0 nếu x0 đòi hỏi nguyên và bằng 1 nếu x0 không cần nguyên.

- ss = 1 nếu bảng đơn hình xuất phát s là l- chuẩn và chấp nhận được, = 2 nếu

bảng là l- chuẩn và không chấp nhận được, =3 nếu bảng không là l - chuẩn

- Mảng s gồm n + 2 dòng và m+1 cột lúc đầu ghi dữ liệu của bài toán sau đó lưu

bảng đơn hình ở mỗi bước. Dòng n+1 để chứa ràng buộc phụ .

- s[0][0] hàm mục tiêu, cột 0 là cột phương án, dòng 0 là các ước lượng

- cs: các biến ở bên trái bảng đơn hình, nc: các biến phi cơ sở

•Cách nhập dữ liệu

Các dữ liệu ban đầu của bài toán được ghi trong một tệp văn bản, gồm có:

- n, m, gz, n1, x0, ss.

- Mảng s dữ liệu ban đầu bố trí dạng ở dưới và được ghi vào tệp dữ liệu theo từng

dòng :

- Tiếp đến là mảng cs: nhập các số từ 0, 1, 2,…, n.

- Cuối cùng là mảng nc: nhập các số từ 1, 2,…, m.

•Với dữ liệu bài toán trên thì vào số liệu sau được ghi ở tệp VDG2.CPP

7 3 100 2 0 3

0 -3 1 -4

0 -1 0 0

0 0 -1 0

0 0 0 -1

-x1 -x2 . . . . . . . . . -xm

0 -c1 -c2 . . . . . . . . -cm x0

x1

x2

xm

0

0

0

-1 0 . . . . . . . . . . 0

0 -1 . . . . . . . . . 0

0 0 . . . . . . . . . . -1

xm+1

xn

b1

bp

-a11 . . . . . . . . . - a1m

-ap1 . . . . . . . . . .-apm

Page 75: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.13 Quy hoạch rời rạc

-4 -9 5 -2

18 3 6 -2

-2 -7 -5 -7

3 -2 5 10

0 1 2 3 4 5 6 7

1 2 3

• Văn bản chương trình

#include <stdio.h>

#include <conio.h>

#include <math.h>

#include <dos.h>

#define M 30

#define N 30

double s[N+2][M+1],r,gz,t4,t5;

int kgd,kgd2,blap,blap2,sb,cmin,x0,ss;

int m,n,n1,i,j,k,l,le,lc,tg,cs[N+2],nc[M+1];

unsigned long far *t; long int t1,t2;

char *s1,*s2; FILE *f1,*f2;

int ktnguyen(double x);

int cotquay();

void biendoi();

void inbang(int cuoi);

int dhdoingau();

void main()

{clrscr();

t= (unsigned long far *)MK_FP(0,0X46C); t1=*t;

printf("\nCo in trung gian hay khong 1/0 ? ");

scanf("%d%*c",&tg);

// Nhap du lieu

printf("\nVao ten tep so lieu : "); gets(s1);

f1=fopen(s1,"r");

fscanf(f1,"%d%d%lf%d%d%d",&n,&m,&gz,&n1,&x0,&ss);

for (i=0;i<=n;i++) for (j=0; j<=m;j++)

{ fscanf(f1,"%lf",&r); s[i][j]=r; }

for (i=0; i<=n;i++) fscanf(f1,"%d",&cs[i]) ;

Page 76: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.14 Quy hoạch rời rạc

for (j=1; j<=m; j++) fscanf(f1,"%d",&nc[j]);

fclose(f1); sb=1; blap=0;

// In du lieu nhap de kiem tra

printf("\nn,m,gz,n1,x0,ss=%d %d %13.5lf %d %d%d",n,m,gz,n1,x0,ss);

if (tg==1){ printf("\nVao ten tep chua ket qua : ");

gets(s2);

f2=fopen(s2,"w");

fprintf(f2,"\nn,m,gz,n1,x0,ss=%d%d%13.5lf%d%d%d",n,m,gz,n1,x0,ss);

}

printf("\nBang 1, so lieu ban dau");

if (tg==1) fprintf(f2,"\nBang 1, so lieu ban dau"); inbang(0);

if (ss==1){

printf("\nBang 1, so lieu ban dau, l- chuan, chap nhan duoc");

if (tg==1)

fprintf(f2,"\nBang 1, so lieu ban dau, l- chuan, chap nhan duoc");

lc = n; goto Lap1;}

if (ss==2){

printf("\nBang1,ban dau,l-chuan,khong chap nhan duoc,chay DHDN");

if (tg==1)

fprintf(f2,"\nBang 1,ban dau,l- chuan,

khong chap nhan duoc,chay DHDN");

lc = n; goto L1;}

// Them rang buoc phu

sb=1; cs[n+1]=n+1; s[n+1][0]=gz;

for (j=1;j<=m; j++) s[n+1][j]=1;

printf("\nBang 1, so lieu ban dau them rang buoc phu");

if (tg==1)

fprintf(f2,"\nBang 1,so lieu ban dau them rang buoc phu");

inbang(1);

l=n+1; // dong quay la dong cuoi cung

// Xac dinh cot quay

cmin=1;

for (j=2;j<=m;j++)

{ for (i=0; i<=n;i++)

{ if (s[i][cmin] > s[i][j]) {cmin=j; break;}

if (s[i][cmin] < s[i][j]) break;

Page 77: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.15 Quy hoạch rời rạc

} }

printf("\nDong quay= %d, Cot quay= %d, Phan tu quay =%13.5lf",

l,cmin,s[l][cmin]);

if (tg==1) {

fprintf(f2,"\nDong quay= %d, Cot quay= %d, Phan tu quay= %13.5lf",

l,cmin,s[l][cmin]); }

biendoi(); sb++;

printf("\nBang %d, l- chuan dau tien",sb);

if (tg==1) fprintf(f2,"\nBang %d, l- chuan dau tien",sb);

inbang(0); lc = n+1;

L1: kgd2= dhdoingau();

if (kgd2==1) {

printf("\nBai toan phu khong giai duoc, STOP");

if (tg==1) fprintf(f2,"\nBai toan phu khong giai duoc,STOP");

getch(); getch(); return; }

// Tim xong bang l- chuan + chap nhan duoc, sang Buoc lap lon

Lap1: blap = blap+1;

printf("\n------------------------------------------------");

printf("\n\nBUOC LAP LON THU %d: ",blap);

if (tg==1)

{ fprintf(f2,"\n---------------------------------------");

fprintf(f2,"\n\nBUOC LAP LON THU %d: ",blap);}

// Kiem tra loi giai toi uu bai toan phu co nguyen khong

le=-1;

for(i=x0;i<=n1;i++) if(ktnguyen(s[i][0])==0){le = i; break; }

printf("\nThanh phan le thuoc dong = %d",le);

if (tg==1) fprintf(f2,"\nThanh phan le thuoc dong = %d",le);

if (le==-1) { printf("\nPHUONG AN TOI UU QHTT NGUYEN: ");

if (tg==1)

fprintf(f2,"\nPHUONG AN TOI UU QHTT NGUYEN: ");

for (i=0; i<=n;i++)

printf("\nx[%2d] = %13.5lf",cs[i],s[i][0]);

printf("\nSo luong lat cat: %d lat cat",blap-1);

printf("\nSo bang don hinh da lap : %d bang",sb);

if (tg==1)

{ for (i=0; i<=n;i++)

Page 78: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.16 Quy hoạch rời rạc

fprintf(f2,"\nx[%2d] = %13.5lf",cs[i],s[i][0]);

fprintf(f2,"\nSo luong lat cat: %d lat cat",blap-1);

fprintf(f2,"\nSo bang don hinh da lap : %d bang",sb);

}

t= (unsigned long far *)MK_FP(0,0X46C);

t2=*t; printf("\nThoi gian chay chuong trinh: %ld giay",

(long int)((t2-t1)/18.21));

if (tg==1)

fprintf(f2,"\nThoi gian chay chuong trinh:%ld giay",

(long int)((t2-t1)/18.21));

fclose(f2); getch();

return;

}

// Tao lat cat moi va ghi vao cuoi bang

lc++; cs[n+1]=lc; s[n+1][0]= -(s[le][0]- floor(s[le][0]));

for (j=1; j<=m; j++)

if (nc[j]<=n1) { // khi xj <= n1

if (ktnguyen(s[le][j])) s[n+1][j]=0;

else { if ((s[le][j]-floor(s[le][j]))<=fabs(s[n+1][0]))

s[n+1][j]=-(s[le][j]-floor(s[le][j]) );

else s[n+1][j]=-(fabs(s[n+1][0])/(1-fabs(s[n+1][0])))

*(1-(s[le][j]-floor(s[le][j])));

}

} // khi xj > n1

else { if (s[le][j]<0) s[n+1][j]=-(fabs(s[n+1][0])/(1-fabs(s[n+1][0])))

*(-s[le][j]);

else s[n+1][j]=-s[le][j];

}

printf("\nBang %d, sau khi them lat cat",sb);

if (tg==1) fprintf(f2,"\nBang %d, sau khi them lat cat",sb);

inbang(1);

// Xac dinh dong quay va cot quay

l=n+1 ; printf("\nDong quay = %d",l);

if (tg==1) fprintf(f2,"\nDong quay = %d",l);

cotquay();

printf("\nCot quay = %d, Phan tu quay = %13.5lf",cmin,s[l][cmin]);

Page 79: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.17 Quy hoạch rời rạc

if (tg==1)

fprintf(f2,"\nCot quay=%d,Phan tu quay=%13.5lf",cmin,s[l][cmin]);

// Bien doi bang don hinh

biendoi(); sb++;

printf("\nBang %d, bang dau tien bai toan phu",sb);

if (tg==1)

fprintf(f2,"\nBang %d, bang dau tien bai toan phu",sb);

inbang(0); kgd2= dhdoingau();

if (kgd2==1) { printf("\nBai toan phu khong giai duoc");

if (tg==1)

fprintf(f2,"\nBai toan phu khong giai duoc, STOP");

getch(); getch(); return; }

goto Lap1;

}

int ktnguyen(double x)

{ long int h; double z; z=fabs(x); h=(int)(z+0.5);

if (fabs(z-h)<=0.0001) return 1; else return 0;

}

int cotquay()

{ k=0;

for (j=1; j<=m; j++) if (s[l][j]<-0.000001) { k=j; break;}

if (k==0) return 1;

cmin=k;

for (j=k+1;j<=m;j++) if (s[l][j]< -0.000001)

{ for (i=0; i<=n;i++)

{t4=s[i][cmin]/fabs(s[l][cmin]);t5=s[i][j]/fabs(s[l][j]);

if (t4 > t5) {cmin=j; break;}

if (t4 < t5) break;

}

}

return 0;

}

void biendoi()

{ for (j=0;j<=m;j++) if (j!= cmin)

{ for (i=0;i<=n;i++) if (i!=l)

s[i][j]=s[i][j]-(s[l][j]/s[l][cmin])*s[i][cmin];

Page 80: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.18 Quy hoạch rời rạc

s[l][j]=0; }

for (i=0;i<=n;i++)

if (i!=l) s[i][cmin]=-s[i][cmin]/s[l][cmin];

s[l][cmin]=-1;

nc[cmin]=cs[l];

}

void inbang(int cuoi)

{ int n1; if (cuoi==1) n1=n+1; else n1=n;

printf("\nCo so : ");

for (i=0; i<=n1;i++) printf("%d ",cs[i]) ; printf("\n");

printf("Phi co so : ");

for (j=1; j<=m; j++) printf("%d ",nc[j]);printf("\n");

for (i=0;i<=n1;i++) { for (j=0; j<=m;j++)

printf(" %10.5lf ",s[i][j]);

printf("\n"); }

if (tg==1)

{fprintf(f2,"\nCo so : ");

for (i=0; i<=n1;i++) fprintf(f2,"%d ",cs[i]);

fprintf(f2,"\n"); fprintf(f2,"Phi co so : ");

for (j=1; j<=m; j++)

fprintf(f2,"%d ",nc[j]);fprintf(f2,"\n");

for (i=0;i<=n1;i++) { for (j=0; j<=m;j++)

fprintf(f2," %13.5lf ",s[i][j]);

fprintf(f2,"\n");

}

}

getch();

}

int dhdoingau()

{ blap2 =0;Lap2: blap2++;

printf("\nBuoc lap Don hinh doi ngau thu %d : ",blap2);

if (tg==1)

fprintf(f2,"\nBuoc lap Don hinh doi ngau thu %d :",blap2);

l=-1;

for (i=1;i<=n;i++) if (s[i][0]<0) {l=i; break;}

printf("\nDong quay %d ",l);

Page 81: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.19 Quy hoạch rời rạc

if (tg==1) fprintf(f2,"\nDong quay = %d",l);

if (l==-1) {

printf("\nBang tren ung phuong an toi uu cua bai toan phu");

if (tg==1) fprintf(f2,"\nBang tren ung phuong an toi uu bai toan phu");

return 0;

}

else { kgd=cotquay();

if (kgd==1) return 1;

printf("\nCot quay=%d, Phan tu quay=%13lf",cmin,s[l][cmin]);

if (tg==1)

fprintf(f2,"\nCot quay = %d, Phan tu quay =%13.5lf",

cmin,s[l][cmin]);

biendoi(); sb++;

printf("\nBang %d, DHDN",sb);

if (tg==1) fprintf(f2,"\nBang %d, DHDN",sb);

inbang(0);

goto Lap2;

}

}

• Sau khi chạy chương trình ta nhận được lời giải tối ưu của bài toán trên là:

x[ 0] = 27.00000

x[ 1] = 7.00000

x[ 2] = 0.00000

x[ 3] = 1.50000

x[ 4] = 62.00000

x[ 5] = 0.00000

x[ 6] = 57.50000

x[ 7] = 2.00000

Số lượng lát cắt: 3 lát cắt

Số bảng đơn hình đã lập : 9 bảng

3. THUẬT TOÁN DALTON VÀ LLEWELLYN 3.1. Dalton cải tiến thuật toán Gomory thứ hai cho bài toán qui hoạch tuyến tính rời rạc bộ phận sau:

Page 82: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.20 Quy hoạch rời rạc

{ }

01

ij1

1 2 1 1

1 2 1

Max (22)

1,..., (23)

0 1,..., (24)

, ,... , 1,..., ; (25)

0 ... , 1,...,j

j

n

j jj

n

j ij

j

jj j j jq

j j jq

x c x

a x b i m

x j n

x A A A A j n n n

A A A j n

=

=

=

= =

≥ =

∈ ≡ = ≤

= < < < =

Nếu cần ta bổ sung bất đẳng thức 1, 1,...,

jj jqx A j n≤ = (26)

vào điều kiện (23), khi đó phương án X của bài toán (L0,C) (22) – (24) thoả mãn điều kiện

10 , 1,...,jj jqx A j n≤ ≤ = .

3.2. Định lý 1. Giả sử ( ), rrX L C X≡ là phương án tựa tối ưu của bài toán

( ),rL C và rijrT x= là bảng đơn hình tương ứng,

1

0 , 1

1r

i i i

i n

A x Aυ υ+

≤ ≤

< <

Khi đó bất đẳng thức 0

r

j jj N

xγ γ∈

≥∑ (27)

hay viết lại là

0 (28)

0 (29)r

j jj N

Z x

Z

γ γ∈

= − +

là một lát cắt đúng, trong đó:

( )

0 0

0

, 1 0

(30)

0(31)

0

ri i

r rij ij

rj r ri i

ij ijri i

x A

x x

x A x xA x

υ

υ

υ

γ

γ

+

= −

= −− < −

Chứng minh định lý. Kiểm tra tính cắt:

0 00r

r rj j i i

j Nx x Aυγ γ

= < = −∑ (do 0rjx = ).

Kiểm tra tính đúng. Giả sử X là phương án của bài toán rời rạc, với i đã chọn, biểu diễn xi qua các biến phi cơ sở như sau: ( )r

0 ijr

ri i j

j N

x x x x∈

= + −∑ (32)

Có 2 khả năng:

Page 83: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.21 Quy hoạch rời rạc

1) , 1i ix A υ+≥ (33)

2) i ix Aυ≤ (34) Ta đưa vào các ký hiệu:

( ){ } { }( ){ } { }

( )

( )

r rij ij

r rij ij

rij

rij

, 0 , 0

, 0 , 0

r

r

r r r

r r r

jj N

jj N

N j j N x j j N x

N j j N x j j N x

S x x

S x x

+

+

+

= ∈ − ≤ = ∈ ≥

= ∈ − > = ∈ <

= −

= −

Từ (32) ta có

0 (35)

0 (36)0 (37)

ri ix x S S

SS

− +

+

= + +

Xét Trường hợp 1, tức là , 1i ix A υ+≥ . Từ (33) và (35) ta có

0 , 1ri ix S S A υ

− +++ + ≥ ,

suy ra ( ) ( ), 1 0 , 1 0 (do 0)r ri i i iS A x S A x Sυ υ

+ − −+ +≥ − − ≥ − − ≥ . Tiếp theo

00

, 1 0

( )r

ri ii ir

i i

x A S x AA x

υυ

υ

+

+

−≥ −

− (38)

Xét Trường hợp 2, tức là i ix Aυ≤ . Từ (34) và (35) ta có

0ri ix S S Aυ

− ++ + ≤ , suy ra ( )0

ri ix A S Sυ

+ −− + ≤ − , tiếp theo do 0S + ≥ nên ta có

0( )ri ix A Sυ

−− ≤ − (39)

Trong cả 2 trường hợp, từ (36) và (37) ta có

0

, 1 0

0 (40)

0 (41)

ri i

ri i

x A SA x

S

υ

υ

+

+

−≥

− ≥

Đối với Trường hợp 1 hợp nhất (38) và (41), đối với Trường hợp 2 hợp nhất (39) và (40), trong cả 2 trường hợp ta đều có

00

, 1 0

( )r

ri ii ir

i i

x A S S x AA x

υυ

υ

+ −

+

−− ≥ −

hay viết lại

Page 84: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.22 Quy hoạch rời rạc

( )00 0

, 1 0

( )r r

rr r ri iij j ij j i ir

j N j Ni i

x A x x x x x AA x

υυ

υ

γ+ −∈ ∈+

−− + ≥ − =

−∑ ∑

viết cách khác 0( ) 0r

j jj N

Z X xγ γ∈

= − + ≥∑ là lát cắt đúng, trong đó

( )

0 0

0

, 1 0

, 0

, 0

ri i

r rij ij

rj r ri i

ij ijri i

x A

x x

x A x xA x

υ

υ

υ

γ

γ

+

= −

= −− < −

Định lý đã được chứng minh xong.

3.3. Quy tắc xây dựng lát cắt đúng. Giả sử ( ),rX L C không thoả mãn điều

kiện rời rạc và 0

rij ,n

rr i Q j N

T x∈ ∈

= là bảng đơn hình tương ứng. Chọn

{ }{ }1 0min 1,2,..., ; không thoa (25) rik i i n x= ∈

và xây dựng lát cắt đúng:

( )( )1

1 0

0

r

n r

n r j jj N

x

x xγ γ+ +

+ +∈

= − + − −∑

trong đó 0 , jγ γ được tính theo (30), (31) với i = k.

3.4. Tính hữu hạn của thuật toán này được chứng minh giống thuật toán Gomory thứ nhất, khi đó cần phải thoả mãn các điều kiện sau:

1) Hàm mục tiêu x0 thoả mãn điều kiện rời rạc, điều này được tính đến khi chọn dòng k để xây dựng lát cắt đúng.

2)Thực hiện một trong hai điều kiện:

- Hàm mục tiêu bị chặn dưới trên đa diện L

- Bài toán ( )0 ,DL C có ít nhất một phương án

Thuật toán Dalton cũng có thể dùng để giải bài toán qui hoạch nguyên toàn phần hoặc bộ phận nhưng kém hiệu quả hơn thuật toán Gomory thứ nhất và thứ hai.

3.5. Giải ví dụ bằng số Giải bài toán quy hoạch tính tuyến nguyên bộ phận rời rạc sau:

Page 85: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.23 Quy hoạch rời rạc

Max 210 xxx +=

124 21 ≤+− xx

124 21 ≤− xx

}4,1,0{1∈x

}5,3,1,0{2 ∈x

0x nguyên.

Ta thêm hai biến bù x3 và x4, khi đó bài toán trên trở thành:

Max 210 xxx +=

213 412 xxx −+=

0x nguyên

}4,1,0{1∈x

}5,3,1,0{2 ∈x

43 , xx nguyên

Từ đây ta có bảng đơn hình xuất phát (Bảng 1), vì bảng đơn hình không là l-

chuẩn nên ta dùng đơn hình thường giải bài toán quy hoạch tuyến tính ta được bảng 2

(không là l- chuẩn).

Bảng 1 Bảng 2

Tiếp tục giải ta được bảng 3 (bảng l- chuẩn , chấp nhận được). Do x2 vi phạm

điều kiện rời rạc nên sinh ra lát cắt ở dòng x5 và chọn nó làm dòng quay. Tiếp tục giải

bài toán quy hoạch rời rạc ta được bảng 4 (l- chuẩn và chấp nhận được). Do x1 không

thoả mãn điều kiện rời rạc nên sinh ra lát cắt ở dòng x6 chọn nó làm dòng quay.

1 - x4 - x2

x0 3 1/4 -5/4

x1 3 1/4 -1/4

x2 0 0 -1

x3 15 1/4 15/4*

x4 0 -1 0

1 - x1 - x2

x0 0 -1 -1

x1 0 -1 0

x2 0 0 -1

x3 12 -1 4

x4 12 4* -1

214 412 xxx +−=

Page 86: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.24 Quy hoạch rời rạc

Thực hiện một bước của thuật toán đơn hình đối ngẫu từ vựng ta được bảng 5 (

bảng đơn hình l- chuẩn và chấp nhận được). Vì x1 không thoả mãn điều kiện rời rạc nên

sinh ra lát cắt ở dòng x7

Thực hiện một bước của thuật toán đơn hình đối ngẫu từ vựng ta được bảng 6

(bảng đơn hình l- chuẩn và không chấp nhận được). 1 - x7 - x6

x0 6 0 1

x1 1 1 0

x2 5 -1 1

x3 -7 5 -4*

x4 13 -5 1

Bảng 6

Thực hiện một bước của thuật toán đơn hình đối ngẫu từ vựng ta được bảng 7

(bảng đơn hình l- chuẩn và chấp nhận được). Vì x2 không thoả mãn điều kiện rời rạc

nên sinh ra lát cắt x8 và chọn dòng x8 làm dòng quay.

1 - x4 - x5

x0 27/4 1/4 5/4

x1 15/4 1/4 1/4

x2 3 0 1

x3 15/4 1/4 -15/4

x4 0 -1 0

Bảng 4 (T1) x6 -3/4 -1/4 -5/4*

1 - x4 - x3

x0 8 1/3 1/3

x1 4 4/15 1/15

x2 4 1/15 4/15

x3 0 0 -1

x4 0 -1 0

Bảng 3 (T0) x5 -1 -1/15 -4/15*

1 - x4 - x6

x0 6 0 1

x1 18/5 1/5 1/5

x2 12/5 -1/5 4/5

x3 6 1 -3

x4 0 -1 0

Bảng 5 (T2) x7 -13/5 -1/5* -1/5

Page 87: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.25 Quy hoạch rời rạc

1 - x7 - x3

x0 17/4 5/4 1/4

x1 1 1 0

x2 13/4 1/4 1/4

x3 0 0 -1

x4 45/4 -15/4 1/4

Bảng 7 (T3) x8 -1/4 -5/4 -1/4*

Thực hiện một bước của thuật toán đơn hình đối ngẫu từ vựng ta được bảng 8

(bảng đơn hình l- chuẩn và chấp nhận được), có cột phương án là nguyên và các biến

thoả mãn điều kiện rời rạc. Quá trình lặp kết thúc. 1 - x7 - x8

x0 4 0 1

x1 1 1 0

x2 3 -1 1

x3 1 5 -4

x4 11 -5 1

Bảng 8 (T4)

Vậy phương án tối ưu là (1, 3, 1, 11) với trị tối ưu hàm mục tiêu x[0]=4.

3.6. Chương trình máy tính

Thuật toán này dùng để giải bài toán quy hoạch tuyến tính nguyên bộ phận rời rạc,

có dạng:

Max j

m

jj xcx ∑

=

=1

0

ij

m

jij bxa =∑

=1, pi ,...,2,1=

0≥jx , mj ,...,2,1=

jx },...,,{ 21 jjqjjj AAAA ≡∈ , mnnj ≤= 11,...,2,1 ;

121 ,...,2,1,...0 njAAAjjqjj =<<<=

Page 88: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.26 Quy hoạch rời rạc

các b[i] có thể dương và âm, phương án xuất phát không đối ngẫu chấp nhận được. Nếu

bài toán giải có ràng buộc đẳng thức dạng: ii

m

jij bxa =∑

=1thì ta thay thế bằng hai bất

đẳng thức: ii

m

jij bxa ≤∑

=1và ii

m

jij bxa ≥∑

=1.

Sau khi thêm biến bù bài toán trên có thể viết ở dạng:

max))((1

0 →−−=∑=

m

jjj xcx

mjxx jj ,...,2,1))(1( =−−=

.,...,2,1))((1

pixabx j

m

jijiim =−−+= ∑

=+

.,...,2,10 pmjx j +=≥

jx },...,,{ 21 jjqjjj AAAA ≡∈ , mnnj ≤= 11,...,2,1 ;

121 ,...,2,1,...0 njAAAjjqjj =<<<= .

Trong chương trình sử dụng các biến và mảng sau:

- m: số biến chính, n: số biến chính và biến bù của bài toán (n=m+p), gz là một

số dương đủ lớn và thường lấy bằng },,{max jiij cba .

- x0=0 nếu x0 đòi hỏi nguyên và bằng 1 nếu x0 không cần nguyên.

- ss = 1 nếu bảng đơn hình s ban đầu là l- chuẩn và chấp nhận được, = 2 nếu bảng

là l- chuẩn và không chấp nhận được, =3 nếu bảng không là l- chuẩn

- Mảng s gồm n + 2 dòng và m+1 cột lúc đầu ghi dữ liệu của bài toán sau đó lưu

bảng đơn hình ở mỗi bước. Dòng n+1 để chứa ràng buộc phụ .

- s[0][0] hàm mục tiêu, cột 0 là cột phương án, dòng 0 là các ước lượng

- cs : các biến ở bên trái bảng đơn hình, nc : các biến phi cơ sở

Cách nhập dữ liệu

Các dữ liệu ban đầu của bài toán được ghi trong một tệp văn bản, gồm có

- n, m, gz, ss, n1.

- Mảng s dữ liệu ban đầu bố trí dạng ở dưới và được ghi vào tệp dữ liệu theo từng

dòng.

Page 89: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.27 Quy hoạch rời rạc

- Mảng v[0…n] có ý nghĩa:

v[i]=0 nếu xi không có điều kiện nguyên hay rời rạc, v[i]=1 nếu xi có điều kiện

nguyên , v[i]=2 nếu xi có điều kiện rời rạc.

- Mảng a[0…n, q]

v[i] =0 hay 1 thì toàn bộ dòng i của mảng a là 0, v[i]=2 thì dòng i là các giá trị rời

rạc và tiếp theo là 0.

- Mảng w[0…n]

v[i]=0 hay 1 thì w[i]=0, v[i]=2 thì w[i] là số lượng giá trị rời rạc của xi.

Với bài toán trên ta có cách nhập dữ liệu

4 2 100 3 4

0 -1 -1

0 -1 0

0 0 -1

12 -1 4

12 4 -1

0 1 2 3 4

1 2

1 2 2 1 1

-x1 -x2 . . . . . . . . . –xm

0 -c1 -c2 . . . . . . . . -cn1 x0

x1

x2

xm

0

0

0

-1 0 . . . . . . . . . . 0

0 -1 . . . . . . . . . 0

0 0 . . . . . . . . . . -1

xm+1

xn

b1

bp

-a11 . . . . . . . . . - a1n1

-ap1 . . . . . . . . . .-apm

Page 90: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.28 Quy hoạch rời rạc

0 0 0 0

0 1 4 0

0 1 3 5

0 0 0 0

0 0 0 0

0 3 4 0 0

Văn bản chương trình

#include <stdio.h> #include <conio.h> #include <math.h> #include <dos.h> #define M 30 #define N 30 double s[N+2][M+1],r,r1,r2,gz,t4,t5; int kgd,kgd2,blap,blap2,sb,cmin,ss,v[N+1],w[N+1],a[N+1][11]; int m,n,n1,i,j,k,l,le,lc,tg,h,cs[N+2],nc[M+1]; unsigned long far *t; long int t1,t2; char *s1,*s2; FILE *f1,*f2; int cotquay(); void biendoi(); void inbang(int cuoi); int dhdoingau(); void main() { clrscr(); t= (unsigned long far *)MK_FP(0,0X46C); t1=*t; printf("\nCo in trung gian hay khong 1/0 ? "); scanf("%d%*c",&tg); // Nhap du lieu printf("\nVao ten tep so lieu : "); gets(s1); f1= fopen(s1,"r"); fscanf(f1,"%d%d%lf%d%d",&n,&m,&gz,&ss,&n1); for (i=0;i<=n;i++) for (j=0; j<=m;j++) { fscanf(f1,"%lf",&r); s[i][j]=r; } for (i=0; i<=n;i++) fscanf(f1,"%d",&cs[i]) ; for (j=1; j<=m; j++) fscanf(f1,"%d",&nc[j]); for (i=0;i<=n;i++) fscanf(f1,"%d",&v[i]); for (i=0;i<=n;i++) for (j=1;j<=n1;j++) { fscanf(f1,"%d",&k); a[i][j]=k;} for (i=0;i<=n;i++) fscanf(f1,"%d",&w[i]); fclose(f1); sb=1; blap=0; // In du lieu nhap de kiem tra printf("\nn,m,gz,ss,n1 = %d %d %13.5lf %d %d",n,m,gz,ss,n1); if (tg==1){ printf("\nVao ten tep chua ket qua : "); gets(s2); f2=fopen(s2,"w"); fprintf(f2,"\nn,m,gz,ss,n1= %d %d %13.5lf %d %d",n,m,gz,ss,n1); } printf("\nBang 1, so lieu ban dau"); if (tg==1) fprintf(f2,"\nBang 1, so lieu ban dau"); inbang(0); printf("Mang v : "); for (i=0; i<=n; i++) printf("%d ",v[i]);printf("\n"); for (i=0;i<=n;i++) { for (j=1; j<=n1;j++) printf(" %5d ",a[i][j]);

Page 91: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.29 Quy hoạch rời rạc

printf("\n"); } printf("Mang w : "); for (i=0; i<=n; i++) printf("%d ",w[i]); printf("\n"); if (tg==1) { fprintf(f2,"Mang v : "); for (i=0; i<=n; i++) fprintf(f2,"%d ",v[i]); fprintf(f2,"\n"); for (i=0;i<=n;i++) { for (j=1; j<=n1;j++) fprintf(f2," %5d ",a[i][j]); fprintf(f2,"\n"); } fprintf(f2,"Mang w : "); for (i=0; i<=n; i++) fprintf(f2,"%d ",w[i]); fprintf(f2,"\n"); } getch(); if (ss==1){ printf("\nBang 1, so lieu ban dau, l- chuan, chap nhan duoc"); if (tg==1) fprintf(f2,"\nBang 1, so lieu ban dau, l- chuan, chap nhan duoc"); lc = n; goto Lap1;} if (ss==2){ printf("\nBang 1, ban dau, l- chuan, khong chap nhan duoc, chay ngay DHDN"); if (tg==1) fprintf(f2,"\nBang 1, ban dau, l- chuan, khong chap nhan duoc, chay ngay DHDN"); lc = n; goto L1;} // Them rang buoc phu sb=1; cs[n+1]=n+1; s[n+1][0]=gz; for (j=1;j<=m; j++) s[n+1][j]=1; printf("\nBang 1, so lieu ban dau them rang buoc phu"); if (tg==1) fprintf(f2,"\nBang 1, so lieu ban dau them rang buoc phu"); inbang(1); l=n+1; // dong quay la dong cuoi cung // Xac dinh cot quay cmin=1; for (j=2;j<=m;j++) { for (i=0; i<=n;i++) { if (s[i][cmin] > s[i][j]) {cmin=j; break;} if (s[i][cmin] < s[i][j]) break; } } printf("\nDong quay= %d, Cot quay= %d, Phan tu quay= %13.5lf", l,cmin,s[l][cmin]); if (tg==1) { fprintf(f2,"\nDong quay= %d, Cot quay = %d, Phan tu quay= %13.5lf", l,cmin,s[l][cmin]); } biendoi(); sb++; printf("\nBang %d, l- chuan dau tien",sb); if (tg==1) fprintf(f2,"\nBang %d, l- chuan dau tien",sb); inbang(0); lc = n+1; L1: kgd2= dhdoingau(); if (kgd2==1) { printf("\nBai toan phu khong giai duoc, STOP"); if (tg==1) fprintf(f2,"\nBai toan phu khong giai duoc, STOP"); getch(); getch(); return; } // Tim xong bang l- chuan + chap nhan duoc, sang Buoc lap lon Lap1: blap = blap+1;

Page 92: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.30 Quy hoạch rời rạc

printf("\n-------------------------------------------------"); printf("\n\nBUOC LAP LON THU %d: ",blap); if (tg==1) { fprintf(f2,"\n----------------------------------------------"); fprintf(f2,"\n\nBUOC LAP LON THU %d: ",blap);} // Kiem tra loi giai toi uu bai toan phu co nguyen khong le=-1; for (i=0;i<=n;i++) { if (v[i]==1) { r = floor(s[i][0]+0.5); if (fabs(s[i][0]-r)>0.00001) { le=i; r1=floor(s[i][0]); r2=r1+1; s[n+1][0]=s[i][0]-r1; for (j=1;j<=m;j++) { if (s[i][j]>=0) s[n+1][j]=s[i][j]; else s[n+1][j]=-s[i][j]*(s[i][0]-r1)/(r2-s[i][0]);} for (j=0;j<=m;j++) s[n+1][j]=-s[n+1][j]; break; } } if (v[i]==2) { for (j=1;j<w[i];j++) if ((a[i][j]<=s[i][0])&&(s[i][0]<a[i][j+1])){ h=j; break;} if ((a[i][h]+0.00001< s[i][0])&&(s[i][0]<a[i][h+1]-0.00001)) { le=i; s[n+1][0]=s[i][0]-a[i][h]; for (j=1;j<=m;j++) { if (s[i][j]>=0) s[n+1][j]=s[i][j]; else s[n+1][j]=-s[i][j]*(s[i][0]-a[i][h])/(a[i][h+1]-s[i][0]); } for (j=0;j<=m;j++) s[n+1][j]=-s[n+1][j]; break; } } } printf("\nThanh phan le thuoc dong = %d",le); if (tg==1) fprintf(f2,"\nThanh phan le thuoc dong = %d",le); if (le==-1) { printf("\nPHUONG AN TOI UU QHTT NGUYEN: "); if (tg==1) fprintf(f2,"\nPHUONG AN TOI UU QHTT NGUYEN: "); for (i=0; i<=n;i++) printf("\nx[%2d] = %13.5lf",cs[i],s[i][0]); printf("\nSo luong lat cat: %d lat cat",blap-1); printf("\nSo bang don hinh da lap : %d bang",sb); if (tg==1) { for (i=0; i<=n;i++) fprintf(f2,"\nx[%2d] = %13.5lf",cs[i],s[i][0]); fprintf(f2,"\nSo luong lat cat: %d lat cat",blap-1); fprintf(f2,"\nSo bang don hinh da lap : %d bang",sb); } t= (unsigned long far *)MK_FP(0,0X46C); t2=*t; printf("\nThoi gian chay chuong trinh: %ld giay", (long int)((t2-t1)/18.21)); if (tg==1) fprintf(f2,"\nThoi gian chay chuong trinh: %ld giay", (long int)((t2-t1)/18.21));

Page 93: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.31 Quy hoạch rời rạc

fclose(f2); getch(); return; } // Tao lat cat moi va ghi vao cuoi bang lc++; cs[n+1]=lc; printf("\nBang %d, sau khi them lat cat",sb); if (tg==1) fprintf(f2,"\nBang %d, sau khi them lat cat",sb); inbang(1); // Xac dinh dong quay va cot quay l=n+1 ; printf("\nDong quay = %d",l); if (tg==1) fprintf(f2,"\nDong quay = %d",l); cotquay(); printf("\nCot quay = %d, Phan tu quay = %13.5lf",cmin,s[l][cmin]); if (tg==1) fprintf(f2,"\nCot quay = %d, Phan tu quay = %13.5lf",cmin,s[l][cmin]); // Bien doi bang don hinh biendoi(); sb++; printf("\nBang %d, bang dau tien bai toan phu",sb); if (tg==1) fprintf(f2,"\nBang %d, bang dau tien bai toan phu",sb); inbang(0); kgd2= dhdoingau(); if (kgd2==1) { printf("\nBai toan phu khong giai duoc"); if (tg==1) fprintf(f2,"\nBai toan phu khong giai duoc, STOP"); getch(); getch(); return; } goto Lap1; } int cotquay() { k=0; for (j=1; j<=m; j++) if (s[l][j]<-0.000001) { k=j; break;} if (k==0) return 1; cmin=k; for (j=k+1;j<=m;j++) if (s[l][j]< -0.000001) { for (i=0; i<=n;i++) { t4= s[i][cmin]/fabs(s[l][cmin]); t5=s[i][j]/fabs(s[l][j]); if (t4 > t5) {cmin=j; break;} if (t4 < t5) break; } } return 0; } void biendoi() { for (j=0;j<=m;j++) if (j!= cmin) { for (i=0;i<=n;i++) if (i!=l) s[i][j]=s[i][j]-(s[l][j]/s[l][cmin])*s[i][cmin]; s[l][j]=0; } for (i=0;i<=n;i++) if (i!=l) s[i][cmin]=-s[i][cmin]/s[l][cmin]; s[l][cmin]=-1; nc[cmin]=cs[l]; } void inbang(int cuoi)

Page 94: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.32 Quy hoạch rời rạc

{ int n1; if (cuoi==1) n1=n+1; else n1=n; printf("\nCo so : "); for (i=0; i<=n1;i++) printf("%d ",cs[i]) ; printf("\n"); printf("Phi co so : "); for (j=1; j<=m; j++) printf("%d ",nc[j]);printf("\n"); for (i=0;i<=n1;i++) { for (j=0; j<=m;j++) printf(" %10.5lf ",s[i][j]); printf("\n"); } if (tg==1) { fprintf(f2,"\nCo so : "); for (i=0; i<=n1;i++) fprintf(f2,"%d ",cs[i]) ; fprintf(f2,"\n"); fprintf(f2,"Phi co so : "); for (j=1; j<=m; j++) fprintf(f2,"%d ",nc[j]);fprintf(f2,"\n"); for (i=0;i<=n1;i++) { for (j=0; j<=m;j++) fprintf(f2," %13.5lf ",s[i][j]); fprintf(f2,"\n"); } } getch(); } int dhdoingau() { blap2 =0; Lap2: blap2++; printf("\nBuoc lap Don hinh doi ngau thu %d : ",blap2); if (tg==1) fprintf(f2,"\nBuoc lap Don hinh doi ngau thu %d : ",blap2); l=-1; for (i=1;i<=n;i++) if (s[i][0]<0) {l=i; break;} printf("\nDong quay %d ",l); if (tg==1) fprintf(f2,"\nDong quay = %d",l); if (l==-1) { printf("\nBang tren ung phuong an toi uu cua bai toan phu"); if (tg==1) fprintf(f2,"\n Bang tren ung phuong an toi uu bai toan phu"); return 0; } else { kgd=cotquay(); if (kgd==1) return 1; printf("\nCot quay = %d, Phan tu quay = %13.5lf",cmin,s[l][cmin]); if (tg==1) fprintf(f2,"\nCot quay = %d, Phan tu quay = %13.5lf", cmin,s[l][cmin]); biendoi(); sb++; printf("\nBang %d, DHDN",sb); if (tg==1) fprintf(f2,"\nBang %d, DHDN",sb); inbang(0); goto Lap2; } }

Sau khi chạy chương trình ta nhận được lời giải tố ưu của bài toán trên là:

x[ 0] = 4.00000 x[ 1] = 1.00000 x[ 2] = 3.00000 x[ 3] = 1.00000 x[ 4] = 11.00000

Page 95: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm IV.33 Quy hoạch rời rạc

Số lượng lát cắt : 4 lát cắt Số bảng đơn hình đã lập : 9 bảng.

BÀI TẬP Giải các bài tập sau theo phương pháp Gomory thứ hai:

Bài 1. Max x0 = x1 + 2 * x2 x1 – 2 * x2 <= 2 - 2 * x1 + x2 <= 2 x1 + x2 <= 3

x1, x2 => 0 và nguyên

Đáp số : ( x0, x1, x2, x3, x4, x5) = ( 5; 1; 2; 5; 2; 0 ). Bài 2. Max x0 = 3 * x1 – x2 3 * x1 – 2 * x2 <= 3 - 5 * x1 – 4 * x2 <= -10 2 * x1 + x2 <= 5

x1, x2 => 0 và nguyên

Đáp số : ( x0, x1, x2, x3, x4, x5) = ( 1; 1; 2; 4; 3; 1 ).

Page 96: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm V.1 Quy hoạch rời rạc Chương 5

THUẬT TOÁN GOMORY THỨ BA Chương này trình bày thuật toán Gomory thứ ba nhằm xây dựng các lát cắt đảm bảo tất cả các Bảng đơn hình ở mỗi bước đều có tất cả các phần tử là nguyên

1. ẢNH HƯỞNG CỦA SAI SỐ LÀM TRÒN VÀ TƯ TƯỞNG CỦA THUẬT TOÁN GOMORY THỨ BA

1.1. Ảnh hưởng của sai số làm tròn có thể dẫn đến lời giải sai khi dùng phương pháp đơn hình giải bài toán quy hoạch tuyến tính. Khi giải bài toán quy hoạch tuyến tính nguyên ảnh hưởng sai số làm tròn tăng mạnh do các nguyên nhân sau :

- Tăng khối lượng tính toán vì dùng nhiều lần l - phương pháp.

- Khả năng mắc sai khi xử lý các số kiểu phần thập phân 0,999999 ≈ 1,000000

- Khả năng nhận lời giải không đúng vì số nguyên có thể nhận là không nguyên.

Để tránh sai số làm tròn, Gomory đưa ra thuật toán thứ ba để giải bài toán quy hoạch tuyến tính nguyên toàn phần :

01

n

ijj=1

ax (1)

a , 1, 2,..., (2)

0 , 1, 2,..., (3)

ên , 1,2,..., (4)

n

j jj

j i

j

j

m x c x

x b i m

x j n

x nguy j n

=

= =

≥ =

− =

1.2. Tư tưởng của thuật toán Gomory thứ ba

Giả sử bài toán (L,C) ≡ (L0,C) viết ở dạng bảng T0 , l - chuẩn (phần tử khác không đầu tiên ở mỗi cột là số dương). Dùng l - phương pháp, ta nhận được dãy hữu hạn các bảng l - chuẩn T0 , T1 , ... , Ts mà cái cuối cùng là chấp nhận được.

Giả sử bảng xuất phát T0 là nguyên hoàn toàn (tất cả các phần tử là số nguyên). Các bảng tiếp theo có thể không nguyên là do: ngoài các phép toán + , - , * khi chuyển từ Tν sang Tν+1 , ta còn dùng phép tính chia trên phần tử quay. Nếu phần tử quay trên tất cả các bước là (-1) thì các bảng T1 , T2 , ... vẫn là nguyên khi T0 - nguyên, cuối cùng phương án tối ưu Xs của bài toán (Ls,C) ứng với Ts cũng là nguyên. Vậy Xs là phương án tối ưu của bài toán quy hoạch tuyến tính nguyên gốc (LN,C).

Vì vậy, ta sẽ cải tiến định nghĩa lát cắt đúng sao cho nếu dòng tương ứng với nó chọn làm dòng quay thì phần tử quay bằng (-1).

Chính xác hơn, bài toán tìm lát cắt đúng nguyên được phát biểu như sau: có bài toán (L,C), các điều kiện của nó viết dưới dạng bảng nguyên, không chấp nhận được, l - chuẩn 0,

' ij ni Q j NT x

∈ ∈= , vì vậy l - giả phương án mở rộng :

( ) ( )' ' '0 1 00 10 0' , ,..., , ,...,n nX x x x x x x= =

Page 97: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm V.2 Quy hoạch rời rạc ứng với T' không là phương án mở rộng. Cần xây dựng một hàm tuyến tính :

0( ) ( )j jj N

Z X r r x∈

= + −∑ (5)

thỏa mãn các điều kiện sau :

I. Điều kiện nguyên :

rj - nguyên , 0j N∀ ∈ (6)

II. Điều kiện cắt :

Z(X') = r0 < 0 , ( )' ' '1,..., nX x x= (7)

III. Điều kiện đúng: với mọi phương án X của bài toán ( , )NL C thì

Z(X) ≥ 0. (8)

IV. Điều kiện giữ gìn tính nguyên. Nếu trong các số ( )jr j N∈ có số âm ,

0

1

j

jj

nj

xx

R

x

=

với j N∈ là cột của ma trận T' và

jj N,r 0

ex min jl

l j

RR lr r∈ <= (9)

thì

1lr = − (10)

Điều kiện (9) - (10) có nghĩa là nếu dòng Z(X) chọn làm dòng quay thì phần tử quay là (-1).

1.3. Lược đồ logic của thuật toán Gomory thứ ba

Nếu thành công xây dựng lát cắt đúng nguyên thỏa mãn (5) - (10) thì lược đồ logic của thuật toán như sau.

Bắt đầu từ bảng không chấp nhận được xuất phát T0 , xây dựng dãy các bảng

T0 , T1 , ... , Tr , Tr+1 , ... mà mỗi bảng đều là nguyên và l - chuẩn.

Nếu Tr là chấp nhận được thì l - giả phương án ứng với nó Xr đồng thời là phương án tối ưu của bài toán (LN,C).

Nếu Tr là không chấp nhận được thì xây dựng lát cắt đúng nguyên thỏa mãn (5) - (10). Viết dòng tương ứng ngay dưới bảng Tr và lấy nó làm dòng quay. Sau đó, thực hiện một bước lặp của l - phương pháp để nhận được bảng mới Tr+1 nguyên và l - chuẩn.

Page 98: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm V.3 Quy hoạch rời rạc 2. XÂY DỰNG LÁT CẮT ĐÚNG NGUYÊN, THUẬT TOÁN GOMORY THỨ BA

2.1. Cơ sở xây dựng lát cắt đúng nguyên :

Định lý 1. Giả sử 0λ >

0 0 ( )j jj T

y d d y∈

= + −∑ , trong đó T là tập hữu hạn;

( )0 jj

j T

ddz yλ λ∈

= + − ∑ , trong đó [x] - phần nguyên của x;

{ }0 , 0jy j T≥ ∈ ∪ ,

yj - nguyên , j T∈ .

Khi đó : z ≥ 0

z - nguyên.

Chứng minh. Tính nguyên của z trực tiếp suy ra từ định nghĩa phần nguyên và tính nguyên của yj ( j T∈ ).

Để chứng minh z ≥ 0 ta dùng phản chứng, giả sử z < 0. Từ tính nguyên của z suy ra

z ≤ -1. (11)

Mặt khác: 0 0 ( )jj

j T

dy d yλ λ λ∈

= + −∑ , như vậy

0 0 0( ) ( )j jj j

j T j T

d dy d dy yλ λ λ λ λ∈ ∈

= + − + + − ∑ ∑

Theo giả thiết 0 ( )jj

j T

ddz yλ λ∈

= + − ∑

suy ra 0 0 ( )jj

j T

dy d y zλ λ λ∈

= + − +

∑ , hay

0 0jj

j T

dy dy zλ λ λ∈

+ = +

∑ (12)

0 1 0.dλ

≤ − <

(do (11))

Điều này không thể sảy ra vì { }0 , 0jy j T≥ ∈ ∪ (theo giả thiết), 0λ >

và định nghĩa phần lẻ ,jd j Tλ

. Do vậy , 0z ≥ . Định lý được chứng minh.

Page 99: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm V.4 Quy hoạch rời rạc

2.2. Từ định lý trên ta xây dựng lát cắt đúng nguyên thỏa mãn (5) - (10). Giả sử cho bảng 0ij ,ni Q j N

T x∈ ∈

= nguyên, không chấp nhận được, l - chuẩn và giả sử đối với k

(1 ≤ k ≤ n):

0

0

0,( )

k

k k kj jj N

xx x x x

<

= + −∑

Đặt: T = N

0 0

0

0

j N j N

( )

( )

ax ax

j kj

k

j j

j kj

d x j N

y xy x j N

m d m xλ∈ ∈

= ∈

== ∈

= =

Như vậy: 0 , 0

1 , 0jj

j

dddλ

≥ = − < ,

và ta nhận được lát cắt đúng nguyên :

0

( ; ) 1 ( 1)( )

0ên

kj

k jj Nx

z z X x

zz nguy

λ∈<

= = − + − − ≥ −

2.3. Trong phần này ta sẽ chỉ ra trong một số trường hợp cụ thể nhận được bảng T0 nguyên, l - chuẩn :

Xét bài toán :

01

n

ijj=1

ax (13)

a , 1, 2,..., (14)

0 , 1, 2,..., (15)

ên , 1,2,..., (16)

n

j jj

j i

j

j

m x c x

x b i m

x j n

x nguy j n

=

≤ =

≥ =

− =

trong đó cj , aij , bi nguyên ( )1,..., ; 1,...,i m j n= = . Đưa vào các biến mới, bài toán trên được viết lại như sau :

Page 100: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm V.5 Quy hoạch rời rạc

01

n

ijj=1

ax ( )( )

a ( ), 1,2,....,

0, 1, 2,..., , 1,...,

ên , 1, 2,..., , 1,...,

n

j jj

n i i j

j

j

m x c x

x b x i m

x j n n n m

x nguy j n n n m

=

+

≡ − −

= + − =

≥ = + +

− = + +

Ta có các biến x1 , ... , xn là biến phi cơ sở , viết bảng '0T (chưa l - chuẩn).

1 -x1 -x2 ... -xj ... -xn x0 0 -c1 -c2 ... -cj ... -cn x1 0 -1 0 ... 0 ... 0 x2 0 0 -1 ... 0 ... 0

... ...

xn 0 0 0 ... 0 ... -1 xn+1 b1 a11 a12 ... a1j ... a1n xn+2 b2 a21 a22 ... a2j ... a2n

... ...

xn+i bi ai1 ai2 ... aij ... ain

... ... xn+m bm an1 am2 ... amj ... amn

(Bảng '0T )

a) Nếu bảng '0T là l - chuẩn (ví dụ khi cj < 0 , 1,...,j n= ) thì xem nó là bảng xuất

phát T0 (lấy '0T làm T0 xuất phát).

b) Nếu '0T không là l - chuẩn, nhưng tập các phương án của bài toán (13)-(15) là

bị chặn thì ta giải bài toán quy hoạch tuyến tính với hàm mục tiêu n

jj=1

x∑ với ràng buộc

(14)-(15) và tìm được: n

jj=1

ax x 'm M=∑

Rõ ràng, với mọi phương án của bài toán (13) - (16) ta đều có :

[ ]n

jj=1

x 'M M≤ ≡∑

Vì vậy, từ bài toán này ta có thể đưa vào biến mới :

Page 101: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm V.6 Quy hoạch rời rạc

n

1 jj=1

1

1

1.(-x ) (17)

0 (18)ên (19)

n m

n m

n m

x M

xx nguy

+ +

+ +

+ +

= +

≥−

Viết dòng (17) xuống dưới bảng '0T và chọn nó làm dòng quay. Cột quay chọn

theo tiêu chuẩn:

{ }

' '

1,...,ex minl jj n

R l R∈

=

( 'jR - là cột của '

0T ứng với biến phi cơ sở ( 1,..., )jx j n= ).

Thực hiện một bước lặp của l - phương pháp, xóa dòng xn+m+1 (dòng cuối của bảng '

0T ) và nhận được bảng T0 nguyên, l - chuẩn. Nếu sau này biến xn+m+1 đưa vào cơ sở thì dòng tương ứng không được phục hồi.

2.4. Thuật toán Gomory thứ ba

Bước lặp 0.: Xây dựng bảng xuất phát 0

00 ij ,ni Q j NT x

∈ ∈= - nguyên , l - chuẩn. Nếu

T0 là chấp nhận được thì l - giả phương án mở rộng : ( ) ( )0 0 0 0 0 0 0

0 1 00 10 0, ,..., , ,...,n nX x x x x x x= = là phương án tối ưu mở rộng của bài toán (LN,C) và thuật toán dừng. Nếu T0 không chấp nhận được thì chuyển tới bước lặp đầu tiên.

Bước lặp p (p ≥ 1). Cho bảng 01

P-11 ij ,n P

P i Q j NT x

−− ∈ ∈= - nguyên , l - chuẩn nhưng

không chấp nhận được. Chọn k là chỉ số đầu tiên vi phạm tính chấp nhận được

{ }{ }10min | 1,2,..., , 0Pik i i n x −= ∈ <

Nếu 110 ,P

kj Px j N−−≥ ∀ ∈ thì bài toán (LN,C) không giải được.

Nếu 1 0Pkjx−∃ < thì ta chọn cột cột quay l theo công thức :

1

1 1

, 0ex min

P kj

P Pl j

j N xR l R

− −

∈ <= (20)

và xây dựng lát cắt đúng nguyên (dòng quay) :

1

110 ( ) (21)

0 (22)ên

P

PPkjk

n P jj N

n P

n P

xxx x

xx nguy

λ λ−

−−

+∈

+

+

= + −

(23)

Quy tắc chọn λ như thế nào ta sẽ trình bày trong Mục 2.5.

Viết dòng (21) vào cuối bảng TP-1 và lấy làm dòng quay. Thực hiện một bước lặp của l - phương pháp (loại xn+P khỏi cơ sở, đưa xl vào cơ sở), xóa dòng xn+P. Nếu l ≥ n+1 thì dòng xl không khôi phục nữa, ta sẽ nhận được bảng

Page 102: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm V.7 Quy hoạch rời rạc

0

Pij ,n P

P i Q j NT x

∈ ∈=

là nguyên và l - chuẩn, trong đó :

{ }( ) { }1 \P PN N l n p−= ∪ +

Nếu TP là chấp nhận được thì ( ) ( )0 1 00 10 0, ,..., , ,...,P P P P P P Pn nX x x x x x x= = là phương án

tối ưu mở rộng của bài toán (LN,C) . Nếu TP không châp nhận được thì chuyển tới bước (p+1).

2.5. Quy tắc chọn số λ . Số λ được chọn theo ba điều kiện sau

I. Phần tử quay bằng (-1) :

1

1Pklxλ

− = −

(24)

II. Bảng TP phải là l - chuẩn :

1

1 1 0PkjP P P

j j l

xR R R

λ

−− −

= + >

, (25)

{ }( )1\ \{ }P Pj N n p N l−∀ ∈ + =

III. Cột 0PR phải là lexmin :

1

1 100 0 ex min

PP P Pk

lxR R R lλ

−− −

= + →

(26)

Chú ý :

1) 1

1 01

PP Pln P l

RR R−

−+

−= = >

− suy ra bất đẳng thức (25) đúng với j = n + p rồi.

2) Từ (24) và 1 0Pklx− < (do(20)) suy ra 0λ >

2.6. Xác định λ thỏa mãn (24) - (26) a) Điều kiện (24) có thể viết thành :

1

1 0Pklxλ

− ≤ < ,

do 0λ > nên ta có : 1P

klxλ −≥ − (24')

b) Điều kiện (25) có thể đơn giản hóa bằng cách sau.

Nếu 1 0Pkjx− ≥ thì

11 0

Pkj P

l

xR

λ

−−

và điều kiện (25) đúng với bất kỳ 0λ > . Do

vậy, chỉ cần xét điều kiện (25) với :

1 \{ }Pj N l−∈ mà 1 0Pkjx− < .

Page 103: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm V.8 Quy hoạch rời rạc

Với mỗi 1Pj N −∈ , ta đặt :

{ }( ) min | 0 .p-1ijh j i x= >

Từ (20) suy ra P-1P-1 kj( ) ax{h(j)|j N , x <0}h l m= ∈ . Rõ ràng, nếu h(j) < h(l) thì

với bất kỳλ ta có : 1

1 1 0PkjP P P

j j l

xR R R

λ

−− −

= + >

Do đó, trường hợp này (25) cũng đúng.

Như vậy, chỉ cần xét (25) với :

1 \{ }Pj N l−∈ mà 1 0Pkjx− < và h(j) = h(l).

Khi đó, điều kiện (25) được viết lại là :

1

1 1 '10 ,

PkjP P P

j j l P

xR R R j N

λ

−− −

= + > ∀ ∈

(25')

{ }' P-11 1 kj| \{ } , x 0 , ( ) ( )P PN j j N l h j h l− −= ∈ < =

Nếu '1PN − = ∅ thì (25') không cần thêm bất cứ điều kiện nào trên số 0λ > . Bây

giờ giả sử '1PN − ≠ ∅ . Khi đó đối với mỗi '

1Pj N −∈ ta có thể tìm được số tự nhiên zj sao cho :

1 1 1 1( 1) 0P P P Pj j l j j lR z R R z R− − − −− + < < − (27)

Chú ý rằng 1 1P P

j lR zR− −≠ với z bất kỳ, vì nếu 1 1P Pj lR zR− −= thì

0 1

P-1ij ,

det 0Pi N j N

x−∈ ∈= , điều này là không thể. Do đó 1 1à P P

j lR v R− − là không tỉ lệ với

nhau.

Có 4 khả năng :

1) 1 1( ) ( )P Ph l j h l lx x− −= . Khi đó nếu chọn zj = 1 thì (27) thỏa mãn.

2) 1 1( ) ( )P Ph l j h l lx qx r− −= + trong đó q, r là các số tự nhiên, 1

( )Ph l lr x −< . Khi đó nếu chọn

chọn zj = q thì (27) được thỏa mãn.

3) 1 1P Pij ilx qx− −= , i = h(l) , h(l) + 1 , ... , h(l) + t ≡ s - 1, và

1 1P Psj slx qx− −> trong đó q là số tự nhiên ≥2.

Khi đó, nếu ta chọn zj = q thì (27) đúng.

4) 1 1P Pij ilx qx− −= , i = h(l) , h(l) + 1 , ... , h(l) + t ≡ s - 1, và

1 1P Psj slx qx− −< , trong đó q là số tự nhiên ≥ 2.

Khi đó, ta chọn zj = q - 1 thì (27) đúng.

Page 104: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm V.9 Quy hoạch rời rạc

Từ (27) và (25') suy ra cần chọn số λ thỏa mãn: 1

'1,

Pkj

j P

xz j N

λ

− ≤ ∀ ∈

, hay

1Pkj

j

xz

λ

≥ − , suy ra 1P

kj

j

xz

λ−

≥ − . Vậy điều kiện (25') chuyển thành điều kiện sau:

P-1kj '

1j

xax -

z Pm j Nλ θ −

≥ ≡ ∈

(25'')

trong đó zj - được chọn theo 4 khả năng đã trình bày ở trên.

c) Xét điều kiện (26). Vì λ > 0 , 1 10 0, 0P Pk lx R− −< > nên điều kiện (26) được viết lại

như sau :

minλ → (26')

Cuối cùng từ (24') , (25'') , (26') ta có :

{ }P-1klax -x ,mλ θ= (28)

2.7. Giải ví dụ bằng số Giải bài toán quy hoạch nguyên sau:

Max 43210 3663 xxxxx −−+=

3984

9667259224

41

321

4321

4321

≤≤−+−≥+++≤−−−

xxxxx

xxxxxxxx

4- 8-

8

4321 ,,, xxxx nguyên.

Sau khi thêm biến bù bài toán viết lại thành

Max 43210 3663 xxxxx −−+=

43215 92245 xxxxx +++−=

43216 66729 xxxxx ++++−=

3217 9848 xxxx +−+=

418 483 xxx ++=

876543210 ,,,,,,,, xxxxxxxxx nguyên

Page 105: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm V.10 Quy hoạch rời rạc

Từ đây ta có bảng đơn hình xuất phát (Bảng 1). Vì bảng đơn hình không là l-

chuẩn nên ta phải thêm ràng buộc phụ 1004321 =≤+++ gzxxxx hay

43219 100 xxxxx −−−−= - và 09 ≥x và viết vào phía dưới bảng 1. Chọn dòng x9

làm dòng quay. 1 -x1 -x2 -x3 -x4

x0 0 -3 -6 6 3

x1 0 -1 0 0 0

x2 0 0 -1 0 0

x3 0 0 0 -1 0

x4 0 0 0 0 -1

x5 5 4 -2 -2 -9

x6 -9 -2 -7 -6 -6

x7 8 -4 8 -9 0

x8 3 -8 0 0 -4

Bảng 1 x9 100 1 1* 1 1

Thực hiện một bước của đơn hình đối ngẫu từ vựng ta được bảng 2 là l-chuẩn. Vì

x7 <0 nên sinh ra lát cắt x10 và chọn nó làm dòng quay.

Bảng 2 x10 -66 -1* -1 -2 -1

Tiếp tục dùng thuật toán đơn hình đối ngẫu từ vựng ta được bảng 3 là l- chuẩn và

không chấp nhận được. Vì x5 <0 nên sinh ra lát cắt x11 và chọn nó làm dòng quay.

1 -x1 -x9 -x3 -x4

x0 600 3 6 12 9

x1 0 -1 0 0 0

x2 100 1 1 1 1

x3 0 0 0 -1 0

x4 0 0 0 0 -1

x5 205 6 2 0 -7

x6 691 5 7 1 1

x7 -792 -12 -8 -17 -8

x8 3 -8 0 0 -4

Page 106: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm V.11 Quy hoạch rời rạc

1 -x10 -x9 -x3 -x4

x0 402 3 3 6 6

x1 66 -1 1 2 1

x2 34 1 0 -1 0

x3 0 0 0 -1 0

x4 0 0 0 0 -1

x5 -191 6 -4 -12 -13

x6 361 5 2 -9 -4

x7 0 -12 4 7 4

x8 531 -8 8 16 4

Bảng 3 x11 -15 0 -1* -1 -1

Tiếp tục dùng thuật toán đơn hình đối ngẫu từ vựng ta được bảng 4 là l- chuẩn và

không chấp nhận được. Vì x7 <0 nên sinh ra lát cắt x12 và chọn nó làm dòng quay. 1 -x10 -x11 -x3 -x4

x0 357 3 3 3 3

x1 51 -1 1 1 0

x2 34 1 0 -1 0

x3 0 0 0 -1 0

x4 0 0 0 0 -1

x5 131 6 -4 -8 -9

x6 331 5 2 -11 -6

x7 -60 -12 4 3 0

x8 441 -8 8 8 -4

Bảng 4 x12 -15 0 -1 -1 -1*

Tiếp tục dùng thuật toán đơn hình đối ngẫu từ vựng ta được bảng 5 là l- chuẩn và

không chấp nhận được. Vì x7 <0 nên sinh ra lát cắt x13 và chọn nó làm dòng quay.

Page 107: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm V.12 Quy hoạch rời rạc

1 -x10 -x11 -x3 -x12

x0 312 3 0 0 3

x1 51 -1 1 1 0

x2 34 1 0 -1 0

x3 0 0 0 -1 0

x4 15 0 1 1 -1

x5 4 6 5 1 -9

x6 421 5 8 -5 -6

x7 -60 -12 4 3 0

x8 471 -8 12 12 -4

Bảng 5 x13 -5 -1* 0 0 0

Tiếp tục dùng thuật toán đơn hình đối ngẫu từ vựng ta được bảng 6 là l- chuẩn và

không chấp nhận được. Vì x5 <0 nên sinh ra lát cắt x14 và chọn nó làm dòng quay. 1 -x13 -x11 -x3 -x12

x0 297 3 0 0 3

x1 56 -1 1 1 0

x2 29 1 0 -1 0

x3 0 0 0 -1 0

x4 15 0 1 1 -1

x5 -26 6 5 1 -9

x6 396 5 8 -5 -6

x7 0 -12 4 3 0

x8 511 -8 12 12 -4

Bảng 6 x14 -3 0 0 0 -1*

Thực hiện một bước của thuật toán đơn hình đối ngẫu từ vựng ta được bảng l-

chuẩn chấp nhận được có cột phương án là nguyên và quá trình lặp kết thúc.

Page 108: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm V.13 Quy hoạch rời rạc

1 -x13 -x11 -x3 -x14

x0 288 3 0 0 3

x1 56 -1 1 1 0

x2 29 1 0 -1 0

x3 0 0 0 -1 0

x4 18 0 1 1 -1

x5 1 6 5 1 -9

x6 414 5 8 -5 -6

x7 0 -12 4 3 0

x8 523 -8 12 12 -4

Bảng 7

Bảng tổng hợp :(Phương án và giá trị λ ở mỗi bước) P

x p0 x p1 x p2 x p3 x p4 x p5 x p6 x p7 x p8 λ

1 600 0 100 0 0 205 691 -792 3 12

2 402 66 34 0 0 -191 361 0 531 13

3 357 51 34 0 0 -131 331 -60 411 9

4 312 51 34 0 15 4 421 -60 471 12

5 297 56 29 0 15 -26 396 0 511 9

6 288 56 29 0 18 1 414 0 523

Vậy phương án tối ưu là (56, 29, 0, 18, 1, 414, 0, 523) với trị hàm mục tiêu là

x[0]=288.

3. CHƯƠNG TRÌNH MÁY TÍNH • Thuật toán này dùng để giải bài toán quy hoạch tuyến tính nguyên hoàn toàn ,

có dạng:

max1

0 →=∑=

j

m

jj xcx

ij

m

jij bxa ≤∑

=1, pi ,...,1=

0≥jx , mj ,...,2,1=

jx nguyên.

Page 109: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm V.14 Quy hoạch rời rạc các b[i] có thể dương và âm, phương án xuất phát không đối ngẫu chấp nhận được.

Nếu bài toán có ràng buộc đẳng thức dạng: ii

m

jij bxa =∑

=1 thì ta thay thế bằng hai

bất đẳng thức:

ii

m

jij bxa ≤∑

=1và ii

m

jij bxa ≥∑

=1.

Sau khi thêm biến bù bài toán trên có thể viết ở dạng:

max))((1

0 →−−=∑=

m

jjj xcx

mjxx jj ,...,2,1))(1( =−−=

.,...,2,1))((1

pixabx j

m

jijiim =−−+= ∑

=+

.,...,2,10 pmjx j +=≥

jx nguyên. .,...,2,1 pmj +=

• Trong chương trình sử dụng các biến và mảng sau:

- m: số biến chính, n: số biến chính và biến bù của bài toán (n=m+p), gz là một

số dương đủ lớn và thường lấy bằng },,{max jiij cba .

- ss = 1 nếu bảng đơn hình s ban đầu là l- chuẩn, =2 nếu bảng không là l - chuẩn

- Mảng s gồm n + 2 dòng và m+1 cột lúc đầu ghi dữ liệu của bài toán sau đó lưu

bảng đơn hình ở mỗi bước. Dòng n+1 để chứa ràng buộc phụ.

- s[0][0] hàm mục tiêu, cột 0 là cột phương án, dòng 0 là các ước lượng

- cs : các biến ở bên trái bảng đơn hình, nc : các biến phi cơ sở

•Cách nhập dữ liệu

Dữ liệu ban đầu của bài toán được ghi trong một tệp văn bản, gồm có:

- n, m, gz, ss.

- Mảng s dữ liệu ban đầu bố trí dạng (ở dưới) và được ghi vào tệp dữ liệu theo

từng dòng :

Page 110: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm V.15 Quy hoạch rời rạc

- Tiếp đến là mảng cs: nhập các số từ 0, 1, 2,…, n

- Cuối cùng là mảng nc: nhập các số từ 1, 2,…, m

•Với dữ liệu bài toán trên thì ta có tệp dữ liệu VDG3.CPPcó dạng:

8 4 100 2

0 -3 -6 6 3

0 -1 0 0 0

0 0 -1 0 0

0 0 0 -1 0

0 0 0 0 -1

5 4 -2 -2 -9

-9 -2 -7 -6 -6

8 -4 8 -9 0

3 -8 0 0 -4

0 1 2 3 4 5 6 7 8

1 2 3 4

•Văn bản chương trình

#include <stdio.h>

#include <conio.h>

#include <math.h>

-x1 -x2 . . . . . . . . . –xm

0 -c1 -c2 . . . . . . . . –cm x0

x1

x2

xm

0

0

0

-1 0 . . . . . . . . . . 0

0 -1 . . . . . . . . . 0

0 0 . . . . . . . . . . -1

xm+1

xn

b1

bp

-a11 . . . . . . . . . - a1m

-ap1 . . . . . . . . . .-ap,m

Page 111: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm V.16 Quy hoạch rời rạc #include <dos.h>

#define M 30

#define N 30

long int s[N+2][M+1],gz,t1,t2,lamda; double r;

int sb,cmin,m,n,i,j,k,l,lc,tg,cs[N+2],nc[M+1], np[M+1];

int ka,blap,hl,hj,trong,zj[M+1],q,is,ss;

unsigned long far *t; char *s1,*s2;

FILE *f1,*f2;

void biendoi();

void inbang(int cuoi);

void main()

{ clrscr();

t= (unsigned long far *)MK_FP(0,0X46C); t1=*t;

printf("\nCo in trung gian hay khong 1/0 ? ");

scanf("%d%*c",&tg);

// Nhap du lieu ban dau

printf("\nVao ten tep so lieu : "); gets(s1);

f1= fopen(s1,"r"); fscanf(f1,"%d%d%ld%d",&n,&m,&gz,&ss);

for(i=0;i<=n;i++)for(j=0;j<=m;j++) fscanf(f1,"%ld",&s[i][j]);

for (i=0; i<=n;i++) fscanf(f1,"%d",&cs[i]) ;

for (j=1; j<=m; j++) fscanf(f1,"%d",&nc[j]);

fclose(f1);

sb=1; blap=0;

// In kiem tra ket qua nhap

printf("\n n,m,gz,ss = %d %d %10ld %d",n,m,gz,ss);

if (tg==1){ printf("\nVao ten tep chua ket qua : "); gets(s2);

f2=fopen(s2,"w");

fprintf(f2,"\n n,m,gz,ss = %d %d %10ld %d",n,m,gz,ss);

}

printf("\nBang 1, so lieu ban dau:");

if (tg==1) fprintf(f2,"\nBang 1, so lieu ban dau:");

inbang(0);

// Kiem tra l- chuan

if (ss==1){

printf("\nBang 1, so lieu ban dau, l- chuan");

if (tg==1)

Page 112: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm V.17 Quy hoạch rời rạc

fprintf(f2,"\nBang 1, so lieu ban dau, l- chuan");

lc = n; goto Lap1;}

// Them rang buoc phu, tim bang l- chuan

cs[n+1]=n+1; s[n+1][0]=gz;

for (j=1;j<=m; j++) s[n+1][j]=1;

printf("\nBang %d, sau khi them rang buoc phu",sb);

if (tg==1)

fprintf(f2,"\nBang %d, sau khi them rang buoc phu",sb);

inbang(1);

l=n+1;

printf("\nDong quay = %d",l);

if (tg==1) fprintf(f2,"\nDong quay = %d",l);

cmin=1;

for (j=2;j<=m;j++)

{ for (i=0; i<=n;i++)

{ if (s[i][cmin] > s[i][j]) {cmin=j; break;}

if (s[i][cmin] < s[i][j]) break;

}

}

printf("\nCot quay= %d Phan tu quay= %10ld",cmin,s[l][cmin]);

if (tg==1)

fprintf(f2,"\nCot quay= %d Phan tu quay= %10ld", cmin,s[l][cmin]);

biendoi();sb++;

printf("\nBang %d, khong ke dong n+1, l - chuan",sb);

if (tg==1)

fprintf(f2,"\nBang %d, khong ke dong n+1, l- chuan",sb);

inbang(0); lc=n+1;

//Bat dau buoc lap lon, da tim duoc bang xuat phat l- chuan

Lap1: blap++; printf("\n----------------------------------");

printf("\n\nBUOC LAP LON THU %d: ",blap);

if (tg==1) {

fprintf(f2,"\n----------------------------------------");

fprintf(f2,"\n\nBUOC LAP LON THU %d: ",blap);}

// Kiem tra cot phuong an con thanh phan am khong

ka=-1;

for (i=1; i<=n; i++) if (s[i][0]<0) {ka = i; break; }

Page 113: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm V.18 Quy hoạch rời rạc printf("\nPhan tu am cua phuong an ung voi dong %d",ka);

if (tg==1)

fprintf(f2,"\nPhan tu am cua phuong an ung voi dong %d",ka);

// Bang don hinh la toi uu

if (ka==-1) {

printf("\nPHUONG AN TOI UU QHTT NGUYEN: ");

if (tg==1)

fprintf(f2,"\nPHUONG AN TOI UU QHTT NGUYEN: ");

for (i=0; i<=n;i++)

printf("\nx[%2d] = %13ld",cs[i],s[i][0]);

printf("\nSo luong lat cat: %d lat cat",blap-1);

printf("\nSo bang da lap : %d bang",sb);

if (tg==1)

{ for (i=0; i<=n;i++)

fprintf(f2,"\nx[%2d] = %13ld",cs[i],s[i][0]);

fprintf(f2,"\nSo luong lat cat: %d lat cat",blap-1);

fprintf(f2,"\nSo bang da lap : %d bang",sb);

}

t= (unsigned long far *)MK_FP(0,0X46C);

t2=*t;

printf("\nThoi gian chay chuong trinh: %ld giay",

(long int)((t2-t1)/18.21));

if (tg==1) fprintf(f2,"\nThoi gian chay chuong trinh: %ld giay",

(long int)((t2-t1)/18.21));

fclose(f2); getch();

return;

}

// Kiem tra tinh khong giai duoc

k=0;

for (j=1; j<=m; j++) if (s[ka][j]< 0) { k=j; break;}

if (k==0) {

printf("\n \nBai toan QHTT nguyen khong giai duoc, STOP");

if (tg==1)

fprintf(f2,"\n\nBai toan QHTT nguyen khong giai duoc, STOP");

getch(); getch(); getch(); return; }

// Tim cot quay

Page 114: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm V.19 Quy hoạch rời rạc cmin=k;

for (j=k+1;j<=m;j++) if (s[ka][j]< 0)

{ for (i=0; i<=n;i++)

{ if (s[i][cmin] > s[i][j]) {cmin=j; break;}

if (s[i][cmin] < s[i][j]) break;

}

}

printf("\nCot quay = %d",cmin);

if (tg==1) fprintf(f2,"\nCot quay = %d ",cmin);

// Xay dung lat cat

lamda = -s[ka][cmin];

printf("\nlamda = %10ld",lamda);

if (tg==1) fprintf(f2,"\nlamda = %10ld",lamda);

for (j=1;j<=m;j++) np[j]=0;

for (j=1;j<=m; j++) if (s[ka][j]<0) np[j]=1; np[cmin]=0;

printf("\nMang NP : ");

for (j=1;j<=m;j++) printf("%d ",np[j]); printf("\n");

if (tg==1) {

fprintf(f2,"\nMang NP : ");

for(j=1;j<=m;j++) fprintf(f2,"%d ",np[j]); fprintf(f2,"\n"); }

// Xet np co trong hay khong

trong=1;

for (j=1; j<=m; j++) if (np[j]==1) {trong=0; break;}

if (trong==1) goto L2;

// Truong hop np khac trong, tim hl

for (i=0;i<=n;i++) if (s[i][cmin]>0) {hl=i; break;}

printf("\nh[%d] = %d",cmin,hl);

if (tg==1) fprintf(f2,"\nh[%d] = %d",cmin,hl);

// Tim cac hj ung voi cac cot ma np[j]=1

for (j=1;j<=m;j++)

if (np[j]==1)

{ for (i=0;i<=n;i++) if (s[i][j]>0) {hj=i; break;}

printf("\nh[%d] = %d",j,hj);

if (tg==1) fprintf(f2,"\nh[%d] = %d",j,hj);

if (hj != hl) np[j]=0; // np chi xet voi j ma hj=hl

}

Page 115: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm V.20 Quy hoạch rời rạc printf("\nMang NP : ");

for (j=1;j<=m;j++) printf("%d ",np[j]); printf("\n");

if (tg==1) {

fprintf(f2,"\nMang NP : ");

for(j=1;j<=m;j++) fprintf(f2,"%d ",np[j]); fprintf(f2,"\n"); }

// Kiem tra tap np khac trong hay khong

trong=1;

for (j=1; j<=m; j++) if (np[j]==1) {trong=0; break;}

if (trong==1) goto L2;

// Tinh cac zj

for (j=1;j<=m;j++) zj[j]=0;

for (j=1;j<=m;j++) if (np[j]==1)

{ if (s[hl][j]==s[hl][cmin]) zj[j]=1; // kha nang 1

else

{if (s[hl][j]%s[hl][cmin]>0) zj[j]=s[hl][j]/s[hl][cmin]; // kha nang 2

else { q = s[hl][j]/s[hl][cmin]; is = hl;

while (s[is][j]== q* s[is][cmin]) is++;

if (s[is][j]> q* s[is][cmin]) zj[j]=q; // kha nang 3

else zj[j]=q-1; // kha nang 4

}

}

}

// In mang ZJ

printf("\nMang ZJ : ");

for (j=1;j<=m;j++) printf("%d ",zj[j]); printf("\n");

if (tg==1) {

fprintf(f2,"\nMang ZJ : ");

for(j=1;j<=m;j++) fprintf(f2,"%d ",zj[j]); fprintf(f2,"\n"); }

// Tinh lai lamda

for (j=1;j<=m;j++) if (np[j]==1)

{ if ((-s[ka][j])%zj[j]==0) q= (-s[ka][j])/zj[j];

else q= (-s[ka][j])/zj[j]+1;

if (q>lamda) lamda=q; }

// Da tinh xong lamda, xay dung lat cat

L2: printf("\nlamda cuoi cung = %ld",lamda);

if (tg==1) fprintf(f2,"\nlamda cuoi cung = %ld",lamda);

Page 116: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm V.21 Quy hoạch rời rạc lc++; cs[n+1]=lc;

for (j=0; j<=m; j++)

{ if (s[ka][j]>=0) s[n+1][j]=s[ka][j]/lamda;

else

{ if ((-s[ka][j])%lamda==0) s[n+1][j]=s[ka][j]/lamda;

else s[n+1][j]=s[ka][j]/lamda-1; }

}

printf("\nBang %d, sau khi them lat cat moi",sb);

if (tg==1)

fprintf(f2,"\nBang %d, sau khi them lat cat moi",sb);

inbang(1);

// Bien doi bang don hinh

l=n+1 ; printf("\nDong quay = %d",l);

if (tg==1) fprintf(f2,"\nDong quay = %d",l);

biendoi(); sb++;

printf("\nBang %d, khong ke dong n+1",sb);

if (tg==1) fprintf(f2,"\nBang %d, khong ke dong n+1",sb);

inbang(0);

goto Lap1;

}

void biendoi()

{ for (j=0;j<=m;j++) if (j!= cmin)

{ for (i=0;i<=n;i++) if (i!=l)

s[i][j]=s[i][j]-(s[l][j]/s[l][cmin])*s[i][cmin];

s[l][j]=0;

}

for(i=0;i<=n;i++)if (i!=l) s[i][cmin]=-s[i][cmin]/s[l][cmin];

s[l][cmin]=-1; nc[cmin]=cs[l];

}

void inbang(int cuoi)

{ int n1; if (cuoi==1) n1=n+1; else n1=n;

printf("\nCo so : ");

for (i=0; i<=n1;i++) printf("%d ",cs[i]) ; printf("\n");

printf("Phi co so : ");

for (j=1; j<=m; j++) printf("%d ",nc[j]);printf("\n");

for (i=0;i<=n1;i++) { for (j=0; j<=m;j++)

Page 117: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm V.22 Quy hoạch rời rạc printf(" %10ld ",s[i][j]);

printf("\n"); }

if (tg==1) {

fprintf(f2,"\nCo so : ");

for(i=0; i<=n1;i++) fprintf(f2,"%d",cs[i]); fprintf(f2,"\n");

fprintf(f2,"Phi co so : ");

for(j=1;j<=m;j++) fprintf(f2,"%d ",nc[j]);fprintf(f2,"\n");

for (i=0;i<=n1;i++) { for (j=0; j<=m;j++)

fprintf(f2," %10ld ",s[i][j]);

fprintf(f2,"\n"); }

}

getch();

}

• Sau khi chạy chương trình ta nhận được lời giải tối ưu của bài toán trên là:

x[ 0] = 288 x[ 1] = 56 x[ 2] = 29 x[ 3] = 0 x[ 4] = 18 x[ 5] = 1 x[ 6] = 414 x[ 7] = 0 x[ 8] = 523 Số lượng lát cắt: 5 lát cắt Số bảng đã lập : 7 bảng

BÀI TẬP Giải các bài toán quy hoạch tuyến tính nguyên sau bằng thuật toán Gomory thứ

ba:

Bài 1. Max x0 = x1 + x2

3 * x1 + 2 * x2 <= 5

x2 <= 2

x1, x2 => 0 và nguyên

Đáp số : (x0, x1, x2, x3, x4) = (2; 1; 1; 0; 1)

Bài 2. Max x0 = 3 * x1 – 4 * x2

- 2 * x1 + x2 <= 3

x1 – 2 * x2 <= 3

2 * x1 + x2 <= 10

Page 118: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm V.23 Quy hoạch rời rạc

x1, x2 => 0 và nguyên

Đáp số : (x0, x1, x2, x3, x4, x5) = (9; 3; 0; 9; 0; 4)

Bài 3. Max x0 = x1 – x2

- 2 * x1 + 2 * x2 + x3 = 2

x1 – 2 * x2 + x4 = 3

x1 + x2 + x5 = 6

x1, x2, x3, x4, x5 => 0 và nguyên

Đáp số : (x0, x1, x2, x3, x4, x5) = ( 4; 5; 1; 10; 0; 0)

Bài 4. Max x0 = x1 – 2 * x2

5 * x1 – 2 * x2 <= 3

x1 + x2 => 1

-3 * x1 + x2 <= 3

x1, x2, x3 => 0 và nguyên

Đáp số : ( x0, x1, x2, x3, x4, x5) = ( -1; 1; 1; 0; 1; 5)

Bài 5.

( )0 1 2

1 2 3

1 2 4

1 2 5

ax

9

4 7 4

5 6 6

0, 1,...,5

ªn, j=1,...,5

j

j

m x x x

x x x

x x x

x x x

x j

x nguy

≡ ++ + =

− + + =− + =≥ =−

Đáp số : ( x0, x1, x2, x3, x4, x5) = (5; 3; 2; 4; 2; 3)

Bài 6. Max 43210 252 xxxxx ++−=

6557 4321 ≤−+−− xxxx 493765 4321 ≤+−− xxxx

24642 4321 −≤−+− xxxx -3 ≤+++ 4321 89 xxxx

16827 4321 ≤+−−− xxxx

43210 ,,,, xxxxx nguyên. Đáp số: phương án tối ưu mở rộng (294, 26, 0, 40, 34, 10, 1, 192, 655, 26)

Page 119: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm VI.1 Quy hoạch rời rạc

Chương 6

THUẬT TOÁN NHÁNH CẬN 1. TƯ TƯỞNG CỦA THUẬT TOÁN NHÁNH CẬN 1.1. Trong các phương pháp giải bài toán qui hoạch nguyên, phương pháp nhánh cận là một trong các phương pháp có hiệu quả. Phương pháp nhánh cận được Land A.H và Doig A.G xây dựng năm 1960 giải bài toán qui hoạch nguyên (trình bày Tiết 2), đến 1963 được Little J.D, Murty K.G, Sweeney D.W và Karen C sử dụng thành công giải bài toán người du lịch (trình bày trong Tiết 3). Năm 1979 Giáo sư Hoàng Tụy đã ứng dụng thành công phương pháp này vào giải bài toán qui hoạch lõm. Đây là thuật toán ứng dụng rộng rãi để giải các bài toán tối ưu khó.

Xét bài toán qui hoạch rời rạc ( )min ,Z f X= (1)

X G∈ (G là tập hữu hạn ) (2) 1.2. Tư tưởng của phương pháp nhánh cận gồm các phép xây dựng sau cho phép

giảm bớt khối lượng lựa chọn.

1. Tính cận dưới. Tìm cận dưới của hàm mục tiêu ( )f x trên tập các phương án

G (hoặc trên tập con G′ nào đó của G ) tức là số ( )Gζ hay ( )Gζ ′ sao cho:

( ) ( )f x Gζ≥ với x G∀ ∈ ( hay ( ) ( )f x Gζ ′≥ với x G′∀ ∈ ).

2. Chia thành các tập con (rẽ nhánh ). Chia dần dần tập phương án G thành cây các tập con (các nhánh). Việc chia nhánh thực hiện theo sơ đồ nhiều bước sau:

Bước 0. Đặt 0G G≡ . Bằng một cách nào đó 0G được chia thành một số hữu hạn các tập con ( thường là không giao nhau)

11 1 11 2, ,...., rG G G .

Bước 1k ≥ . Có tập 1 2, ,....,k

k k krG G G cần chia nhánh. Ta chọn tập ( )

kkGϑ theo một

qui tắc nào đó và chia thành một số hữu hạn các tập con : ( ) ( ) ( ),1 ,2 , ( ), ,....,k k kk k k s kG G Gϑ ϑ ϑ ,

gồm có ( )s k tập. Khi đó, tập cần chia nhánh tiếp theo là

1 2 1 1, ,...., , ,...,k k k

k k k k krG G G G Gϑ ϑ− + , ( ) ( ) ( ) ( ),1 ,2 ,, ,....,k k k

k k k s kG G Gϑ ϑ ϑ

Ta đánh số lại là 1

1 1 11 2, ,....,

kk k k

rG G G+

+ + + .

3. Tính lại đánh giá

Nếu tập 1 2G G⊂ thì ( ) ( )1 2

min minX G X G

f X f X∈ ∈

≥ .

Vì vậy khi chia tập G′ thành 1 2, ,...., sG G G′ ′ ′ sao cho 1

's

ii

G G=

′=∪ thì cận của bất

kì tập iG′ đều có ( ) ( ) ( ), 1,..,iG G i sζ ζ′ ′≥ = . Trong các tình huống cụ thể ta thường

nhận được các đánh giá tốt , tức là đối với một i nào đó ( ) ( ).iG Gζ ζ′ ′

Page 120: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm VI.2 Quy hoạch rời rạc

4. Tính phương án Đối với các bài toán cụ thể có thể chỉ ra các phương pháp khác nhau để tìm ra các

phương án trong các tập con được chia liên tiếp. Phương pháp này dựa trên đặc thù của mỗi bài toán cụ thể. Nhờ phương án mới tìm được ở mỗi bước ta có thể cải tiến cận trên (ban đầu gán cho cận trên giá trị là +∞ ) bằng cách gán cho cận trên giá trị hàm mục tiêu tốt nhất tại thời điểm đó.

5. Tiêu chuẩn tối ưu. Giả sử 1

s

ii

G G=

=∪ và phương án X Gϑ∈ thỏa mãn điều

kiện: ( ) ( ) ( ) , 1,..,if X G G i sϑζ ζ= ≤ ∀ = thì X là phương án tối ưu của bài toán

(1)-(2). Qui tắc này được ứng dụng ở giai đoạn chia nhánh .

6. Đánh giá độ chính xác của lời giải xấp xỉ. Giả sử

( )1,..,1

, mins

i ii siG G Gζ ζ

=== =∪ .

Nếu X là một phương án của bài toán xuất phát thì ( ) ( )minx G

f X f Xζ∈

≤ ≤ . Nếu

( )f X ζ− đủ nhỏ thì X có thể lấy làm lời giải xấp xỉ với đánh giá độ xấp xỉ là

( )f X ζ∆ = − .

1.3. Lược đồ tổng quát của phương pháp nhánh cận. Chia tập phương án G thành cây tập con.

Bước 0. Tính ( ) ( )0G Gζ ζ= . Nếu tìm được phương án X sao cho

( ) ( )f X Gζ= thì X là phương án tối ưu. Ngược lại, chia 0G = 1

1 1 11 2 .... rG G G∪ ∪ ∪ ,

tức là chia thành các tập con (thường là không giao nhau).

Bước 1k ≥ . Tính các đánh giá ( ) , 1,..,ki kG i rζ = . Nếu tìm được phương án X ,

krX G∈ sao cho ( ) ( ) ( ) ,k k

r if X G Gζ ζ= ≤ với 1,2,.., ki r∀ = , thì X là phương án

tối ưu, quá trình kết thúc. Ngược lại, chọn ( )k

kGϑ để chia, theo tiêu chuẩn

( )( ) ( )1,..,

mink

k kik i r

G Gϑζ ζ=

= . Ta chia tập ( )k

kGϑ thành một số tập con

( ) ( ) ( ) ( ) ( ),1 ,2 ,....k k k kk k k k s kG G G Gϑ ϑ ϑ ϑ= ∪ ∪ ∪ .

Tập cần chia tiếp theo là

1 2 1 1, ,...., , ,...,k k k

k k k k krG G G G Gϑ ϑ− + , ( ) ( ) ( ),1 ,2 ,, ,....,

kk k k

k k k sG G Gϑ ϑ ϑ

Sau đó ta đánh số lại là 1

1 1 11 2, ,....,

kk k k

rG G G+

+ + + và sang bước k+1.

Page 121: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm VI.3 Quy hoạch rời rạc

2. PHƯƠNG PHÁP LAND VÀ DOIG GIẢI BÀI TOÁN QUI HOẠCH NGUYÊN

2.1. Xét bài toán qui hoạch nguyên tuyến tính sau:

( )1

minn

j jj

Z f X c x=

= =∑ (3)

với các điều kiện ràng buộc

ijj=1

, 1,..,n

j i ia x R b i m=∑ (quan hệ thứ tự { }, ,iR ∈ ≤ ≥ = ) (4)

0 , 1,.., .j jx d j n≤ ≤ = (5)

jx nguyên 11,..,j n= 1n n≤ (6)

trong đó jd là cận trên của biến jx (có thể jd = +∞ ). Giả thiết tập tất cả các điểm x thỏa mãn (4)-(5) là bị chặn.

Nếu 1n n= , ta có bài toán qui hoạch nguyên hoàn toàn, còn nếu 1n n< thì có bài toán qui hoạch nguyên bộ phận. Ngoài ra, bài toán tìm max có thể qui về bài toán tìm min bằng cách đổi dấu hàm mục tiêu. Có nhiều phương pháp giải bài toán qui hoạch nguyên tuyến tính, trong đó có phương pháp nhánh cận. A.H Land và A.G Doig (1960) là những người đầu tiên áp dụng phương pháp nhánh cận để giải bài toán qui hoạch tuyến tính nguyên.

2.2. Nội dung phương pháp

1. Cho tập 0G G≡ xác định bởi (4) - (6).

2. Cho các tập ( )k

kGϑ , 1,.., ,krϑ = và 1,2,....k = . xác định bởi (4),(6) và ràng buộc

bổ sung:

, 1,..,j j jk k

h x d j nϑ ϑ

≤ ≤ =

. (7)

3. Tính cận. Đối với 0G ước lượng ( ) ( )00G f Xζ = với 0X là lời giải của bài

toán qui hoạch tuyến tính (3)-(5).

Đối với kGϑ thì ( )k kG f Xϑζ

ϑ

=

, trong đó k

là lời giải của bài toán qui

hoạch tuyến tính (3),(4) và (7).

Nếu ( )kGϑ = ∅ thì ( )kGϑζ = +∞ .

4. Tính phương án. Nếu 0X thỏa mãn điều kiện nguyên (6), thì 0X là nghiệm tối ưu của bài toán ban đầu, thuật toán dừng.

Page 122: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm VI.4 Quy hoạch rời rạc

Nếu k

thỏa mãn điều kiện nguyên (6) thì nó là phương án tối ưu của bài toán

(3), (4), (7), (6) và nó cũng là một phương án của bài toán ban đầu. Lấy k

để cải

tiến cận trên.

5. Chia nhánh. Cần chia nhánh khi ( )

kX

không thỏa mãn điều kiện nguyên

(6). Giả sử ( ) 1,1r

kx r n

≤ ≤

là một thành phần không nguyên của phương án này,

khi đó tập hợp ( )k

kGϑ chia thành hai tập hợp ( ) ( ) ( ),1 ,2k k k

k k kG G Gϑ ϑ ϑ= ∪ , trong đó

( ) ( ) ( )

( ) ( ) ( )

,1

,2

| ,

| , 1

k kr rk k

k kr rk k

kG X X G x x

k

kG X X G x x

k

ϑ ϑ

ϑ ϑ

ϑ

ϑ

= ∈ ≤

= ∈ ≥ +

Chú ý rằng nếu tất cả jc trong (3) là nguyên với 1j n≤ và 10jc khi j n= ≥ thì

cận dưới ( )kGϑζ có thể dùng đánh giá mạnh hơn ( ) ( )k kG f Xϑ ϑζ ′ =

, ở đây kí hiệu

] [f là số nguyên nhỏ nhất mà lớn hơn hay bằng f .

2.3. Giải ví dụ bằng số Xét bài toán qui hoạch nguyên tuyến tính sau:

min -x1 -x2 (8) 2x1 + 11 x2 ≤ 38 x1 + x2 ≤ 7 (9) 4 x1 - 5x2 ≤ 5 x1, x2 ≥ 0 (10) x1, x2 nguyên (11)

Bước 0. Giải bài toán (8)-(10), tìm được nghiệm 0 4 54 ,29 9

X =

. Cận dưới

( ) ( ) ] [0 0 7 7G f Xζ ′ = = − = −

. Phương án 0X không thỏa mãn điều kiện nguyên

(11). Chúng ta chia 0G thành hai tập hợp 0 1 11 2G G G= ∪ , trong đó

{ }{ }

1 01 1

1 02 1

| , 4

| , 5

G X X G x

G X X G x

= ∈ ≤

= ∈ ≥

Page 123: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm VI.5 Quy hoạch rời rạc

Bước 1. Giải hai bài toán quy hoạch tuyến tính: cực tiểu (8) trên hai tập hợp 11G

và 12G . Trong bài toán đầu tiên cực tiểu trên miền 1

1G đạt tại điểm 84,211

, do đó

( )11

86 611

Gζ ′ = − = − . Tập 1

2G là trống nên ( )12Gς = +∞ .

Chọn 11G để chia nhánh ta được:

{ }{ }

1 1 21,1 1 2 1

1 1 21,2 1 2 2

| , 2

| , 3

G X X G x G

G X X G x G

= ∈ ≤ ≡

= ∈ ≥ ≡

1 22 3G G= =∅

Bước 2. Giải các bài toán qui hoạch tuyến tính:

1) Tìm cực tiểu (8) trên 21G được ( )2

12 3 33 , 2 5 51 4 4

X Gζ ′= ⇒ = − = −

2) Tìm cực tiểu (8) trên 22G được ( )2

22 1 12 ,3 5 52 2 2

X Gζ ′= ⇒ = − = −

3) 1 22 3G G= =∅ , ( )2

3Gζ ′ = +∞

Chọn 21G để chia nhánh :

{ }{ }

2 2 31,1 1 1 1

2 2 31,2 1 1 2

| , 3

| , 4

G X X G x G

G X X G x G

= ∈ ≤ ≡

= ∈ ≥ ≡

Đánh số lại 2 3 2 3 2 3 2 31,1 1 1,2 2 2 3 3 4, , ,G G G G G G G G≡ ≡ = ≡

Bước 3. Giải các bài toán qui hoạch tuyến tính:

1) Tìm cực tiểu (8) trên 31G được ( ) ( ) ] [3

13

3, 2 5 51

X Gζ ′= ⇒ = − = −

2) 32G =∅ ( )3

2Gζ ′⇒ = +∞

3) Tìm cực tiểu (8) trên 33G được

( )33

3 2 1 12 ,3 5 53 2 2 2

X X Gζ ′= = ⇒ = − = −

4) 3 24 3G G= =∅ ( )3

4Gζ ′⇒ = +∞

Page 124: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm VI.6 Quy hoạch rời rạc

Phương án ( )33, 2

1X X = =

thỏa mãn điều kịên nguyên (11). Đồng thời

( ) ( ) ( ) ( ){ } { } ( )3 3 3 31 2 3 4min , , , min 5, , 5, 5G G G G f Xζ ζ ζ ζ ζ′ ′ ′ ′ ′= = − ∞ − ∞ ≤ = − .

Vậy phương án tối ưu của bài toán ban đầu là ( )3, 2X = .

Ta có cây phân nhánh sau:

3. PHƯƠNG PHÁP NHÁNH CẬN GIẢI BÀI TOÁN NGƯỜI DU LỊCH

3.1. Phát biểu bài toán. Có n thành phố, đánh số từ 1 đến n . Xuất phát từ một trong n thành phố này, chẳng hạn thành phố 1, một người du lịch muốn tới thăm n -1 thành phố còn lại, mỗi thành phố đúng một lần, rồi trở về thành phố xuất phát. Cho biết

ijc là chi phí (hoặc là khoảng cách) đi từ thành phố i đến thành phố j . Giả thiết

0, ,ij iic i j c> ∀ ≠ = ∞ , với mọi i ( có thể ij jic c≠ ). Hãy tìm hành trình với tổng chi phí nhỏ nhất?

Ký hiệu ma trận , 1,....,ij i j n

C c=

= , 1ijx = hoặc 0 tùy thuộc người du lịch có đi từ

thành phố i tới thành j hay không. Khi đó bài toán người du lịch có thể viết dưới dạng:

11

6G

ζ ′ = −

0

7G

ζ ′ = −

1 2 32 3 4G G Gζ≡ ≡′ = +∞

1 21,1 1

5

G Gζ

′ = −

1 2 31,2 2 3

5

G G Gζ

≡ ≡

′ = −

2 31,1 1

5

G Gζ

′ = −

2 31,2 2G G

ζ

= =∅

′ = +∞

Page 125: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm VI.7 Quy hoạch rời rạc

1 1

min ij ij

n n

i jc x

= =∑∑ (12)

{ }

ij1

ij1

ij

ij

1, 1, 2,..., (13)

1, 1, 2,..., (14)

0;1 , , 1,2,..., (15)

1, 2 i j n (16)

n

j

m

i

i j

x i n

x j n

x i j nu u nx n

=

=

= =

= =

∈ =

− + ≤ − ≤ ≠ ≤

trong đó iu nhận giá trị nguyên hay thực.

3.2. Thuật toán nhánh cận Tập tất cả các phương án của bài toán (tập 0S )sẽ được chia nhỏ dần thành nhiều

tập con rời nhau, mỗi tập con bao gồm những phương án đi qua và không đi qua một số cặp thành phố nhất định sẽ được ấn định dần trong quá trình giải bài toán. Mỗi tập con này được gắn với một số thực không âm (cách tìm số này xem ở phần tiếp theo), biểu thị cận dưới của chi phí đối với mọi phương án thuộc tập này. Tập con kS có cận dưới nhỏ nhất sẽ có nhiều khả năng chứa phương án tối ưu, vì thế tập kS sẽ được chọn để chia nhỏ tiếp (phân nhánh). Khi phân nhánh 1 2k k kS S S= ∪ sao cho một tập 2kS bắt buộc đi qua thêm một cặp thành phố rsx nào đó (cách chọn xem ở phần tiếp theo), một tập 1kS không được đi qua cặp thành phố rsx . Khi một tập con nào đó chỉ gồm một phương án duy nhất thì ta sẽ tính được chi phí C của phương án này và nhờ đó có thể cải tiến được phương án tốt nhất hiện biết, giá trị hàm mục tiêu của bài toán ứng với phương án tốt nhất hiện biết gọi là giá trị kỷ lục. Tập con nào có cận dưới lớn hơn hay bằng giá trị kỷ lục sẽ bị loại (không cần xem xét tiếp nữa), vì chắc chắn tập này không chứa phương án nào tốt hơn phương án tốt nhất hiện biết. Quá trình giải kết thúc khi không còn tập con nào cần xem xét tiếp. Khi đó, phương án tốt nhất hiện biết sẽ là phương án tối ưu của bài toán. Tính hữu hạn của thuật toán được suy ra từ tính hữu hạn của tập 0S .

Thủ tục tính cận

Bổ đề. Phương án tối ưu *x vẫn còn là tối ưu nếu ma trận chi phí C được thay bởi ma trận C′ với

, ( , 1, 2,.., )ij ij i jc c i j nα β′ = − − = (17)

trong đó ,i jα β là các số thực bất kỳ.

Chứng minh. Xét một phương án bất kỳ x của bài toán. Do *x là phương án tối ưu nên

*ij ij

1 1 1 1

n n n n

ij iji j i j

c x c x= = = =

≤∑∑ ∑∑

Từ các hệ thức (12) và (17) ta có:

Page 126: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm VI.8 Quy hoạch rời rạc

( )* * *ij ij ij

1 1 1 1 1 1 1 1

ij ij1 1 1 1 1 1

n n n n n n n n

ij i j ij ij i ji j i j i j i j

n n n n n n

ij i j iji j i i i j

c x c x c x

c x c x

α β α β

α β

= = = = = = = =

= = = = = =

′ = − − = − −

′≤ − − =

∑∑ ∑∑ ∑∑ ∑ ∑

∑∑ ∑ ∑ ∑∑

điều này chứng tỏ *x vẫn còn là phương án tối ưu.

Các số ,i jα β cần được chọn sao cho ij 0, ,c i j′ ≥ ∀ và trên mỗi hàng, mỗi cột

của ma trận C′ có ít nhất một số 0. Chẳng hạn có thể chọn iα là số nhỏ nhất trong hàng i của C và jβ là số nhỏ nhất trong cột j của ma trận thu được từ C bằng cách trừ các

phần tử trên hàng i cho iα , trừ các phần tử trên cột j cho jβ .

Phép toán (17) được gọi là phép rút gọn ma trận hay thủ tục rút gọn và hằng số

1 1

n n

i ji i

γ α β= =

= +∑ ∑ được gọi là hằng số rút gọn và đó chính là một cận dưới cho giá trị

hàm mục tiêu của bài toán, vì mỗi phương án của người du lịch sẽ chứa đúng một phần tử của mỗi hàng và đúng một phần tử của mỗi cột trong ma trận chi phí .

Tương tự, nếu tập con các phương án, ký hiệu là pS thu được từ tập ban đầu 0S

bằng cách cố định một số biến ijx ở giá trị 1 hay 0 (nghĩa là cho phép đi qua hay cấm

không được đi qua một số cặp thành phố nào đó) thì để tính cận dưới cho pS ta chỉ việc

tiến hành thủ tục rút gọn trên ma trận tương ứng với pS .

Thủ tục phân nhánh Giả sử ta cần phân nhánh tập 0pS S⊂ . Cách hay dùng là phân chia tập này thành

hai tập con rời nhau ,p pS S′ ′′ với

{ }{ }

| , 0 ,

| , 1

p p rs

p p rs

S x x S x

S x x S x

′ = ∈ =

′′ = ∈ =.

trong đó, rsx là biến chưa cố định ở giá trị 0 hay 1 trong tập pS .

Cặp ( ),r s dùng để phân nhánh được chọn sao cho tập pS ′′ có nhiều khả năng

chứa phương án tối ưu, còn tập pS ′ thì không. Nói cách khác, ( ),r s được chọn sao cho

hiệu số các cận dưới của pS ′′ và pS ′ là lớn nhất có thể được.

Để giải quyết vấn đề này, ta chỉ cần xét tập các phương án ban đầu 0S , vì mọi bài toán con nhận được về sau có cùng cấu trúc như đối với bài toán ban đầu. Giả sử ma trận chi phí C đã được rút gọn , nghĩa là 0, ,ijc i j≥ ∀ và trên mỗi hàng , mỗi cột của

C có ít nhất một số 0. Tập 0S được chia thành hai tập rời nhau 1S và 2S với

Page 127: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm VI.9 Quy hoạch rời rạc

{ }{ }

1 0

2 0

| , 0 ,

| , 1rs

rs

S x x S x

S x x S x

= ∈ =

= ∈ =

Trong tập 2S cấu trúc bài toán không thay đổi, trừ ra hàng r và cột s bị loại, bởi vì đã đi từ r đến s thì không thể đi từ r đến bất cứ nơi nào khác, và cũng không được phép đi từ bất cứ đâu vào s . Các hàng và cột còn lại chỉ chứa các phần tử không âm, vì thế ứng với 2S một cận dưới đối với giá trị hàm mục tiêu tăng thêm là ( )2 rsS cγ = .

Trong tập 1S do cố định 0rsx = nên từ các điều kiện (14), (15) suy ra phải có một

( )1rjx j s= ≠ và một ( )1isx i r= ≠ . Vì thế ( )1 min minrj isj s i rS c cγ

≠ ≠= + là một cận dưới

đối với giá trị mục tiêu tăng thêm. Ta sẽ chọn biến rsx sao cho hiệu giữa các cận dưới này là lớn nhất, nghĩa là đạt

( ) ( ){ }1 2( , )max

r sS Sγ γ− (18)

Nếu 0rsc > thì ( )1 0Sγ = (do trên hàng r và cột s của C đều chứa số 0),

còn ( )2 0rsS cγ = > , từ đó ( ) ( )1 2 0S Sγ γ− < . Vì thế để có (18) ta chỉ cần xét các cặp

( ),r s với 0.rsc = Trong trường hợp này ( )2 0Sγ = và ( )1 0Sγ ≥ .

Điều này có nghĩa là thay cho (18) ta có thể chọn biến rsx để phân nhánh theo qui tắc

( ) ( )0

, max , min minpq

pj iqj q i pcr s p q c cθ θ

≠ ≠=

= = +

.

Lập luận trên đây cũng đúng cả khi các tập phương án iS về sau được chia thành các tập 1,r rS S + , nhưng thay cho mức tăng của các cận dưới ( )2Sγ và ( )1Sγ ta xét mức

tăng của các cận dưới ( )rSγ và ( )1rSγ + tương ứng.

Ngăn cấm tạo các chu trình con

Nếu tập được xét không phải là 0S mà là

{ }1 1 2 20 1 2| , , ,.....,k kp i j i j i j kS x x S x x xδ δ δ= ∈ = = = ,

thì qui tắc chọn biến để phân nhánh về cơ bản vẫn như trước, tuy nhiên cần tiến hành một số thay đổi . Trước hết, đó là việc thực hiện các lựa chọn bắt buộc. Chẳng hạn, nếu

0, 1,.., 1, 1,..,ujx j v v n= = − + thì tất nhiên phải có 1uvx = . Cũng làm vậy đối với các cột .

Một số loại lựa chọn bắt buộc khác: khi đã cố định 1rsx = thì phải có 0srx = bằng cách đặt src = ∞ . Hơn nữa, nếu đường đi dài nhất trong pS chứa cạnh ( ),r s gồm ít nhất 2 và nhiều nhất 2n − cạnh

( )

1 2 1 1... ... 1

1 3u u v vi i i r rs si i ix x x x x

v n+ −

= = = = = = =

≤ ≤ −

Page 128: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm VI.10 Quy hoạch rời rạc

(không có cạnh nào có dạng 1

1kix = hay 1vi jx = ), thì để ngăn cấm tạo chu trình con

dạng ( )1 2 1, ,...., , , ,ui i i r s i ta đặt 1sic = ∞ , còn để ngăn cấm tạo chu trình con dạng

( )1 2, , , ,...., ,u u vr s i i i r+ + ta đặt vi rc = ∞ . Hơn nữa, ta cần có

10

vi ix = bằng cách đặt

1vi ic = ∞ .

Để tìm 1i ta có thể đi ngược từ r và để tìm vi ta có thể đi xuôi từ s theo danh sách các biến đã cố định ở giá trị 1 trong tập pS .

Ở mỗi bước lặp, trước khi tính các cận dưới cho các tập mới, cần thực hiện những lựa chọn bắt buộc nêu trên. Có như vậy mới thu được những cận dưới chính xác và tránh được những phân nhánh vô ích.

3.3. Giải ví dụ bằng số

Giải bài toán người du lịch với ma trận chi phí ( không đối xứng ) như sau(n=6)

1 2 3 4 5 61 3 93 13 33 92 4 77 42 21 163 47 17 36 16 284 39 90 80 56 75 28 46 88 33 256 3 88 18 46 92

∞∞

∞∞

∞∞

Bước lặp 0. Tập đầu tiên 0S là tập hợp tất cả các hành trình có thể. Vì ban đầu chưa biết một phương án nào nên cận trên β = +∞ .

Tính cận dưới cho 0S . Từ ma trận (19) trừ mỗi phần tử của các hàng 1, 2, 3, 4, 5, 6 cho số nhỏ nhất trên hàng tương ứng là 3, 4, 16, 7, 25, 3 ta được một ma trận mới. Tiếp theo, trừ mỗi phần tử của các cột 3, 4 của ma trận mới cho số nhỏ nhất trên cột tương ứng là 15, 8 ta được ma trận rút gọn (20) (chưa kể các số mũ ở trên các phần tử bằng 0).

i1

i2

r s

i3

i4

(19)

Page 129: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm VI.11 Quy hoạch rời rạc

3

12

18

32

2 0

0 48

1 2 3 4 5 6

0 75 2 30 610 58 30 17 122

3 31 1 12 0 124 32 83 58 49 05 3 21 48 0 06

0 85 0 35 89

Tổng các hằng số rút gọn là 3 + 4 + 16 + 7 + 25 + 3 + 15 + 8 = 81. Vì vậy, cận dưới cho tất cả các hành trình thuộc tập 0S là 81. Điều này có nghĩa là không thể tìm được hành trình có tổng chi phí nhỏ hơn 81.

Bước lặp 1. Vì các tập cần xét chỉ có 0S nên ta chọn 0S để phân nhánh.

Chọn cung để phân nhánh. Với mỗi số 0 trong ma trận (20) ta tính số

( ), min minpj iqj q i pp q c cθ

≠ ≠= + và ghi ở phía trên bên phải của số 0, chẳng hạn

( ) ( )2,1 12, 6,3 48,....θ θ= = Ta thấy số 0 ở ô (6,3) có số mũ lớn nhất, nghĩa là

( ) ( )0

6,3 max ,pqc

p qθ θ=

= . Vì thế ta chọn cặp (6,3) để phân nhánh. Khi đó, tập tất cả các

hành trình được phân thành hai tập con: tập 1S gồm các hành trình chứa cạnh (6,3), tập

2S gồm các hành trình không chứa cạnh (6,3).

Tính cận cho tập 2S không chứa cạnh (6,3). Vì cạnh (6,3) không có mặt trong hành trình, nên ta có thể cấm việc đi theo cạnh này bằng cách đặt 63c = ∞ ở ma trận (20), tiếp theo trừ cột thứ 3 cho 48. Kết quả ta nhận được cận dưới cho tập 2S là: 2( )Sζ = 81 + 48 = 129 và ma trận tương ứng với tập này là

1 2 3 4 5 61 0 27 2 30 62 0 10 30 17 123 31 1 12 0 124 32 83 10 49 05 3 21 0 0 06 0 85 35 89

∞∞

∞∞

∞∞ ∞

Tính cận cho tập 1S chứa cạnh (6,3). Ta phải loại hàng 6 cột 3 khỏi ma trận (20), bởi vì đã đi theo cạnh (6,3) thì không thể đi từ 6 tới bất cứ nơi nào khác và cũng không được phép đi từ đâu vào 3. Hơn nữa, đã đi theo cạnh (6,3) thì không được đi từ 3 đến 6 nữa, vì vậy ta cần cấm cạnh (3,6) bằng cách đặt 36c = ∞ . Từ ma trận (20) ta thu được ma trận tương ứng với tập 1S (chưa kể các số mũ trên các số 0)

(20)

Page 130: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm VI.12 Quy hoạch rời rạc

3

15

18

32

2 0

1 2 4 5 62 30 61 0

30 17 122 031 1 123 032 83 494 0

3 215 0 0

∞∞

∞∞

Cận dưới 1( ) 81.Sζ =

Bước lặp 2. Các tập cần xét tiếp là 1S và 2S với cận dưới tương ứng là 81 và 129. Tập 1S có cận dưới nhỏ nhất sẽ được chọn để phân nhánh tiếp.

Chọn cung để phân nhánh. Với mỗi số 0 trong ma trận (21) ta tính số ( , )p qθ . Ta thấy (4,6) 32θ = có giá trị lớn nhất nên cạnh (4, 6) sẽ được chọn để phân nhánh tiếp. Tập 1S sẽ được phân thành hai tập: tập 3S gồm các hành trình đi qua cạnh (6,3) và cạnh (4,6), tập 4S gồm các hành trình đi qua cạnh (6,3) và không đi qua cạnh (4,6).

Tính cận dưới của tập 4S . Từ ma trận (21) sau khi thay 0 ở vị trí (4,6) bởi ∞ , rút gọn đi 32 đối với hàng 4 ta được ma trận ứng với tập 4S

1 2 4 5 6

1 0 2 30 6

2 0 30 17 12

3 31 1 12 0

4 0 51 17

5 3 21 0 0

∞ ∞

Cận dưới của tập 4S là 4 1( ) ( ) 32S Sζ ζ= + = 81 + 32 = 113.

Tính cận dưới của tập 3S . Từ ma trận (21) loại bỏ hàng ứng với đỉnh 4 và cột ứng với đỉnh 6. Các cạnh (6,3) và (4,6) đã nằm trong hành trình, cho nên cạnh (3,4) không thể đi qua nữa (nếu không sẽ tạo thành chu trình con). Để ngăn ngừa việc tạo ra chu trình con , ta gán cho phần tử ở vị trí (3,4) giá trị 34c = ∞ và được ma trận (không kể số mũ trên các số 0):

3

20

18

5

1 2 4 5

1 0 2 30

2 0 30 17

3 31 1 0

5 3 21 0

Cận dưới của tập 3S vẫn là 81.

(21)

(22)

Page 131: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm VI.13 Quy hoạch rời rạc

Bước lặp 3. Các tập cần xét là 2S , 3S , 4S với cận dưới tương ứng là 129, 81, 113. Tập 3S có cận dưới nhỏ nhất sẽ được chọn để chia nhánh.

Chọn cung để phân nhánh. Với mỗi số 0 trong ma trận (22) ta tính số ( , )p qθ . Cạnh (2,1) sẽ được chọn để phân nhánh. Tập 3S được chia thành hai tập:

- Tập 5S gồm các hành trình đi qua cung (6,3), (4,6), (2,1)

- Tập 6S gồm các hành trình đi qua cung (6,3), (4,6) và không đi qua cung (2,1).

Tính cận dưới cho tập 6S . Từ ma trân (22) thay 0 ở hàng 2 cột 1 bằng ∞ , trừ hàng 2 cho 17, trừ cột 1 cho 3 ta được cận dưới của 6S là 81 + 17 + 3 = 101 và ma trận tương ứng (chưa có số mũ trên các phần tử 0):

3

13

1

28 2

1 2 4 5

0 2 3012 13 03 28 1 05 0 21 0

∞ ∞

Tính cận dưới cho tập 5S . Từ ma trận (22) xoá hàng 2 cột 1, cấm cung (1,2) bằng cách cho 12c = ∞ được ma trận 3 x 3. Từ ma trận này trừ hàng 1 cho 2, trừ cột 1 cho 1 ta được cận dưới của 5S là 81 + 2 + 1 = 84 và ma trận tương ứng (chưa kể các số mũ trên các số 0):

28

20 28

20

2 4 5

0 2813 0 05 20 0

Bước lặp 4. Các tập cần xét là 2S , 4S , 5S , 6S với cận dưới tương ứng là 129, 113, 84, 101. Tập 5S có cận dưới nhỏ nhất sẽ được chọn để chia nhánh.

Chọn cung để phân nhánh. Với mỗi số 0 trong ma trận (24) ta tính số ( , )p qθ . Cạnh (1,4) sẽ được chọn để phân nhánh. Tập 5S được chia thành hai tập:

- Tập 7S gồm các hành trình đi qua cung (6,3), (4,6), (2,1), (1,4)

- Tập 8S gồm các hành trình đi qua cung (6,3), (4,6), (2,1) và không đi qua cung (1,4).

Tính cận dưới cho tập 7S . Từ ma trận (24) xoá dòng ứng với đỉnh 1 và cột ứng với đỉnh 4 được ma trận 2 x 2, trong ma trận này ta phải cấm cung (3,2) để không tạo thành chu trình bằng cách đặt 32c = ∞ vì ta đã chọn các cung đi qua các đỉnh 2, 1, 4, 6,

(23)

(24)

Page 132: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm VI.14 Quy hoạch rời rạc

3. Từ ma trận này ta trừ cột 1 đi số 20 ta được cận dưới của tập 7S là 84 + 20 = 104 và ma trận tương ứng là

2 5

3 05 0∞

Chọn hai cung cuối cùng (3,5) và (5,2) ta được một hành trình của người du lịch là (1,4), (4,6), (6,3), (3,5), (5,2), (2,1) (phương án tốt nhất hiện biết) với giá trị hàm mục tiêu là 13 + 7 + 18 + 16 + 46 + 4 = 104. Do đó cận trên được thay bởi 104β = .

Tính cận dưới cho tập 8S . Từ ma trận (24) thay 0 ở dòng thứ nhất và cột thứ 2 bằng +∞ và trừ dòng thứ nhất cho 28 ta được cận dưới của tập 8S là 84 + 28 = 112.

Loại các tập. Vì các cận dưới

7 8 4 2( ) 104 , ( ) 112 , ( ) 113 , ( ) 129S S S Sζ β ζ β ζ β ζ β= = = = =

nên các tập 7 8 4 2, , ,S S S S có thể loại khỏi việc xét về sau, ta chỉ cần xét tập 6S .

Bước lặp 5. Các tập cần xét chỉ còn 6S .

Chọn cung để phân nhánh. Với mỗi số 0 trong ma trận (23) ta tính số ( , )p qθ . Cạnh (5,1) sẽ được chọn để phân nhánh. Tập 6S được chia thành hai tập:

- Tập 9S gồm các hành trình đi qua cung (6,3), (4,6), (5,1) và không đi qua cung (2,1)

- Tập 10S gồm các hành trình đi qua cung (6,3), (4,6) và không đi qua cung (2,1), (5,1).

Tính cận dưới cho tập 10S . Từ ma trận (23) thay số 0 ở hàng ứng với đỉnh 5 và cột ứng với đỉnh 1 bởi ∞ , trừ cột 1 đi số 28 ta được cận dưới của tập 10S là 101 + 28 = 129. Cận dưới này lớn hơn cận trên 104 nên tập 10S bị loại không cần xét về sau.

Tính cận dưới cho tập 9S . Từ ma trận (23) xoá hàng ứng với đỉnh 5 và cột ứng với đỉnh 1, cấm cung (1,5) bằng cách đặt 15c = ∞ , cột thứ 2 trừ đi số 2 ta được cận dưới

9( ) 101 2 103Sζ = + = và ma trận tương ứng (chưa kể số mũ trên các số phần tử 0)

1 11

11

1

2 4 5

0 012 11 03 1 0

Bước lặp 6. Các tập cần xét chỉ còn 9S .

Chọn cung để phân nhánh. Với mỗi số 0 trong ma trận (25) ta tính số ( , )p qθ . Cạnh (1,4) sẽ được chọn để phân nhánh. Tập 9S được chia thành hai tập:

(25)

Page 133: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm VI.15 Quy hoạch rời rạc

- Tập 11S gồm các hành trình đi qua cung (6,3), (4,6), (5,1), (1,4) và không đi qua cung (2,1)

- Tập 12S gồm các hành trình đi qua cung (6,3), (4,6), (5,1) và không đi qua cung (2,1), (1,4). Tính cận dưới cho tập 11S . Từ ma trận (25) xoá hàng ứng với đỉnh 1 và cột ứng với đỉnh 4, trừ cột thứ nhất cho 1 ta được ma trận cỡ 2 x 2 và 11( ) 103 1 104Sζ = + = . Tập

11S có cận dưới bằng cận trên nên bị loại. Tính cận dưới cho tập 12S . Từ ma trận (25) thay số 0 ở dòng thứ 1 cột thứ 2 bằng ∞ và trừ cột thứ 2 đi 11 ta được cận dưới của 12S là 103 + 11 = 114. Tập 12S có cận dưới bằng cận trên nên bị loại.

Đến đây các tập cần xét là trống nên phương án tìm được ở Bước lặp 4 là hành trình tối ưu. Quá trình phân nhánh cho trong hình dưới.

0S , 81

1S , (6,3), 81 2 , (6,3)S , 129

3S , (4,6), 81 4 , (4,6)S , 113

5S , (2,1), 84 6 , (2,1)S , 101

7S , (1,4), 104 8 , (1,4)S , 112 9S , (5,1), 103 10 , (5,1)S , 129

11S , (1,4), 104 12 , (1,4)S , 114

Page 134: QUY HOẠCH RỜI RẠC - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/giao-duc-dai-cuong/toan-roi-rac/file... · Các bài tập ở cuối chương 1 có thể dùng lệnh

Bùi Thế Tâm VI.16 Quy hoạch rời rạc

BÀI TẬP Bài 1. Tìm phương án tối ưu cho bài toán người du lịch với ma trận chi phí

1 2 3 4 5 61 27 43 16 30 262 7 16 1 30 253 20 13 35 5 04 21 16 25 18 185 12 46 27 48 56 23 5 5 9 5

∞∞

∞∞

∞∞

Đáp số: hành trình tối ưu là 1 – 4 – 3 – 5 – 6 – 2 – 1, trị tối ưu là 63 Bài 2. Tìm phương án tối ưu cho bài toán người du lịch với ma trận chi phí

1 2 3 4 5 61 31 15 23 10 172 16 24 7 12 123 34 3 25 54 254 15 20 33 50 405 16 10 32 3 236 18 20 13 28 21

∞∞

∞∞

∞∞

Đáp số: hành trình tối ưu là 1 – 6 – 3 – 2 – 5 – 4 – 1, trị tối ưu là 63