Cong ty Cong Nghe Tin hoc Nha truong http://www.vnschool.net
Thuật toán đơn hình trong quy hoạch tuyến tính
28/10/2008

Đơn hình là phương pháp chỉ các phương pháp tổng quát bài toán quy hoạch tuyến tính bằng phương pháp xoay trụ (pivoting), giống như phép khử Gauss. Nó tương ứng với thao tác hình học chuyển từ đỉnh này tới đỉnh khác của đơn hình để tìm lời giải. Các thuật toán chỉ khác nhau ở thứ tự các đỉnh được xét đến.


Bài toán quy hoạch tuyến tính có thể có nhiều dạng. Ví dụ, bài toán mạng dòng chảy có các đẳng thức lẫn các bất đẳng thức, những ví dụ hình học chỉ sử dụng các bất đẳng thức. Để làm giảm bớt số hạng có thể có của bài toán, ta sẽ xét một dạng chuẩn, trong đó tất cả các ràng buộc là đẳng thức, ngoại trừ một số bất đẳng thức biểu thị các biến đều là số không âm. Dạng chuẩn này dường như quá chặt chẽ, tuy nhiên ta có thể chuyển bài tổng quát về dạng này. Bài toán sau là dạng chuẩn của ví dụ 3 chiều:

Cực đại hoá x1+x2+ x3 với các điều kiện

-x1+x2+y1=5x1+4x2+y2=45

2x1+x2+y3=273x1-4x2+y4=24

x3+y5=4x1.x2.x3.y1.y2.y3.y4.y5 >= 0

 Mỗi bất đẳng thức có 2 biến trở nên chuyển thành đẳng thức bằng cách thêm vào một biến. Các biến y gọi là các biến phụ thêm(slack variable). Ngoài ra, bằng cách đổi biến ta có thể chuyển bất đẳng thức một biến thành loại ràng buộc không âm. Ví dụ một ràng buộc như x3<=-1 chuyển thành dạng chuẩn x’3>=0 với x’3 = -1-x3.

Dạng chuẩn tạo ra một tương ứng giữa bài toán quy hoạch tuyến tính và giải hệ phương trình tuyến tính. Ta có N phương trình với N ẩn (số dương). Trong trường hợp này, chú ý là ta có N biến phụ thêm, mỗi phương trình một biến (vì ta bắt đầu với một hệ toàn bất đẳng thức). Nếu M>N thì hệ phương trình có nhiều nghiệm: vấn đề là tìm một cái làm cho hàm mục tiêu cực đại.

Trong ví dụ của ta, các phương trình ràng buộc có một nghiệm tầm thường x1=x2=x3 = 0, còn các biến phụ thêm y1, y2, y3, y4, y5 thì lấy các giá trị thích hợp. Điều này xảy ra vì (0, 0, 0) là một điểm của đơn hình trong ví dụ này. Trong trường hợp tổng quát, điều này không đúng, tuy nhiên ta sẽ giới hạn sự chú ý vào các bài toán như vậy cũng còn rất lớn: ví dụ, nếu tất cả các số ở vế phải của các bất đẳng thức là dương và tất cả các biến phụ thêm có hệ số dương (như trong ví dụ) thì trở lại trường hợp tổng quát sau.

Cho một nghiệm với M-N biến là 0, ta có thể tìm các nghiệm khác với cùng tính chất bằng cách sử dụng một phép toán quen thuộc, lặp (pivoting). Nó giống phép khả Gauss: một phần tử a[p,q] được chọn trong ma trận hệ số, rồi lấy hàng thứ p nhân với một số thích hợp và cộng với tất cả các dòng khác để làm cho cột q trở thành 0, ngoại trừ giá trị tại giao điểm của hàng p và cột q là 1.

Hãy xét ma trận sau (biểu diễn bài toán quy hoạch trên).

 

Ma trận (N+1)(M+1) này chứa các hệ số của bài toán dạng chuẩn, với cột thứ (M+1) chứa các số ở vế tay phải của các phương trình (như trong phép khử Gauss) và hàng zero sẽ được xét sau; còn bây giờ chúng được xử lý như các hàng khác.

Trong ví dụ này, ta chỉ thực hiện các tính toán chính xác đến hai chữ số sau dấu phẩy. Như vậy, ta bỏ qua các vấn đề độ chính xác của tính toán và sai số tích luỹ. Giống như trong phép khử Gauss, các vấn đề này rất quan trọng.

Các biến tương ứng với một lời giải gọi là biến cơ sở và các biến được chuyển tthành không thể giải gọi là biến không cơ sở. Trong ma trận, các cột tương ứng với biến không cơ sở tương ứng với các cột có nhiều phần tử khác khong hơn.

Giả sử ta muốn trụ (pivot) ma trận này với p=4, q=1. Ta cộng dòng thứ tư (nhân với số thích hợp) với các dòng khác để tạo thành cột thứ nhất có tất cả là 0, ngoại trừ số 1 ở hàng4. Quá trình này cho kết quả ở bảng số sau:

 

Phép toán này bỏ cột thứ 7 khỏi cơ sở và thêm cột 1 vào cơ sở. Một cách chính xác, một cột cơ sở đã được chuyển.

Theo định nghĩa, ta có thể nhận được một nghiệm của các bài toán bằng cách cho tất cả các biến không cơ số thành 0, rồi dùng nghiệm tầm thường cho trong cơ sở. Trong ví dụ trên, ta cho x2và x3 là 0 vì chúng là biến không cơ sở và x1=8, vậy ma trận tương ứng với điểm (8,0,0) trong đơn hình (chúng ta không chú ý đến giá trị của các biến phụ thêm). Chú ý rằng gốc trên bên phải của ma trận (hàng 0, cột M+1) chứa giá trị của hàm mục tiêu tại điểm này.

Bây giờ, giả sử ta thực hiện phép toán xoay trục với p=3, q=2

 

Nó xoá cột 6 khỏi cơ sở và thêm cột 2 vào. Bằng cách cho các biến không cơ sở là 0 và giải các biến cơ cở như trước ta thấy ma trận này tương ứng với điểm (12, 3, 0) của đơn hình, giá trị của hàm mục tiêu tại dó là 15. Chú ý là giá trị của hàm mục tiêu tăng nghiêm ngặt.

Ta làm cách nào để xác định p và q để thực hiện phép toán mà giá trị hàm mục tiêu sẽ tăng lên? Hàng số 0 sẽ được dùng để xác định p, q. Ta sẽ chọn cột q ở vị trí mà giao điểm của cột q và hàng 0 là một số âm. Sau đó hàng p sẽ được xác định sao cho phần tử của hàng ở cột q và cột M+1 là các số không âm. Trong thủ tục tìm q, p này, có hai khó khăn: Thứ nhất, điều gì xảy ra nếu không có phần tử nào của cột q là số dương? Đó là một trường hợp mâu thuẫn: phần tử âm ở cột q, hàng 0 cho thấy hàm mục tiêu có thể tăng lên được, tuy nhiên lại không có cách để tăng lên, trường hợp này xảy ra khi và chỉ khi đơn hình là không bị chậm, vậy thuật toán có thể kết thúc và báo kết quả. Một khó khăn tinh tế khác là phần tử ở cột (M+1) của hàng đã chọn (với phần tử dương ở cột q) là 0. Hàng này có thể sử dụng, nhưng giá trị của hàm mục tiêu không tăng lên. Nếu có hai hàng như vậy ta sẽ gặp trường hợp thuật toán lặp vô hạn. Chúng ta có thể tránh những khó khăn như vậy nếu mô tả phương pháp thật rõ ràng nhưng cần nhấn mạnh rằng các trường hợp suy yếu như vậy có thể xảy ra trong thực tế. Có nhiều phương pháp để tránh bị lặp. Một phương pháp là ngừng một cách ngẫu nhiên. Một phương pháp khác chống bị lặp sẽ mô tả dưới đây.

Trong ví dụ, có thể làm một lần nữa với q=3 (vì giá trị ở cột 3, hàng 0 là -1 <0) và p=5 (vì chỉ có 1 là giá trị dương ở cột 3). Ta được ma trận sau:

 

Nó tương đương với điểm (12, 3, 4) trên đơn hình, giá trị hàm mục tiêu ở trường hợp này là 19.

Nói chung, có nhiều cách chọn phần tử âm ở hàng 0. Chúng ta đang thực hiện theo phương pháp phổ thông nhất, phương pháp “tăng nhanh nhất”: luôn luôn chọn cột có phần tử nhỏ nhất ở hàng 0 (giá trị lớn nhất theo trị tuyệt đối). Nếu cách chọn cột này kết hợp với sự chọn các hàng (tính từ sự thay đổi của cột có chỉ số nhỏ nhất của cơ sở) thì sự lặp sẽ không xảy ra. Một khả năng chọn cột khác là tính các giá trị cảu hàm mục tiêu ứng với mỗi cột rồi sử dụng cột nào cho kết quả lớn nhất. Phương pháp này gọi là phương pháp “dốc xuống nhất”.

Cuối cùng thực hiện một lần nữa với p=2, q=7, ta được nghiệm:

 

Nó tương ứng với điểm (9, 9, 4) trên đơn hình, hàng mục tiêu đạt cực trị tại giá trị 22. Tất cả các phần tử cảu hàng 0 bây giờ là không âm, vậy sự tiếp tục chỉ làm giảm giá trị của hàm mục tiêu.

Ví dụ trên cho thấy sơ qua phương pháp đơn hình. Tóm lại, nếu ta bắt đầu một ma trận hệ số tương ứng với một điểm của đơn hình, ta có thể thực hiện các bước liên tiếp trên các đỉnh của đơn hình để tăng dần giá trị của hàm mục tiêu cho tới lúc cực đại đạt được.

Cài đặt thuật toán

Việc cài đặt phương pháp đơn hình trong trường hợp đã mô tả hoàn toàn trực tiếp. Đầu tiên ta cần một thủ tục dùng làm phép khử Gauss.

Procedure pivot(p,q:integer);

var j, k : integer;

begin

for j:=0 to N do

for k:=M+1 downto1 do

if (j<>p) and (k<>q) then a[j,k]:= a[j,k]-a[p,k]*a[j,p]/a[p,q];

for j:=0 toN do

if j<>p then a[j,p]:=0;

for k:=1 toM+1 do

if k<>q then a[p,k] :=a[p,k]/a[p,q];

a[p,q]:=1;

end;

Chương trình pivot trên cộng bội số của hàng pvới mỗi hàng để được một cột q có tất cả các phần tử là 0 trừ số 1 ở hàng p. Cần phải giữ các giá trị cảu a[p,q] không thay đổi trước khi ta kết thúc việc sử dụng nó.

Khác với phép khử Gauss dùng giải hệ tuyến tính, thuật toán đơn hình chỉ bao gồm việc tìm giá trị của p và q như đã mô tả rồi gọi pivot, lặp lại quá trình này tới khi đạt được cực trị hay là tới lúc đơn hình được xác định là không bị chặn.

Repeat

q:=0; repeatq:=q+1 until (q:=M+1) or (a[0,q]<0);

p:=0; repeatp:=p+1 until (p=N+1)or(a[p,q]>0);

for i:=p+1 to N do

ifa[i,q]>0 then

if (a[i, M+1]/a[i,q]) then p:=i;

if (qand (pthen pivot(p,q);

until (q=M+1) or (p=N+1);

**_*

Nếu chương trình kết thúc với q=M+1 thì một nghiệm tối ưu đã được xác định, cực đại của hàm mục tiêu sẽ là a[0, M+1] và giá trị các biến có thể tìm từ cơ sở. Nếu chương trình kết thúc với p=N+1 thì miền đơn hình là không bị chặn.

Chương trình và ví dụ trên chỉ dùng để mô tả các nguyên lý chính của thuật toán đơn hình, các trường hợp phức tạp có thể nảy sinh trong áp dụng được bỏ qua. Chương trình yêu cầu ma trận phải có một cơ sở thích hợp. Chương trình bắt đầu từ giả thiết: có 1 nghiệm với M-N biến trong hàm mục tiêu là 0 còn NxN ma trận con gồm các biến thêm vào có thể chuyển thành ma trận đơn vị. Nói chung điều này không đúng cho các trường hợp tổng quát. Nếu ta tìm được một nghiệm, ta có thể dùng một phép biến đổi thích hợp (chuyển điểm này, tức nghiệm này, thành gốc toạ độ) để chuyển ma trận về dạng yêu cầu, tuy nhiên, thông thường ta chẳng biết bài toán như vậy có một nghiệm cần thiết hay không.

Thực ra, việc chỉ ra rằng bài toán có nghiệm hay không cũng khó khăn như việc tìm ra được nghiệm tối ưu. Vì thế, ta không nên ngạc nhiên khi kỹ thuật dùng để chỉ ra sự tồn tại nghiệm cũng chính là phương pháp đơn hình! Đặc biệt, ta thêm vào một số biến s1, s2, …sN và thêm biến sivào phương trình thứ i. Nó được thực hiện bằng cách thêm vào ma trận N cột lấp đầy với ma trận đơn vị. Nó cho tức khắc một cơ sở thích hợp cho một chương trình quy hoạch tuyến tính mới. Điều thú vị ở đây là chạy thuật toán trên với hàm mục tiêu –s1-s2-…-sN. Nếu bài toán đầu có một nghiệm thhì hàm mục tiêu này có thể cực đại hoá tại 0. Nếu cực đại đạt đượctại một điểm khác 0 thì bài toán quy hoạch tuyến tính ban đầu là không thích hợp. Nếu cực đại là 0 thì trường hợp bình thường là s1,…sN trở thành các biến không cơ sở, vậy ta có thể tính được một cơ sở thích hợp cho bài toán ban đầu. Trong trường hợp suy biến, bài biến thêm vào có thể còn trong cơ sở, vậy ta cần thiết phải thực hiện tiếp quá trình lặp để loại các biến này.

Tóm lại, một quá trình gồm hai bước thường được sử dùng để giải bài toán tuyến tính tổng quát. Thứ nhất, ta giải bài toán quy họch tuyến tính với các biến s thêm vào để nhận được một điểm trên đơn hình của bài toán ban đầu của ta. Sau đó, ta bỏ các biến này rồi đưa vào hàm mục tiêu cảu bài toán ban đầu để tìm lời giải.

Việc phân tích đánh giá thời gian xử lý của phương pháp đơn hình cực kỳ phức tạp và thu được rất ít kết quả. Không ai biết được một phương pháp lặp tốt nhất vì không có một kết quả nào để ta có thể tính được bao nhiêu bước cần làm trong một lớp bài toán có ý nghĩa. Có thể xây dựng các ví dụ cho thấy thời gian xử lý có thể rất lớn. Tuy nhiên, khi sử dụng thuật toán này, chúng ta sẽ đều nhất trí coi tiêu chuẩn kiểm nghiệm là hiệu quả trong các bài toán thực tế.
URL của bài viết này::http://www.vnschool.net/modules.php?name=News&file=article&sid=2587
© Cong ty Cong Nghe Tin hoc Nha truong contact: sales@schoolnet.vn