规划中的变量(部分或全部)限制为整数时,称为整数规划。
若在线性规划模型中,变量限制为整数,则称为整数线性规划。
整数线性规划模型大致可分为两类:
(1)变量全限制为整数时,称纯(完全)整数规划。
(2)变量部分限制为整数的,称混合整数规划。
我在前面的几篇博客中反复强调过,建立模型的过程是整个数学建模的重点、难点、核心,而求解的过程相对的就不是那么重要(并不是不重要),毕竟市面上有很多的开源和商业版求解器供我们求解特定数学模型。我们的主要任务就是将问题建模成这些特定类型的数学模型(比如线性规划、整数规划、二次规划等等)。在这个过程中,建模技巧至关重要。如决策变量的定义、约束条件变换等不合理将直接导致问题无法求解、或者降低求解速度。
整数规划的应用来源于两种方式:直接的和转化的。
直接的,一般比较简单,直接定义整数决策变量,建立约束条件即可。典型的问题是投资决策。
问题:
在一个三年的规划周期内,有五个项目可供选择,下表给出了每个项目可以带来的预期收益以及每年的支出(单位:百万元)
请问,在这个三年规划周期内应该选哪些项目?
建模过程
这个问题可以转化成对每个项目选择为“是/否”的决策,引入二值变量 x j x_j xj,则有:
x = { 1 if 选 择 项 目 j 0 if 不 选 择 项 目 j x = \begin{cases} 1 &\text{if } 选择项目j \\ 0 &\text{if } 不选择项目j \end{cases} x={10if 选择项目jif 不选择项目j
那么整数规划模型为:
m a x z = 20 x 1 + 40 x 2 + 20 x 3 + 15 x 4 + 30 x 5 s . t . 5 x 1 + 4 x 2 + 3 x 3 + 7 x 4 + 8 x 5 ⩽ 25 x 1 + 7 x 2 + 9 x 3 + 4 x 4 + 6 x 5 ⩽ 25 8 x 1 + 10 x 2 + 2 x 3 + x 4 + 10 x 5 ⩽ 25 x 1 , x 2 , x 3 , x 4 , x 5 = ( 0 , 1 ) \begin{aligned} &max \ \ z=20x_1+40x_2+20x_3+15x_4+30x_5 \\ &s.t. \\ &\ \ \ \ 5x_1+4x_2+3x_3+7x_4+8x_5\leqslant 25 \\ &\ \ \ \ x_1+7x_2+9x_3+4x_4+6x_5\leqslant 25 \\ &\ \ \ \ 8x_1+10x_2+2x_3+x_4+10x_5\leqslant 25 \\ &\ \ \ \ x_1,x_2,x_3,x_4,x_5=(0,1) \end{aligned} max z=20x1+40x2+20x3+15x4+30x5s.t. 5x1+4x2+3x3+7x4+8x5⩽25 x1+7x2+9x3+4x4+6x5⩽25 8x1+10x2+2x3+x4+10x5⩽25 x1,x2,x3,x4,x5=(0,1)
在这一类问题中,会有许多服务装置为一些设备提供互相重叠的服务,其目标就是确定安装数量最好的装置来覆盖每一个设备满足服务需求。比如选址问题:几个污水处理厂可以建在不同地点,为不同的城市服务,当一个城市得到不同的污水处理厂的服务时就产生了重叠服务。
案例:
现代电网中使用无线接收器读取用户的读表仪器数据,生成电费账单。现在有8个接收器安放点,可服务于10个用户,每一个安放点可服务的用户信息如下:
接收器 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
读表仪器 | 1,2,3 | 2,3,9 | 5,6,7 | 7,9,10 | 3,6,8 | 1,4,7,9 | 4,5,9 | 1,4,8 |
如何设置最少数量的接收器服务于这10个读表仪器(对应10个用户)?
建模过程:
(1)决策变量:
x i = { 1 if 选 择 接 收 器 i 0 if 不 选 择 接 收 器 i x_i = \begin{cases} 1 &\text{if } 选择接收器i \\ 0 &\text{if } 不选择接收器i \end{cases} xi={10if 选择接收器iif 不选择接收器i
(2)约束条件:
每一个读表仪器至少被一个接收器服务。
(3)建立整数规划模型:
m i n z = ∑ i = 1 8 x i s . t . x 1 + x 4 + x 8 ≥ 1 x 1 + x 2 ≥ 1 x 1 + x 2 + x 5 ≥ 1 x 6 + x 7 + x 8 ≥ 1 x 3 + x 7 ≥ 1 x 3 + x 5 ≥ 1 x 3 + x 4 + x 6 ≥ 1 x 5 + x 8 ≥ 1 x 6 + x 7 ≥ 1 x i = ( 0 , 1 ) , i = ( 1 , 2 , . . , 8 ) \begin{aligned} &min \ \ z=\sum_{i=1}^{8}x_i \\ &s.t. \\ &\ \ \ \ x_1+x_4+x_8&\geq 1 \\ &\ \ \ \ x_1+x_2&\geq 1 \\ &\ \ \ \ x_1+x_2+x_5&\geq 1 \\ &\ \ \ \ x_6+x_7+x_8&\geq 1 \\ &\ \ \ \ x_3+x_7&\geq 1 \\ &\ \ \ \ x_3+x_5&\geq 1 \\ &\ \ \ \ x_3+x_4+x_6&\geq 1 \\ &\ \ \ \ x_5+x_8&\geq 1 \\ &\ \ \ \ x_6+x_7&\geq 1 \\ &\ \ \ \ x_i=(0,1), i=(1,2,..,8) \end{aligned} min z=i=1∑8xis.t. x1+x4+x8 x1+x2 x1+x2+x5 x6+x7+x8 x3+x7 x3+x5 x3+x4+x6 x5+x8 x6+x7 xi=(0,1),i=(1,2,..,8)≥1≥1≥1≥1≥1≥1≥1≥1≥1
固定费用问题通常包含两种费用形式:一种活动启动即会产生的固定费用,另一种是活动启动后产生的可变费用,这种可变费用与活动开展情况有关。
例如,在生产某种产品之前需要购买一台机器,这台机器的费用是固定费用,与生产多少产品无关,同时,一旦买了机器,劳动力和原材料所耗费用就与生产产品的数量成正比总费用函数可以表示为:
C ( x ) = { F + c x if x > 0 0 if x ⩽ 0 C(x)= \begin{cases} F+cx &\text{if } x>0 \\ 0 &\text{if } x\leqslant 0 \end{cases} C(x)={F+cx0if x>0if x⩽0
其中,F是固定费用,c是单位变动费用,x是产品的数量。
这种分段函数在x=0处不存在连续点,解析方法难以处理,通常可以引入0-1二值变量类处理这类问题。
过程如下:
定义0-1二值决策变量y,设x的足够大的上界为M,取 ε \varepsilon ε为极小的正数,则x、w之间的关系可描述为:
w = { 1 if x > 0 0 if x ⩽ 0 w= \begin{cases} 1 &\text{if } x>0 \\ 0 &\text{if } x\leqslant 0 \end{cases} w={10if x>0if x⩽0
数学关系等价为如下约束条件:
x ⩽ M w , x ⩾ ε − M ( 1 − w ) , w = ( 0 , 1 ) . \begin{aligned} x &\leqslant Mw,\\ x &\geqslant \varepsilon-M(1-w),\\ w&=(0,1). \end{aligned} xxw⩽Mw,⩾ε−M(1−w),=(0,1).
总费用函数的分段表示可转化为:
C ( x ) = F w + c x s . t . = { x ⩽ M w , − x ⩽ M ( 1 − w ) − ε , w = ( 0 , 1 ) . \begin{aligned} C(x)=Fw+cx \\ s.t.=\begin{cases} x&\leqslant Mw ,\\ -x&\leqslant M(1-w)-\varepsilon, \\ w&=(0,1). \end{cases} \end{aligned} C(x)=Fw+cxs.t.=⎩⎪⎨⎪⎧x−xw⩽Mw,⩽M(1−w)−ε,=(0,1).
我们知道经典的几类数学模型的约束条件是并列关系,但实践中根据约束建立数学关系时常出现“or”关系和“if-then”关系。我们以例子来说明约束条件变换方法。
案例
Jobco 公司需要在一台机器上进行三项加工,下表给出了每项工作的处理以及应交工日期c 将第一项工作开始处理时的日期定为0,应交工日期从0 算起。
工作处理时间(天数) | 应交工日期(天) | 延期处罚(元/天) |
---|---|---|
1 | 5 | 25 |
2 | 20 | 22 |
3 | 15 | 35 |
这个问题的目标是求使得延期处罚最少的工序处理方案。
(1)定义决策变量
x j = 工作j 的开始日期(按天计算,从0 开始计算) y i j = { 1 若工作i在工作j之前处理 0 若工作i在工作j之后处理 \begin{aligned} x_j&= \text{工作j 的开始日期(按天计算,从0 开始计算)} \\ y_{ij}&=\begin{cases} 1 &\text{若工作i在工作j之前处理}\\ 0 &\text{若工作i在工作j之后处理} \\ \end{cases} \end{aligned} xjyij=工作j 的开始日期(按天计算,从0 开始计算)={10若工作i在工作j之前处理若工作i在工作j之后处理
(2)建立合适形式的数学约束条件
约束条件有两个。
第一个约束:一台机器同时只能处理一项工作,所以三项工作任意两项之间都不能有时间交叉。
假设工作 i i i和工作 j j j 的处理时间分别为 p i p_i pi和 p j p_j pj,为了保证这两项工作不会同时需要处理,必须满足以下条件(取决于工作 i i i是在工作 j j j 之前处理还是在其之后处理):
x i ⩾ x j + p j or x j ⩾ x i + p i x_i \geqslant x_j+p_j \ \ \text{or} \ \ x_j \geqslant x_i+p_i xi⩾xj+pj or xj⩾xi+pi
对于足够大的数M,“or”约束可以用下面“and”的约束代替:
M y i j + ( x i − x j ) ⩾ p j a n d M ( 1 − y i j ) + ( x j − x i ) ⩾ p i M{y_{ij}}+(x_i-x_j)\geqslant p_j \ \ and \ \ M(1-y_{ij})+(x_j-x_i)\geqslant p_i Myij+(xi−xj)⩾pj and M(1−yij)+(xj−xi)⩾pi
核心思路:这个约束转换是怎么来的呢?我们知道0-1二值决策变量在模型中只能取值0或者1,这恰好是“or”的关系,另外我们还知道使一个条件失去约束作用的方法就是将有限的上界(下界)扩展为无穷上界(下界)。利用这个两个已知事实即可使“or”约束中只有一个起作用。如果 y i j = 0 y_{ij}= 0 yij=0,那么第一个约束起作用,而第二个约束是多余的(因为左端项包含充分大的数M,所以一定会大于 p i p_i pi);如果 y i j = 1 y_{ij}= 1 yij=1,那么第一个约束是多余的,此时第二个约束起作用。
第二个约束条件:给定工作j的应交工日期是 d j d_j dj,若 x j + p j > d j x_j+p_j>d_j xj+pj>dj,这项工作就会产生延期 s j + s_j^+ sj+天,若 x j + p j < d j x_j+p_j<d_j xj+pj<dj,这项工作提前 s j − s_j^- sj−天完成。这几个日期应满足的关系:
x j + p j + s j − − s j + = d j s j − , s j + ⩾ 0 \begin{aligned} x_j+p_j+s_j^- -s_j^+&=d_j \\ s_j^- ,s_j^+&\geqslant 0 \end{aligned} xj+pj+sj−−sj+sj−,sj+=dj⩾0
(3)建立目标函数
目标是使得延期处罚最少。
m i n z = 25 s 1 + + 22 s 2 + + 35 s 3 + min \ z=25s_1^++22s_2^++35s_3^+ min z=25s1++22s2++35s3+
(4)写出完整数学模型
m i n z = 25 s 1 + + 22 s 2 + + 35 s 3 + s . t . \begin{aligned} min \ &z=25s_1^++22s_2^++35s_3^+ \\ s.t. \end{aligned} min s.t.z=25s1++22s2++35s3+
M y 1 , 2 + x 1 − x 2 ⩾ 20 − M y 1 , 2 + x 2 − x 1 ⩾ 5 − M M y 1 , 3 + x 1 − x 3 ⩾ 15 − M y 1 , 3 + x 3 − x 1 ⩾ 5 − M M y 2 , 3 + x 2 − x 3 ⩾ 15 − M y 2 , 3 + x 3 − x 2 ⩾ 20 − M x 1 + s 1 − − s 1 + = 25 − 5 x 2 + s 2 − − s 2 + = 22 − 20 x 3 + s 3 − − s 3 + = 35 − 15 x 1 , x 2 , x 3 , s 1 − , s 1 + , s 2 − , s 2 + , s 3 − , s 3 + ⩾ 0 y 1 , 2 , y 1 , 3 , y 2 , 3 = ( 0 , 1 ) \begin{aligned} M{y_{1,2}}+x_1-x_2&\geqslant 20 \\ -My_{1,2}+x_2-x_1&\geqslant 5-M \\ M{y_{1,3}}+x_1-x_3&\geqslant 15 \\ -My_{1,3}+x_3-x_1&\geqslant 5-M \\ M{y_{2,3}}+x_2-x_3&\geqslant 15 \\ -My_{2,3}+x_3-x_2&\geqslant 20-M \\ x_1+s_1^--s_1^+&=25-5 \\ x_2+s_2^--s_2^+&=22-20 \\ x_3+s_3^--s_3^+&=35-15 \\ x_1,x_2,x_3,s_1^-,s_1^+,s_2^-,s_2^+,s_3^-,s_3^+ \geqslant 0 \\ y_{1,2},y_{1,3},y_{2,3}=(0,1) \end{aligned} My1,2+x1−x2−My1,2+x2−x1My1,3+x1−x3−My1,3+x3−x1My2,3+x2−x3−My2,3+x3−x2x1+s1−−s1+x2+s2−−s2+x3+s3−−s3+x1,x2,x3,s1−,s1+,s2−,s2+,s3−,s3+⩾0y1,2,y1,3,y2,3=(0,1)⩾20⩾5−M⩾15⩾5−M⩾15⩾20−M=25−5=22−20=35−15
这是一个混合整数线性规划模型。
注意:目前所流行的求解整数规划的方法,往往只适用于整数线性规划。目前还没有一种方法能有效地求解一切整数规划。
根据整数规划不同的情形可以采用不同的算法,大致如下:
(1)分枝定界法—可求纯或混合整数线性规划。
(2)割平面法—可求纯或混合整数线性规划。
(3)隐枚举法—求解“0-1”整数规划:
①过滤隐枚举法;
②分枝隐枚举法。
(4)匈牙利法—解决指派问题(“0-1”规划特殊情形)。
(5)蒙特卡洛法(随机取样法)—求解各种类型规划。
[1].《运筹学导论(基础篇)》;
[2].《数学建模算法与程序》,司守奎;
[3].《matlab数学建模经典案例实战》。