这篇博文主要是想记录一下我这几天的工作心得。鉴于网上关于constraint generation和column generation的中文资料相对较少,希望这篇博文也能帮助像我一样的新学者。
首先,是我对constraint generation的理解。标题中的约束生成或者行生成是我自己翻译的,可能存在误差(单纯形法中用一行表示一个约束)。前人提出这个算法的主要原因是因为有的问题约束特别多,例如我前面博文提到的基于DFJ的TSP问题,有时候列举出每一个约束是不可行的(复杂度可能高达n!阶乘的复杂度),因此必须想一种办法在求解最优值(是的,不是近似最优)的时候避免枚举的复杂度。constraint generation的前提即为:在一个具体的问题中,很多约束其实是弱约束,有没有这个约束对最终结果影响不大。constraint generation的原理为:若一个解是具有n个约束的模型的最优解,那么它可能是具有n+1个约束的模型的最优解;同时,只要它满足其他约束的条件(往往这类问题检查解的合法性比求解最优解更快更好理解,这也是启发式算法的基础),那么它就是具有n+1个约束的最优解。以TSP问题举例说明:只要在n个约束下,求得的解是一条合法的TSP路径(不存在子环),那么它一定也是具有n+1个约束的最优解,因此,其它的约束不需要进行考虑。综上所述,我们不需要枚举出所有的约束条件,再进行最优值求解,我们应当采取以下策略进行求解:1.先求解一个解。2.分析这个解,若满足所有约束,则算法停止,输出这个解。3.找出所有这个解不满足的约束(有的参考资料会说是性价比最高的解,但我个人通过实验验证,针对TSP问题,一次性加入所有不满足的约束更好),并且将这些解加入模型中。4.根据这些约束,重新求解模型,得到一个解,并转至步骤2。
constraint generation的核心即为我上面所述,一般而言,通过优化步骤2和步骤3可以明显提高算法效率。同时,步骤3有时可以结合启发式算法进行优化。
讲完constraint generation,让我们来谈谈column generation。
网上搜索列生成,可以搜到不是相关的中文资料,同时IBM的CPLEX的用户手册也有关于column generation