單純形方法代碼
代碼實現
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
代碼調用
對於問題
限制條件
解:轉爲最大值問題
顯然
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)
單純形方法原理
若標準形式的線性規劃有最優解,則必存在最優基本可行解。單純形方法的基本思想就是從一個基本可行解出發,求一個使目標函數值有所改善的基本可行解;通過不斷改進基本可行解,力圖達到最優基本可行解。
標準形式的線性規劃
其中是矩陣是維行向量,是維列向量,是m維列向量。
計算步驟
1) 解求得,令,計算目標函數值
2)求單純形乘子,解,進而得。對於所有非基變量,計算判別數
令
注:對於極大化問題,此外爲
若,則得到最優基本可行解,循環結束;否則,進入下一步
3)解,得到,若,即的每個分量均非整數,則停止計算,問題不存在最優解,否則進行步驟(4)
4)確定下表,使得
爲離基變量,爲進基變量,用替換,得到新的基矩陣,返回第一步。