matlab实现单纯型法解线性规划_线性规划问题中的多解现象

知乎用户Devin 化工系

线性规划问题中出现多个解的现象是非常常见的。代数解释是,目标向量是某些约束向量的线性组合;几何解释是目标向量垂直于那个最优超平面。

出现多解问题的几种可能性:

  1. 问题没有能够得到很好地定义,或者说问题定义得比较“松”,导致有多个解。如果约束恰当,那么可能会恰好消除掉多解。
  2. 问题的系统非常健壮,天然有一种灵活性,有多种方法得到相同的目标。如网络,有多个通路可以实现同样的目标。

当多解存在时,最优解有无穷个,可以分为两类,基本最优解(basic optimum)、非基本最优解(nonbasic optimum)。几何上看,基本最优解,就是可行域角点上的最优解,有有限个;非基本最优解是非角点上的解,有无穷个。使用不同的LP求解器会得到不同的结果,单纯形法及其变种,搜索的是角点,所以理论上通常得到基本最优解;内点法,搜索的是中心路径(central path)的解析中心(analytical center),所以理论上通常得到的是非基本最优解。相比而言,单纯形法是基本解,所以一般而言比内点法稀疏;如果希望是稀疏解,应该尽量使用单纯形法,或者带有crossover的内点法。Crossover,是CPLEX求解LP问题时,求解后默认的一个后处理方法,这个后处理可以得到近似解最近的基本最优解;多解存在时,如果使用了内点法加上crossover的后处理,得到的还是一个基本最优解。

如果换个视角,最优解集实际上可以看成凸组合,那么基本最优解是凸组合的角,所有非基本最优解可以看做基本最优解的凸组合。正是因为这样,当多解存在时,求解得到所有基本最优解最关键。Cplex 上有一个不错的关于多解的讨论(链接:CPLEX Optimizers)值得一看。我不太清楚CPLEX能不能找到LP问题的所有最优解,但是好像整数规划CPLEX是可以找到所有的最优解的(我曾经搜到过)。

搜索所有基本最优解的常见方法有两种,一种是把LP问题转化成MILP问题,效率低,个人不喜欢;另一种方法相对简单。单纯形法停止时的单纯形表中,非基变量如果有系数为零的,那么该非基变量进基,不会带来目标函数的变化,这就是多个基本最优解。可以通过让该变量进基,然后得到一个新的基本最优解。新的基本最优解,可能也存在非基变量系数为零的情况,其中一个解进基会得到刚才的解;其他的进基会得到新的基本最优解。通过这样迭代的搜寻,并且排除所有的重复的基本最优解,就得到了所有的基本最优解集。个人经验,这种方法因可能会搜索到重复的,编程上需要特殊处理(递归调用,树状搜索,不太清楚可不可以避免递归),否则一个简单的问题因为递归,就会把内存耗尽。我曾经有一个原LP问题50个变量左右,经过标准化后搜索出超过2500个基本最优解,然后内存就耗尽了。

Lee, S., Phalakornkule, C., Domach, M. M., & Grossmann, I. E. (2000). Recursive MILP model for finding all the alternate optima in LP models for metabolic networks.Computers & Chemical Engineering,24(2-7), 711-716.

Motamedian, E., & Naeimpoor, F. (2018). LAMOS: A linear algorithm to identify the origin of multiple optimal flux distributions in metabolic networks.Computers & Chemical Engineering,117, 372-377.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,我们需要明确单纯形法的基本流程: 1. 将标准线性规划问题转化为单纯形表格形式; 2. 选择初始基变量及其对应的单纯形表格; 3. 检验基变量是否为最优; 4. 如果不是最优,则选择非基变量的一个作为进入变量,利用单纯形法找到对应的出基变量,并更新单纯形表格; 5. 重复步骤3和4,直到找到最优。 下面是一个简单的 Matlab 程序,实现单纯形法的线性规划: ```matlab function [x, fval] = simplex(c, A, b) % 使用单纯形法求线性规划 % c: 目标函数系数向量,A: 约束系数矩阵,b: 约束条件右侧向量 [m, n] = size(A); % 将标准线性规划问题转化为单纯形表格形式 c = [c; zeros(m, 1)]; A = [A eye(m)]; B = n+1:n+m; N = 1:n; % 选择初始基变量及其对应的单纯形表格 while true % 检验基变量是否为最优 z = c(B)'*inv(A(:, B))*b; if all(c(N)'-c(B)'*inv(A(:, B))*A(:, N)<=0) x = zeros(n, 1); x(B) = inv(A(:, B))*b; fval = c'*[x; 0]; return; end % 选择非基变量的一个作为进入变量 j = find(c(N)'-c(B)'*inv(A(:, B))*A(:, N)>0, 1); % 利用单纯形法找到对应的出基变量,并更新单纯形表格 d = inv(A(:, B))*A(:, N(j)); if all(d<=0) error('问题无界'); end theta = min((inv(A(:, B))*b)./d); i = find((inv(A(:, B))*b)./d==theta, 1); B(i) = N(j); N(j) = n+m+i-length(B); end end ``` 这个程序使用了 Matlab 内置的矩阵计算函数,可以直接调用该函数求线性规划。使用该函数的方法如下: ```matlab % 定义目标函数系数向量、约束系数矩阵和约束条件右侧向量 c = [2; 3]; A = [-1 2; 3 2; 1 4]; b = [4; 15; 8]; % 求线性规划 [x, fval] = simplex(c, A, b); ``` 其,`x` 是最优向量,`fval` 是最优的目标函数值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值