zoukankan      html  css  js  c++  java
  • 应用运筹学基础:线性规划 (3)

    这一节课讲解了利用单纯形法求解线性规划问题中,如何获得一个初始可行解。

    再次加入松弛变量

    松弛变量总是那么好用...考虑原问题为 $$egin{matrix}maxlimits_{x} & z = c^Tx \ ext{s.t.} & Ax = b \ & x ge 0end{matrix}$$ 我们加入松弛变量 $ar{x}$,把问题转化为 $$egin{matrix}maxlimits_{x} & z = c^Tx \ ext{s.t.} & Ax + ar{x} = b \ & x, ar{x} ge 0end{matrix}$$ (这里我们要求 $b ge 0$,一般的带不等式约束的线性规划问题,都能通过移项、加/减松弛变量等方法凑出 $b ge 0$ 的只含等式约束的线性规划问题标准形式)

    这样,我们就有了一个天然的初始可行解 $x = 0, ar{x} = b$。

    但还存在一个问题:$ar{x}$ 是我们添加进去的变量,我们希望最后的最优解里,$ar{x}$ 能全部出基(这样 $ar{x} = 0$),只留下 $x$ 中的变量作为基变量,这样我们才能在不改变原问题的情况下,获得原问题的解。

    大 M 法

    一个很自然的想法,就是对不为 0 的 $ar{x}$ 进行“惩罚”。我们可以将目标函数改为 $$z = c^Tx - Msum_{i=1}^mar{x}_i$$ 如果 $M$ 是一个足够大的正数,那么如果原问题存在可行解,$ar{x}$ 就会在 $-M$ 这个“严厉的惩罚”之下变成 0。

    可是这个方法有一个很大的缺陷:$M$ 的值到底该取多少呢?如果 $M$ 的值取得太小导致 $ar{x}$ 最后还是非 0,到底是因为 $M$ 太小了,还是因为问题本来就没有可行解呢;如果 $M$ 的值取得太大,可能会带来计算上的误差。所以这个方法貌似不太常用...

    两阶段法

    我们只是想要找到线性规划问题的一个初始可行解,并不一定要同时获得原问题的最优解,所以我们完全可以另外设计一个只由松弛变量组成的优化问题,解决了这个优化问题,就找到了原问题的一个可行解。我们设计优化问题如下 $$egin{matrix}minlimits_{ar{x}} & sum_{i=1}^mar{x}_i \ ext{s.t.} & Ax + ar{x} = b \ & x, ar{x} ge 0end{matrix}$$ (如果觉得看 $max$ 比较习惯的话也可以写成 $maxlimits_{x} quad -sumlimits_{i=1}^mar{x}_i$)

    对于这个优化问题,$ar{x} = b$ 就是一个可行解,所以就不用费心再去找初始可行解了。

    容易发现,如果这个优化问题的最优解的目标函数值不为 0,那么原问题无可行解;如果最优解让目标函数值为 0,就说明了存在一种 $x$ 的取值满足约束,且 $ar{x} = 0$,这样就找到了原问题的一个可行解。我们再以这个可行解为起点,利用单纯形法求出原问题的最优解即可。

    来举一个例子,考虑以下线性规划问题 $$egin{matrix} & maxlimits_{x} quad 4x_1-x_2+x_3 \ ext{s.t.} & x_1+2x_2+3x_3=1 \ & 2x_1+3x_2+2x_3 = 2 \ & x ge 0end{matrix}$$ 加入松弛变量,转化为两阶段法的优化问题 $$egin{matrix} & maxlimits_{x} quad -x_4-x_5 \ ext{s.t.} & x_1+2x_2+3x_3+x_4 = 1 \ & 2x_1+3x_2+2x_3+x_5 = 2 \ & x ge 0 end{matrix}$$ 利用单纯形表求解,第一次迭代:$$egin{array}{c|ccccc|c} & 3 & 5 & 5 & 0 & 0 & 3 \ hline x_4 & 1 & 2 & 3 & 1 & 0 & 1 \ x_5 & 2 & 3 & 2 & 0 & 1 & 2end{array}$$ 为了展示一个特殊情况,我们不按常规选择检验数最大的入基,而是选择 $x_1$ 入基,$x_4$ 出基,第二次迭代:$$egin{array}{c|ccccc|c} & 0 & -1 & -4 & -3 & 0 & 0 \ hline x_1 & 1 & 2 & 3 & 1 & 0 & 1 \ x_5 & 0 & -1 & -4 & -2 & 1 & 0 end{array}$$ 我们发现,目标函数值已经是 0 了,但是基变量里有一个 $x_5$,还是没有把 $ar{x}$ 完全从基变量里弄出去。不过没关系,这是一个退化情况,我们有 $x_2 = x_3 = x_5 = 0$。我们此时可以让 $x_2$ 入基,$x_5$ 出基,就能把基变量变为 $x_1$ 和 $x_2$。同时也求出了原问题的一个可行解:$x_1 = 1, x_2 = x_3 = 0$,基变量是 $x_1$ 和 $x_2$。

    接下来继续利用单纯形表求解原问题。第一次迭代:$$egin{array}{c|ccc|c} & 0 & 0 & 25 & -4 \ hline x_1 & 1 & 0 & -5 & 1 \ x_2 & 0 & 1 & 4 & 0 end{array}$$ 是一个退化情况,不过我们还是继续计算。让 $x_3$ 入基,$x_2$ 出基,第二次迭代:$$egin{array}{c|ccc|c} & 0 & -25/4 & 0 & -4 \ hline x_1 & 1 & 5/4 & 0 & 1 \ x_3 & 0 & 1/4 & 1 & 0 end{array}$$ 所有检验数都非正,迭代结束。我们获得了原问题的最优解:$x_1 = 1, x_2 = x_3 = 0$,此时目标函数值为 4。

  • 相关阅读:
    猜数游戏
    计算数组长度
    python 将IP地址转换成打包后的32位格式
    nutch-2.2.1 hadoop-1.2.1 hbase-0.92.1 集群部署
    Julien Nioche谈Apache Nutch 2的特性及产品路线图
    一次心惊肉跳的服务器误删文件的恢复过程
    Http长连接200万尝试及调优
    zookeeper 系列
    Enhancing the Scalability of Memcached
    linux杂谈(十八):DNS服务器的配置(一)
  • 原文地址:https://www.cnblogs.com/tsreaper/p/aop3.html
Copyright © 2011-2022 走看看