Thuật toán đơn hình trong quy hoạch tuyến tínhĐơ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ử G
Trang 1Thuật toán đơn hình trong quy hoạch tuyến tính
Đơ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).
Trang 2Ma 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
Trang 3Ta 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:
Trang 4Nó 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
Trang 5ifa[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ế