可行性与阶段 I 方法
障碍方法需要一个严格可行的初始点
基本的阶段 I 方法
考虑变量
其中
我们的目标是找到上述不等式与等式的严格可行解,或者判定不存在。为此构造优化问题
变量为
该问题总是严格可行的:
根据其最优值
- 若
,则原不等式与等式组有严格可行解。而且若 是阶段 I 问题的可行点且 ,则 满足 。这意味着不需要高精度求解阶段 I 问题:一旦 即可终止。 - 若
,则原不等式组不可行。同样不需要高精度求解:当找到一个对偶目标为正的对偶可行点(它证明 )时即可终止。此时可以从该对偶可行点构造证明不可行的 alternative(备选解)。 - 若
且最小值在 、 处取得,则不等式组可行但不严格可行。若 且最小值没有取得,则不等式组不可行。
实践中无法精确判定
不可行性之和
基本阶段 I 方法有很多变体。其中一种极小化不可行性之和(sum of infeasibilities)而不是最大不可行性:
对固定的
当等式与不等式组不可行时,该阶段 I 方法有一个非常有趣的性质:阶段 I 问题的最优点往往只违反少数(设为
例子:两种阶段 I 方法的比较。对一个不可行的不等式组

上图由下面的 TikZ 代码编译而来:
\definecolor{cblue}{RGB}{31,119,180}
\definecolor{cred}{RGB}{214,39,40}
\definecolor{cgreen}{RGB}{44,160,44}
\definecolor{corange}{RGB}{255,127,14}
\definecolor{cpurple}{RGB}{148,103,189}
\definecolor{cbrown}{RGB}{140,86,75}
\definecolor{cpink}{RGB}{227,119,194}
\definecolor{cgray}{RGB}{127,127,127}
\begin{tikzpicture}[x=1cm,y=1cm,>=stealth,line cap=round,line join=round]
\begin{scope}[xshift=0cm]
\draw[fill=cblue!70,draw=cblue] (1.0000,0) rectangle (1.2000,3.7333);
\draw[fill=cblue!70,draw=cblue] (1.2200,0) rectangle (1.4200,1.6000);
\draw[fill=cblue!70,draw=cblue] (1.4400,0) rectangle (1.6400,1.3333);
\draw[fill=cblue!70,draw=cblue] (1.6600,0) rectangle (1.8600,2.9333);
\draw[fill=cblue!70,draw=cblue] (1.8800,0) rectangle (2.0800,1.8667);
\draw[fill=cblue!70,draw=cblue] (2.1000,0) rectangle (2.3000,1.3333);
\draw[fill=cblue!70,draw=cblue] (2.3200,0) rectangle (2.5200,2.9333);
\draw[fill=cblue!70,draw=cblue] (2.5400,0) rectangle (2.7400,1.8667);
\draw[fill=cblue!70,draw=cblue] (2.7600,0) rectangle (2.9600,1.3333);
\draw[fill=cblue!70,draw=cblue] (2.9800,0) rectangle (3.1800,1.8667);
\draw[fill=cblue!70,draw=cblue] (3.2000,0) rectangle (3.4000,0.8000);
\draw[fill=cblue!70,draw=cblue] (3.4200,0) rectangle (3.6200,1.3333);
\draw[fill=cblue!70,draw=cblue] (3.6400,0) rectangle (3.8400,1.0667);
\draw[fill=cblue!70,draw=cblue] (3.8600,0) rectangle (4.0600,1.3333);
\draw[fill=cblue!70,draw=cblue] (4.0800,0) rectangle (4.2800,0.0000);
\draw[fill=cblue!70,draw=cblue] (4.3000,0) rectangle (4.5000,0.5333);
\draw[fill=cblue!70,draw=cblue] (4.5200,0) rectangle (4.7200,0.0000);
\draw[fill=cblue!70,draw=cblue] (4.7400,0) rectangle (4.9400,0.0000);
\draw[fill=cblue!70,draw=cblue] (4.9600,0) rectangle (5.1600,0.0000);
\draw[fill=cblue!70,draw=cblue] (5.1800,0) rectangle (5.3800,0.8000);
\draw[->,color=black!60] (0.8,0) -- (6,0) node[below] {$b_i-a_i^{\top}x$};
\draw[->,color=black!60] (0.8,0) -- (0.8,4.6) node[left] {};
\node[anchor=south] at (3.2,5.1) {basic (min max-infeasibility)};
\node[anchor=south,color=black!60] at (3.2,4.6499999999999995) {satisfied: 37/100};
\end{scope}
\begin{scope}[xshift=8.4cm]
\draw[fill=cblue!70,draw=cblue] (1.0000,0) rectangle (1.2000,0.2857);
\draw[fill=cblue!70,draw=cblue] (1.2200,0) rectangle (1.4200,0.8571);
\draw[fill=cblue!70,draw=cblue] (1.4400,0) rectangle (1.6400,1.1429);
\draw[fill=cblue!70,draw=cblue] (1.6600,0) rectangle (1.8600,1.4286);
\draw[fill=cblue!70,draw=cblue] (1.8800,0) rectangle (2.0800,0.2857);
\draw[fill=cblue!70,draw=cblue] (2.1000,0) rectangle (2.3000,1.1429);
\draw[fill=cblue!70,draw=cblue] (2.3200,0) rectangle (2.5200,3.1429);
\draw[fill=cblue!70,draw=cblue] (2.5400,0) rectangle (2.7400,3.4286);
\draw[fill=cblue!70,draw=cblue] (2.7600,0) rectangle (2.9600,3.1429);
\draw[fill=cblue!70,draw=cblue] (2.9800,0) rectangle (3.1800,2.5714);
\draw[fill=cblue!70,draw=cblue] (3.2000,0) rectangle (3.4000,3.7143);
\draw[fill=cblue!70,draw=cblue] (3.4200,0) rectangle (3.6200,1.4286);
\draw[fill=cblue!70,draw=cblue] (3.6400,0) rectangle (3.8400,1.7143);
\draw[fill=cblue!70,draw=cblue] (3.8600,0) rectangle (4.0600,0.5714);
\draw[fill=cblue!70,draw=cblue] (4.0800,0) rectangle (4.2800,1.4286);
\draw[fill=cblue!70,draw=cblue] (4.3000,0) rectangle (4.5000,0.8571);
\draw[fill=cblue!70,draw=cblue] (4.5200,0) rectangle (4.7200,0.5714);
\draw[fill=cblue!70,draw=cblue] (4.7400,0) rectangle (4.9400,0.5714);
\draw[fill=cblue!70,draw=cblue] (4.9600,0) rectangle (5.1600,0.0000);
\draw[fill=cblue!70,draw=cblue] (5.1800,0) rectangle (5.3800,0.2857);
\draw[->,color=black!60] (0.8,0) -- (6,0) node[below] {$b_i-a_i^{\top}x$};
\draw[->,color=black!60] (0.8,0) -- (0.8,4.6) node[left] {};
\node[anchor=south] at (3.2,5.1) {sum of infeasibilities};
\node[anchor=south,color=black!60] at (3.2,4.6499999999999995) {satisfied: 64/100};
\end{scope}
\end{tikzpicture}在阶段 II 中心路径附近终止
使用障碍方法的基本阶段 I 方法有一个简单的变体,其性质是:当等式与不等式组严格可行时,阶段 I 问题的中心路径与原优化问题的中心路径相交。
设给定点
其中常数
其中
这意味着
通过不可行初始点 Newton 方法实现阶段 I
也可以用不可行初始点 Newton 方法执行阶段 I:对原问题的一个修正版本应用该方法。先把原问题改写为(显然等价的)形式
(新增变量
它可以从任意
如果连
(变量
这种阶段 I 方法的主要缺点是:当问题不可行时没有好的终止准则——残差只是不收敛到零。
例子
考虑一族线性可行性问题
其中
基本阶段 I 方法:对每个
这个例子很典型:只要问题不非常接近可行与不可行的边界,用障碍方法求解一组凸不等式与线性等式的代价是适度的、近似为常数的;当问题非常接近边界时,找到严格可行点或给出不可行性证书所需的 Newton 步数会增长;而当问题恰好位于边界上时(例如可行但不严格可行),代价变为无穷。
不可行初始点 Newton 方法:对同一族可行性问题(只考虑可行的
(回溯参数

上图由下面的 TikZ 代码编译而来:
\definecolor{cblue}{RGB}{31,119,180}
\definecolor{cred}{RGB}{214,39,40}
\definecolor{cgreen}{RGB}{44,160,44}
\definecolor{corange}{RGB}{255,127,14}
\definecolor{cpurple}{RGB}{148,103,189}
\definecolor{cbrown}{RGB}{140,86,75}
\definecolor{cpink}{RGB}{227,119,194}
\definecolor{cgray}{RGB}{127,127,127}
\begin{tikzpicture}[x=1cm,y=1cm,>=stealth,line cap=round,line join=round]
\begin{scope}[xshift=0cm]
\draw[color=black!12,very thin] (0.0000,0) -- (0.0000,4.4) (1.6500,0) -- (1.6500,4.4) (3.3000,0) -- (3.3000,4.4) (4.9500,0) -- (4.9500,4.4) (6.6000,0) -- (6.6000,4.4) (0,0.8540) -- (6.6,0.8540) (0,1.7081) -- (6.6,1.7081) (0,2.5621) -- (6.6,2.5621) (0,3.4161) -- (6.6,3.4161) (0,4.2702) -- (6.6,4.2702) ;
\draw[->,color=black!60] (0,0) -- (6.8999999999999995,0) node[below] {$\gamma$};
\draw[->,color=black!60] (0,0) -- (0,4.7) node[left] {Newton steps};
\draw[cblue,very thick] plot [smooth] coordinates {(0.000,3.245) (0.412,3.075) (0.825,3.331) (1.237,3.245) (1.650,3.075) (2.063,3.075) (2.475,3.331) (2.887,3.075) (3.300,3.075) (3.712,3.075) (4.125,3.245) (4.537,3.587) (4.950,3.160) (5.362,3.245) (5.775,3.331) (6.188,3.331) (6.600,3.929)};
\fill[cblue] (0.000,3.245) circle (1.4pt);
\fill[cblue] (0.412,3.075) circle (1.4pt);
\fill[cblue] (0.825,3.331) circle (1.4pt);
\fill[cblue] (1.237,3.245) circle (1.4pt);
\fill[cblue] (1.650,3.075) circle (1.4pt);
\fill[cblue] (2.063,3.075) circle (1.4pt);
\fill[cblue] (2.475,3.331) circle (1.4pt);
\fill[cblue] (2.887,3.075) circle (1.4pt);
\fill[cblue] (3.300,3.075) circle (1.4pt);
\fill[cblue] (3.712,3.075) circle (1.4pt);
\fill[cblue] (4.125,3.245) circle (1.4pt);
\fill[cblue] (4.537,3.587) circle (1.4pt);
\fill[cblue] (4.950,3.160) circle (1.4pt);
\fill[cblue] (5.362,3.245) circle (1.4pt);
\fill[cblue] (5.775,3.331) circle (1.4pt);
\fill[cblue] (6.188,3.331) circle (1.4pt);
\fill[cblue] (6.600,3.929) circle (1.4pt);
\node[below,color=black!60] at (0.0000,0) {$10^{-2}$};
\node[below,color=black!60] at (1.6500,0) {$10^{-1}$};
\node[below,color=black!60] at (3.3000,0) {$10^{0}$};
\node[below,color=black!60] at (4.9500,0) {$10^{1}$};
\node[below,color=black!60] at (6.6000,0) {$10^{2}$};
\node[left,color=black!60] at (0,1.7081) {20};
\node[left,color=black!60] at (0,3.4161) {40};
\node[anchor=south] at (3.3,5.050000000000001) {feasible side ($\gamma>0$)};
\end{scope}
\begin{scope}[xshift=8.7cm]
\draw[color=black!12,very thin] (0.0000,0) -- (0.0000,4.4) (1.6500,0) -- (1.6500,4.4) (3.3000,0) -- (3.3000,4.4) (4.9500,0) -- (4.9500,4.4) (6.6000,0) -- (6.6000,4.4) (0,0.8540) -- (6.6,0.8540) (0,1.7081) -- (6.6,1.7081) (0,2.5621) -- (6.6,2.5621) (0,3.4161) -- (6.6,3.4161) (0,4.2702) -- (6.6,4.2702) ;
\draw[->,color=black!60] (0,0) -- (6.8999999999999995,0) node[below] {$\gamma$};
\draw[->,color=black!60] (0,0) -- (0,4.7) node[left] {Newton steps};
\draw[cblue,very thick] plot [smooth] coordinates {(0.000,3.245) (0.412,3.245) (0.825,3.075) (1.237,3.331) (1.650,3.075) (2.063,3.331) (2.475,3.331) (2.887,3.075) (3.300,3.245) (3.712,3.245) (4.125,3.245) (4.537,3.587) (4.950,3.160) (5.362,3.245) (5.775,3.672) (6.188,3.331) (6.600,3.929)};
\fill[cblue] (0.000,3.245) circle (1.4pt);
\fill[cblue] (0.412,3.245) circle (1.4pt);
\fill[cblue] (0.825,3.075) circle (1.4pt);
\fill[cblue] (1.237,3.331) circle (1.4pt);
\fill[cblue] (1.650,3.075) circle (1.4pt);
\fill[cblue] (2.063,3.331) circle (1.4pt);
\fill[cblue] (2.475,3.331) circle (1.4pt);
\fill[cblue] (2.887,3.075) circle (1.4pt);
\fill[cblue] (3.300,3.245) circle (1.4pt);
\fill[cblue] (3.712,3.245) circle (1.4pt);
\fill[cblue] (4.125,3.245) circle (1.4pt);
\fill[cblue] (4.537,3.587) circle (1.4pt);
\fill[cblue] (4.950,3.160) circle (1.4pt);
\fill[cblue] (5.362,3.245) circle (1.4pt);
\fill[cblue] (5.775,3.672) circle (1.4pt);
\fill[cblue] (6.188,3.331) circle (1.4pt);
\fill[cblue] (6.600,3.929) circle (1.4pt);
\node[below,color=black!60] at (0.0000,0) {$10^{-2}$};
\node[below,color=black!60] at (1.6500,0) {$10^{-1}$};
\node[below,color=black!60] at (3.3000,0) {$10^{0}$};
\node[below,color=black!60] at (4.9500,0) {$10^{1}$};
\node[below,color=black!60] at (6.6000,0) {$10^{2}$};
\node[left,color=black!60] at (0,1.7081) {20};
\node[left,color=black!60] at (0,3.4161) {40};
\node[anchor=south] at (3.3,5.050000000000001) {infeasible side ($\gamma<0$)};
\end{scope}
\end{tikzpicture}
上图由下面的 TikZ 代码编译而来:
\definecolor{cblue}{RGB}{31,119,180}
\definecolor{cred}{RGB}{214,39,40}
\definecolor{cgreen}{RGB}{44,160,44}
\definecolor{corange}{RGB}{255,127,14}
\definecolor{cpurple}{RGB}{148,103,189}
\definecolor{cbrown}{RGB}{140,86,75}
\definecolor{cpink}{RGB}{227,119,194}
\definecolor{cgray}{RGB}{127,127,127}
\begin{tikzpicture}[x=1cm,y=1cm,>=stealth,line cap=round,line join=round]
\draw[color=black!12,very thin] (0.0000,0) -- (0.0000,4.6) (1.6580,0) -- (1.6580,4.6) (3.1710,0) -- (3.1710,4.6) (4.8290,0) -- (4.8290,4.6) (6.3420,0) -- (6.3420,4.6) (8.0000,0) -- (8.0000,4.6) (0,0.7667) -- (8,0.7667) (0,1.5333) -- (8,1.5333) (0,2.3000) -- (8,2.3000) (0,3.0667) -- (8,3.0667) (0,3.8333) -- (8,3.8333) ;
\draw[->,color=black!60] (0,0) -- (8.35,0) node[below] {$\gamma$};
\draw[->,color=black!60] (0,0) -- (0,4.949999999999999) node[left] {Newton steps};
\draw[cblue,very thick] plot [smooth] coordinates {(8.000,0.015) (7.045,0.012) (5.784,0.012) (4.829,0.011) (3.874,0.011) (3.171,0.011) (2.613,0.012) (2.216,0.012) (1.658,0.014) (1.167,0.020) (0.703,0.025) (0.396,0.029) (0.000,0.040) (-0.558,0.060) (-0.955,0.078) (-1.513,0.118)};
\fill[cblue] (8.000,0.015) circle (1.6pt);
\fill[cblue] (7.045,0.012) circle (1.6pt);
\fill[cblue] (5.784,0.012) circle (1.6pt);
\fill[cblue] (4.829,0.011) circle (1.6pt);
\fill[cblue] (3.874,0.011) circle (1.6pt);
\fill[cblue] (3.171,0.011) circle (1.6pt);
\fill[cblue] (2.613,0.012) circle (1.6pt);
\fill[cblue] (2.216,0.012) circle (1.6pt);
\fill[cblue] (1.658,0.014) circle (1.6pt);
\fill[cblue] (1.167,0.020) circle (1.6pt);
\fill[cblue] (0.703,0.025) circle (1.6pt);
\fill[cblue] (0.396,0.029) circle (1.6pt);
\fill[cblue] (0.000,0.040) circle (1.6pt);
\fill[cblue] (-0.558,0.060) circle (1.6pt);
\fill[cblue] (-0.955,0.078) circle (1.6pt);
\fill[cblue] (-1.513,0.118) circle (1.6pt);
\node[below,color=black!60] at (0.0000,0) {0.03};
\node[below,color=black!60] at (1.6580,0) {0.1};
\node[below,color=black!60] at (3.1710,0) {0.3};
\node[below,color=black!60] at (4.8290,0) {1};
\node[below,color=black!60] at (6.3420,0) {3};
\node[below,color=black!60] at (8.0000,0) {10};
\node[left,color=black!60] at (0,0.7667) {500};
\node[left,color=black!60] at (0,1.5333) {1k};
\node[left,color=black!60] at (0,2.3000) {1.5k};
\node[left,color=black!60] at (0,3.0667) {2k};
\node[left,color=black!60] at (0,3.8333) {2.5k};
\node[left,color=black!60] at (0,4.6000) {3k};
\node[anchor=south east,color=black!60] at (0.7035,4.2933) {$\gamma=0.01$: thousands of steps};
\end{tikzpicture}
```\n