【运筹与优化】单纯形法解线性规划问题(matlab实现)


单纯形法是一种解线性规划问题的算法,其求解过程是通过构造一个单纯形表实现的,具体步骤如下:

单纯形法步骤:

1.将线性规划问题化为标准形式

标准形式如下:
线性规划的标准形式
其特点是:
(1) 目标函数求最大值(有时求最小值)
(2) 约束条件都为等式方程,且右端常数项 bi 都大于或等
于零
(3) 决策变量 xj 为非负

为了方便使用单纯形法来求解线性规划问题,我们需要将现有问题化为标准形式,其方法如下:

(1) 目标函数的转换
目标函数的转换
(2) 无约束变量的转换
变量的转换
(3) 约束方程由不等式转为等式
约束方程由不等式转为等式
(4) 小于等于0的变量的转换
在这里插入图片描述

以下为一将问题转化为标准形式的例子:
在这里插入图片描述

2.列出单纯形表

对于已经化为标准型的线性规划问题
线性规划的标准形式
其对应的单纯形表如下:
在这里插入图片描述
其中:
在这里插入图片描述
例如以下已经化为标准型的线性规划问题:
在这里插入图片描述
其单纯形表如下:
在这里插入图片描述

3.进行最优性检验

如果表中所有的检验数都小于等于0,则表中的基可行解就是问题的最优解,计算停止,否则进行下一步。

4.从一个基可行解转换到另一个目标值更大的基可行解,列出新的单纯形表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.重复3、4直到计算结束为止

重复3、4步骤,直到表中所有的检验数都小于等于0,计算结束,表中的基可行解就是问题的最优解。

举例

在这里插入图片描述
将问题化为标准型,加入松弛变量x3,x4:
在这里插入图片描述
运用单纯形表求解:
在这里插入图片描述
注:本次求解进行了两次迭代,上图把初始单纯形表和两次迭代时的单纯性表从上到下拼接在了一起。

单纯形法matlab实现

Simplex_eye.m:

function [x_opt, fx_opt, iter, Table] = Simplex_eye(A,b,c)

% A = [2 -3 2 1 0; 1/3 1 5 0 1];
% b = [12 20]';
% c = [1 2 1 0 0]'; 

%初始单纯型表
Table = zeros(size(A,1)+1, size(A,2)+1);
Table(1:size(A,1), 1:size(A,2)) = A;
Table(size(A,1)+1, 1:size(A,2)) = c';
Table(1:size(A,1), size(A,2)+1) = b;

[m, n] = size(Table);  %m为行数,n为列数

base = Find_indentity(A);     %调用函数,找单位矩阵的列下标

iter = 0;  %迭代次数

while sum(Table(size(Table,1), 1:size(Table,2))>0)
%循环条件:当存在大于零的检验数就继续循环
    iter = iter + 1;
    index_col = find(Table(m,:) == max(Table(m,:))); %找最大检验数所在列
    pos = find(Table(1:m-1, index_col) > 0);
    
    temp = zeros(1,size(pos,2));
    for i = 1:size(pos,1)
        temp(i) = Table(pos(i), n)/Table(pos(i), index_col);
    end
    index_row = pos(temp == min(temp));          %找主元行
    
    %以下做初等行变换
    Table(index_row,:) = Table(index_row, :)./Table(index_row,index_col);
    for i = 1:index_row-1
        Table(i,:) = Table(i,:)-Table(i,index_col)*Table(index_row,:);
    end
    for i = index_row+1 : m
        Table(i,:) = Table(i,:)-Table(i,index_col)*Table(index_row,:);
    end
    
    base(index_row) = index_col;    %换基,把第index_row个基换成index_col
end

x_opt = zeros(1,size(c,2));
for i = 1:size(base, 1)
    x_opt(1,base(i)) = Table(i,n);
end

fx_opt = -1*Table(size(Table,1), size(Table,2));

end

找单位矩阵列下标 Find_indentity.m:

function [index] = Find_indentity(A)

function [index] = Find_indentity(A)
[m,n] = size(A);
index = zeros(m,1);

for i = 1:m
    temp = find(A(i,:)==1);
    if size(temp,2) == 1
        index(i,1) = temp;
    else
        for t = 1:size(temp,2)
            flag = 0;
            for r = 1:i-1
                if A(r, temp(1, t)) ~= 0
                    flag = 1;
                    break;
                end
            end
            for r = i+1:m
                if A(r, temp(1, t)) ~= 0
                    flag = 1;
                    break;
                end
            end
            if flag == 0
                index(i,1) = temp(1, t);
                break;
            end
        end
    end
end

end
  • 27
    点赞
  • 185
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值