1、线性规划矩阵形式
线性规划标准形式的矩阵形式:
2、单纯形法原理
考虑(LP)多面体为。
解的存在性:
考虑(LP)及上述多面体S,设 A 满秩,x(1),x(2) , …,x(k)为所有极点,d(1),d(2) , …,d(l) 为所有极方向。那么,
(1) (LP)存在有界最优解的充要条件:。
(2)若(LP)存在有界最优解, 则最优解可以在某个极点达到 。
最优性定理:
考虑(LP) , 条件同上,设 x* 为极点, 存在分解 A = (B , N ),其中B为m阶非奇异矩阵,使 ), 这里 , 相应 。那么
(1)若 , 则 x*为opt.。
(2)若, 则 (LP) 无有界解。
在标准形中,有 个约束条件 (不包括非负约束), 个决策变量,且 。首先选取个基变量 ,基变量对应约束系数矩阵的列向量线性无关。通过矩阵的线性变换,基变量可由非基变量表示:
如果令非基变量等于 0, 可求得基变量的值:,如果为可行解的话,大于 0。
满足线性规划问题约束条件的所有点组成的集合就是线性规划的可行域。若可行域有界(以下主要考虑有界可行域),线性规划问题的目标函数最优解必然在可行域的顶点上达到最优。单纯形法就是通过设置不同的基向量,经过矩阵的线性变换,求得基可行解(可行域顶点),并判断该解是否最优,否则继续设置另一组基向量,重复执行以上步骤,直到找到最优解。所以,单纯形法的求解过程是一个循环迭代的过程。
3、单纯形法步骤
单纯形法的一般解题步骤可归纳如下:
- 把线性规划问题的约束方程组表达成典范型方程组,找出基本可行解作为初始基本可行解。
- 若基本可行解不存在,即约束条件有矛盾,则问题无解。
- 若基本可行解存在,从初始基可行解作为起点,根据最优性条件和可行性条件,引入非基变量取代某一基变量,找出目标函数值更优的另一基本可行解。
- 按步骤3进行迭代,直到对应检验数满足最优性条件(这时目标函数值不能再改善),即得到问题的最优解。
- 若迭代过程中发现问题的目标函数值无界,则终止迭代。
4、单纯性表格计算
5、代码实现
来自matlab 线性规划 单纯形法_线性规划单纯形法matlab_白水baishui的博客-CSDN博客
%% SimplexMax.m
function [x, c, z, pt, ind_B, ind_N] = SimplexMax(c, A, b, ind_B, iter_tag)
% 单纯形法求解标准形线性规划问题: max cx s.t. Ax=b x>=0
% 输入参数: c为目标函数系数, A为等式约束方程组系数矩阵, b为等式约束方程组常数项, ind_B为松弛变量索引
% 输出参数:
% x: 最优解, x中前len(ind_b)个是x_b, 后面的是x_N;
% c: 最优系数, c中从前往后分别是x1的系数、x2的系数、x3的系数......;
% z: 最优目标函数值 z_0;
% ST存储单纯形表数据;
% res_case=0表示有最优解,res_case=1表示有无界解
[m,n] = size(A); %m约束条件个数, n决策变量数
ind_N = setdiff(1:n, ind_B); %非松弛变量的索引
ST = [];
format rat
step_iter = 0;
% 循环求解
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); % 计算检验数
[~, k] = max(Sigma); % 选出最大检验数, 确定松弛变量索引k
Theta = b ./ A(:,k); % 计算θ
Theta(Theta<=0) = 10000;
[~, q] = min(Theta); % 选出最小θ
el = ind_B(q); % 确定出松弛变量索引el, 主元为A(q,k)
vals = [cB', ind_B', b, A, Theta];
vals = [vals; NaN, NaN, NaN, Sigma, NaN];
ST = [ST; vals];
if ~any(Sigma > 0) %此基可行解为最优解, any存在某个>0
disp('当前基可行解为最优解');
x = x0;
z = c * x;
pt = Sigma(ind_N);
res_case = 0;
return
else
disp('当前基可行解不为最优解');
x = x0;
z = c * x;
pt = Sigma(ind_N);
res_case = 0;
end % if ~any(Sigma > 0)
if all(A(:,k) <= 0) %有无界解
disp('有无界解');
x = [];
res_case = 1;
break
end % if all(A(:,k) <= 0)
step_iter = step_iter + 1;
if step_iter == iter_tag
break
end % if step_iter
% 换基
ind_B(ind_B == el) = k; % 新的松弛变量索引
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
end % function [x, c, z,ST,res_case] = SimplexMax(c,A,b,ind_B)
参考链接:
【学界】单纯形算法的原理和示例实现 - 磊磊的文章 - 知乎
https://zhuanlan.zhihu.com/p/35097686