应用运筹学基础:线性规划 (3) - 初始可行解
这一节课讲解了利用单纯形法求解线性规划问题中,如何获得一个初始可行解。
再次加入松弛变量
松弛变量总是那么好用...考虑原问题为 $$\begin{matrix}\max\limits_{x} & z = c^Tx \\ \text{s.t.} & Ax = b \\ & x \ge 0\end{matrix}$$ 我们加入松弛变量 $\bar{x}$,把问题转化为 $$\begin{matrix}\max\limits_{x} & z = c^Tx \\ \text{s.t.} & Ax + \bar{x} = b \\ & x, \bar{x} \ge 0\end{matrix}$$ (这里我们要求 $b \ge 0$,一般的带不等式约束的线性规划问题,都能通过移项、加/减松弛变量等方法凑出 $b \ge 0$ 的只含等式约束的线性规划问题标准形式)
这样,我们就有了一个天然的初始可行解 $x = 0, \bar{x} = b$。
但还存在一个问题:$\bar{x}$ 是我们添加进去的变量,我们希望最后的最优解里,$\bar{x}$ 能全部出基(这样 $\bar{x} = 0$),只留下 $x$ 中的变量作为基变量,这样我们才能在不改变原问题的情况下,获得原问题的解。
大 M 法
一个很自然的想法,就是对不为 0 的 $\bar{x}$ 进行“惩罚”。我们可以将目标函数改为 $$z = c^Tx - M\sum_{i=1}^m\bar{x}_i$$ 如果 $M$ 是一个足够大的正数,那么如果原问题存在可行解,$\bar{x}$ 就会在 $-M$ 这个“严厉的惩罚”之下变成 0。
可是这个方法有一个很大的缺陷:$M$ 的值到底该取多少呢?如果 $M$ 的值取得太小导致 $\bar{x}$ 最后还是非 0,到底是因为 $M$ 太小了,还是因为问题本来就没有可行解呢;如果 $M$ 的值取得太大,可能会带来计算上的误差。所以这个方法貌似不太常用...
两阶段法
我们只是想要找到线性规划问题的一个初始可行解,并不一定要同时获得原问题的最优解,所以我们完全可以另外设计一个只由松弛变量组成的优化问题,解决了这个优化问题,就找到了原问题的一个可行解。我们设计优化问题如下 $$\begin{matrix}\min\limits_{\bar{x}} & \sum_{i=1}^m\bar{x}_i \\ \text{s.t.} & Ax + \bar{x} = b \\ & x, \bar{x} \ge 0\end{matrix}$$ (如果觉得看 $\max$ 比较习惯的话也可以写成 $\max\limits_{x} \quad -\sum\limits_{i=1}^m\bar{x}_i$)
对于这个优化问题,$\bar{x} = b$ 就是一个可行解,所以就不用费心再去找初始可行解了。
容易发现,如果这个优化问题的最优解的目标函数值不为 0,那么原问题无可行解;如果最优解让目标函数值为 0,就说明了存在一种 $x$ 的取值满足约束,且 $\bar{x} = 0$,这样就找到了原问题的一个可行解。我们再以这个可行解为起点,利用单纯形法求出原问题的最优解即可。
来举一个例子,考虑以下线性规划问题 $$\begin{matrix} & \max\limits_{x} \quad 4x_1-x_2+x_3 \\ \text{s.t.} & x_1+2x_2+3x_3=1 \\ & 2x_1+3x_2+2x_3 = 2 \\ & x \ge 0\end{matrix}$$ 加入松弛变量,转化为两阶段法的优化问题 $$\begin{matrix} & \max\limits_{x} \quad -x_4-x_5 \\ \text{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}$$ 利用单纯形表求解,第一次迭代:$$\begin{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 & 2\end{array}$$ 为了展示一个特殊情况,我们不按常规选择检验数最大的入基,而是选择 $x_1$ 入基,$x_4$ 出基,第二次迭代:$$\begin{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$,还是没有把 $\bar{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$。
接下来继续利用单纯形表求解原问题。第一次迭代:$$\begin{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$ 出基,第二次迭代:$$\begin{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。