前兩篇討論了單純形法的Matlab實現:
本篇討論對偶單純形法的Matlab實現。
原始問題的最優基也是對偶問題的可行基。換句話說,當原始問題的基 B 既是原始可行基又是對偶可行基時,B 成為最優基。
對偶單純形法思想:
對偶單純形法的步驟:
演算法步驟與單純形法基本是類似的,除了進出基的判斷規則有變化,所以,對 SimplexMax 函數稍加修改即可。
優點:
缺點(歡迎指正):
function [x,z,ST,res_case] = DualSimplexMax(c,A,b,ind_B) % 對偶單純形法求解標準形線性規劃問題: max cx s.t. Ax <= b x>=0 % 輸入參數: c為目標函數係數, A為約束方程組係數矩陣, b為約束方程組常數項, ind_B為基變數索引 % 輸出參數: x最優解, z最優目標函數值, ST存儲單純形表數據, res_case=0表示有最優解
[m,n] = size(A); %m約束條件個數, n決策變數數 ind_N = setdiff(1:n, ind_B); %非基變數的索引 ST = []; format rat % 循環求解 while true x0 = zeros(n,1); x0(ind_B) = b; %初始基可行解 cB = c(ind_B); %計算cB Sigma = zeros(1,n); Sigma(ind_N) = c(ind_N) - cB*A(:,ind_N); %計算檢驗數 [~,q] = min(b); %選出最小的b r = ind_B(q); %確定出基變數索引r Theta = Sigma ./ A(q,:); %計算θ Theta(Theta<=0) = 10000; [~,s] = min(Theta); %確定進基變數索引s, 主元為A(q,s) vals = [cB,ind_B,b,A]; vals = [vals; NaN, NaN, NaN, Sigma]; ST = [ST; vals]; if ~any(b < 0) %此基可行解為最優解, any存在某個>0 x = x0; z = c * x; res_case = 0; return end % 換基 ind_B(ind_B == r) = s; %新的基變數索引 ind_N = setdiff(1:n, ind_B); %非基變數索引 % 更新A和b A(:,ind_N) = A(:,ind_B) A(:,ind_N); b = A(:,ind_B) b; A(:,ind_B) = eye(m,m); end
測試實例:
改寫為目標最大化,並化為標準型:
A = [-2 -4 0 1 0; -2 0 -5 0 1]; b = [-2; -3]; c = [-12 -16 -15 0 0]; ind = [4 5]; [x, z, ST, ca] = DualSimplexMax(c, A, b, ind)
運行結果:
也可以進一步將對偶單純形表 ST 寫入Excel(略)。
胡運權,運籌學原理及應用(第六版),及其課件
對偶單純形法詳解,百度文庫
————————————————————————————————
原創作品,轉載請註明,版權所有,禁止盜用。