單純形方法(原理介紹及matlab代碼)

單純形方法代碼

  代碼實現

function [x, result_case] = siminn(c, A, b, x0)

index_B = find(x0 ~=0);%找到x0中不爲0的點
index_N = find(x0 == 0);%找到x0中爲0的點

while (1)
    B = A(:, index_B);
    N = A(:, index_N);
    x_B = x0(index_B);
    x_N = x0(index_N);
    c_B = c(index_B);
    c_N = c(index_N);
    s = c_N - N' * inv(B)' * c_B; 
    %
    if isempty(find(sign(s) > 0))
        %得到更優解
        x = x0;
        result_case = 0;
        return
    end
    % 保證 s 有正數
    % 選最大的正檢驗數作爲進基變量 q
    [max_q i_q] = max(s);
    q = index_N(i_q);
    d = B \ A(:, q);
    if isempty(find(sign(d) > 0))
        % unbound case
        x = [];
        result_case = 1;
        break;
    end
    % 保證 d 有正數
    % 選擇最小非負ratio 作爲離基變量 p
    ratio_array = x_B./d;
    ratio = min(ratio_array((ratio_array > 0)));

    % 更新 x0 的值
    x0(index_B) = x_B - ratio * d;
    e_iq = zeros(length(x_N), 1);
    e_iq(i_q) = 1;
    x0(index_N) = x_N + ratio * e_iq;
    % 更新基本量,非基變量集合
    index_B = find(x0 ~=0);
    index_N = find(x0 == 0);
end
end

代碼調用

  對於問題
minf=4x1x2min f = -4x_{1}-x_{2}
限制條件
s.t.x1+2x24 s.t. -x_{1}+2x_{2} \leq 4
2x1+3x212 2x_{1}+3x_{2} \leq 12
x1x23 x_{1}-x_{2} \leq 3
x1.x20x_{1}.x_{2} \geq 0
  解:轉爲最大值問題 maxf=4x1+x2max f = 4x_{1}+x_{2}
顯然

c = [4; 1;0;0;0];

  引入鬆弛變量可得矩陣

A=[-1 2 1 0 0;2 3 0 1 0;1 -1 0 0 1];
b = [4;12;3];

  函數調用

x0 = [0; 0;b];
[x, ca] = siminn(c, A, b, x0)

  完整調用代碼

A=[-1 2 1 0 0;2 3 0 1 0;1 -1 0 0 1];
b = [4;12;3];
c = [4; 1;0;0;0];
x0 = [0; 0;b];
[x, ca] = siminn(c, A, b, x0)

單純形方法原理

  若標準形式的線性規劃有最優解,則必存在最優基本可行解​。單純形方法的基本思想就是從一個基本可行解出發,求一個使目標函數值有所改善的​基本可行解;通過不斷改進基本可行解,力圖達到最優基本可行解​。
  標準形式的線性規劃
minf=cx min f = cx s.t.Ax=b s.t. A x = b x>0x>0
  其中AAm×nm \times n矩陣ccnn維行向量,xxnn維列向量,b0b\geq 0是m維列向量。

計算步驟

  1) 解BxB=bBx_{B}=b求得xB=B1b=bˉx_{B}=B^{-1}b=\bar{b},令xN=0x_{N}=0,計算目標函數值f=cBxBf = c_{B}x_{B}
  2)求單純形乘子ww,解wB=cBwB=c_{B},進而得w=cBB1w=c_{B}B^{-1}。對於所有非基變量,計算判別數zjcj=wpjcjz_{j}-c_{j}=wp_{j}-c_{j}
  令zkck=max{zjcj}z_{k}-c_{k}= max \{z_{j}-c_{j} \}
  注:對於極大化問題,此外爲zkck=min{zjcj}z_{k}-c_{k}= min \{ z_{j}-c_{j} \}
  若zkck0z_{k}-c_{k} \leq 0,則得到最優基本可行解,循環結束;否則,進入下一步
  3)解Byk=pkBy_{k} = p_{k},得到yk=B1pky_{k} =B^{-1}p_{k},若yk0y_{k} \leq 0,即yky_{k}的每個分量均非整數,則停止計算,問題不存在最優解,否則進行步驟(4)
  4)確定下表rr,使得bˉyrk=min{bˉiyikyik0},\frac{\bar{b}}{y_{rk}} = min \{\frac{\bar{b}_{i}}{y_{ik}} \mid y_{ik} \geq 0 \},
  xBrx_{B_{r}}爲離基變量,xkx_{k}爲進基變量,用pkp_{k}替換pBrp_{B_{r}},得到新的基矩陣BB,返回第一步。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章