很长时间没有提笔写博,近两年来一直从事规划领域方面的研究,在熟悉业务的同时,对规划算法也有了新的看法。相比智能算法的概率性,规划算法对求解的精确性要求更高。
本篇博客将围绕非线性问题如何线性化典型问题,分类归纳,给正在入手线性规划的同学们带来系列思考感悟。
文章目录
- 前言
- 一、非线性规划问题的典型特征
- 二、常用处理技巧
- 分段函数形式
- 条件约束形式
- 绝对值函数形式
- 最小/大值函数形式
- 逻辑或形式
- 含有0-1变量的乘积形式
- 混合整数形式
- 分式目标函数
- 总结
前言
我们知道,对于线性规划问题,有非常成熟的求解方法——单纯形法。可实际在科研建模时,目标函数或是约束条件,极大概率会出现非线性的形式。
此时若选择采用启发式算法求解,就相当于放弃了求精确解,而实际业务上对问题解的要求更高。因此,了解并懂得何种形式可以转化为线性和如何线性化,是非常重要的。
在解决实际较为复杂的问题时,会面临以下两个问题:
- 我应该构建哪种非线性形式来刻画该问题?
- 这样的非线性刻画还能否线性化(决定了还能否求得精确解)?
为了回答好这两个问题,本文将围绕《非线性问题的典型特征刻画》《线性化处理技巧》两部分解释。
一、非线性规划问题的典型特征
笔者认为,经典线性规划问题可以统一转换为矩阵化的范式:
object:
constraints:
variables: 满足其他条件等
然后可采用单纯形法进行处理。单纯形法本质是迭代找每个问题解空间的凸点,不断更新凹点最终缩小解空间到截止,则最优解必存在某一凸点上。这也就是凸优化的常用求解途径(很多学者都会研究非凸优化发paper)。有意思的是国内外的凸凹翻译是反的。而我们认为非线性规划就是一个非凸问题。
回到正题,非线性规划问题的典型数学特征为,具有:
- 分段函数形式
- 条件约束形式
- 绝对值函数形式
- 最小/大值函数形式
- 逻辑或形式
- 含有0-1变量的乘积形式
- 混合整数形式
- 分式目标函数
以上均可实现线性化。
二、常用处理技巧
线性化的主要手段其实就两点:
- 引入0-1变量
- 引入很大的整数M
灵活运用这两点会呈现非常巧妙且神奇的线性化技巧。
1.分段函数
(1)示例1
分段函数的表达式如下,问题域为
如果要对分段函数进行线性化处理,则需要引入0-1辅助变量和一个很大的正整数。
对上式分析可知:
①考虑,对应分段函数1,且约束均成立
②考虑,对应分段函数2,且约束均成立
③考虑,对应分段函数3,且约束均成立
(2)继而推广至K项分段函数
通过增加K个0,1变量,以及极大值M,实现线性化
(3)总结分析
1)约束区间的适应性
约束区间可适应, , , ,不影响以上特性。
2)约束区间的特定性
- 上界可推广至
- 下界有且仅有能为零,因为为0/1变量,仅为1时,其它项为零,使得约束下界为0
- 上下界必须和问题域范围相同。在分段函数中,约束区间的并集 = 问题域
3)当约束下界为时,如何处理?①如何同问题域保持一致性②同各分段函数约束区间保持一致性?
在分段函数中,约束区间的并集 = 问题域。所以保持各分段函数约束区间一致即可。
这里结合问题域,区分两种情况讨论:
①
考虑对坐标进行平移,增加变量,令
②
如果已定义问题域范围为,可不做任何处理(因为问题域和同时定义约束会取并集得到,在约束区间上保持一致);未定义问题域范围时,需要考虑对坐标进行平移,增加变量,令
2.条件约束★
条件约束相对来说较常见,可以理解为if... then...。分为单条件约束和组合条件约束。顾名思义:
(1)单条件约束
指围绕变量Variable,仅有一条约束,如:
通常为了解决约束条件,一般采用松弛法,即“将约束范围放大到无穷范围、将约束条件松弛到恒成立”。这里我们设置无穷大变量M,和0/1变量k。
通过设置两个变量,在满足约束条件的同时,对范围外松弛到恒满足约束条件,完成约束的去除 。对上式分析可知:
①考虑,对应原式
②考虑,对应为,且约束。
与分段函数不同,在分段约束中,一致性如何判定
- 与问题域是否保持一致?只有问题域一定要先定义(一般约束区间为问题域子集,会先行定义)才成立
- 与条件约束是否保持一致?显然,成立。
(2)组合条件约束
多种单条件约束的组合,且各条件区间上不冲突。
与分段函数不同,组合约束各区间并集不一定等于问题域。
定义K个0/1变量和1个M大整数变量,线性化为以下所有公式:
分析:通过控制0/1变量仅有1个能为1,实现K个表达式只有1个式子对应原式,其他均为默认显然成立。实现以上公式去约束、线性化。
(3)总结分析
如果问题域明确是,则可以考虑以下线性操作:
3. 绝对值约束
举例:要求线性化如下数学模型
求解方法1:用yi代替绝对值部分
注意,yi=|xi|的数学含义其实就是:yi≥xi和yi≥-xi。这个数学思想非常重要,可以解决很多有关绝对值的问题。
求解方法2:用ui、vi代替
这种方法没有那么直观,一回生,二回熟嘛,以后看到绝对值问题,脑海中有这种思路就好啦。
高中或是高数课上学过如下定理:
则之前的数学模型可以线性化为:
将左边|xi|转化为ui+vi,x转化为u-v。注意,这里的x是向量奥,对于x下标中的每个i都是成立的,可不能以为只有一个约束条件。
4. 逻辑或
该部分主要针对约束条件(含有逻辑或)的线性化操作。通常,逻辑或两端的约束存在三种情形。
- 情形1:逻辑或两段均为≤,即:
此时线性化方法为:
引入u 和v 两个0-1变量和大M。分类讨论u 和v 取0或1的四种情形便能理解以上过程。思路非常巧妙,希望大家多悟几遍并消化。
这里虽然只讲了"均为≤"的情形,大家理解了这个逻辑,对于"两边均为≥"和"一边≥一边≤"的情形,线性化思路是类似的。
大家可以试着写一些,我这里总结句口诀:大减小加。含义是:
只要用了大于等于,后面M前面的符号一定是减号;
只要用了小于等于,后面M前面的符号一定是加号。
大家可以思考下为什么是这样,相信你一定理解的~
- 情形2:一端为≤,一端为=,即:
此时线性化方法为:
可见,多添加一个≥的式子即可。那么,情形3如何处理相信大家也猜到了。(感谢评论区,第三个约束的M前应该是减号,即bx≥c2-M(1-v),抱歉)
- 情形3:两端均为=,即:
此时线性化方法为:
可见,逻辑或是通过新引入的两个0/1变量u和v来控制的,再次感叹非常巧妙!