在整数规划建模中,经常会使用到0-1变量来辅助建模,将模型表述为IP模型或BIP模型,下面是一些常见的整数规划建模技巧
如下图所示,有两条约束,希望只有其中一条起到约束的作用,该怎么处理呢
处理方式如下图,M是一个较大的数,当约束的右边加上M时,无论 x 1 x_1 x1和 x 2 x_2 x2在取在取值范围之内的任意值,式子都是成立的,即该约束无效,没有起到限制变量取值的作用。那么只需要让其中一个约束失效即可,通过在两个约束的右边分别添加 M y 1 My_1 My1和 M y 2 My_2 My2,并让 y 1 + y 2 = 1 y_1+y_2=1 y1+y2=1来实现
要保留N个约束中的K个,原理和上面也是相同的,即在每个约束的右边添加 M y n My_n Myn,然后让 ∑ i = 1 N y i = N − K \sum_{i=1}^{N}{y_i}=N-K ∑i=1Nyi=N−K即可,这样有 N − K N-K N−K个约束的右边被添加上了M,这些约束失效,能发挥作用的约束只有K个
函数有N个可能的值,只需要给每个值乘以一个0-1变量,并通过 ∑ i = 1 N y i = 1 \sum_{i=1}^{N}{y_i}=1 ∑i=1Nyi=1让这些值只有一个生效即可
常见的固定收费问题如:当购买了一个设备之后,首先需要支出设备购买的费用,后续还需要支出设备每个周期的回收费用。通过使用 x j ≤ M y j x_j\le My_j xj≤Myj,当 x j > 0 x_j>0 xj>0 时, y j = 1 y_j=1 yj=1必须成立,限制函数必须加上一个固定费用 k j k_j kj
当一个模型存在大量0-1变量和少量整数变量时,无法直接使用高效的BIP算法,这时候可以使用二进制表示法
将原有的整数变量分解成多个0-1变量。当一个整数 x x x的范围为[0,u]时,可以参考下图的方式将其分解为N个0-1变量
具体的案例如下图所示
当一个函数是一个分段分数时,即处于不同区域的 x x x,其对应的函数表达式 f ( x ) f(x) f(x)是不同的,在处理这种问题的时候,建模的方式如下:
设一个 n 段线性函数 f ( x ) 的分点为 b 1 ≤ ⋯ ≤ b n ≤ b n + 1 ,可以引入 w k 和 z k 将 x 和 f ( x ) 分别表示为 x = ∑ k = 1 n + 1 w k b k f ( x k ) = ∑ k = 1 n + 1 w k f ( b k ) 其中 w k 和 z k 满足下面的关系: w 1 ≤ z 1 , w 2 ≤ z 1 + z 2 , ⋯ , w n ≤ z n − 1 + z n , w n + 1 ≤ z n z 1 + z 2 + ⋯ + z n = 1 , z k = 0 或 1 w 1 + w 2 + ⋯ + w n + 1 = 1 , w k ≥ 0 ( k = 1 , 2 , ⋯ , n + 1 ) \text{设一个}n\text{段线性函数}f\left( x \right) \text{的分点为}b_1\le \cdots \le b_n\le b_{n+1}\text{,可以} \text{引入}w_k\text{和}z_k\text{将}x\text{和}f\left( x \right) \text{分别表示为\\\\\\\\\\\\\\\\\\\\\\\\\ } \\ x=\sum_{k=1}^{n+1}{w_kb_k} \\ f\left( x_k \right) =\sum_{k=1}^{n+1}{w_kf\left( b_k \right)} \\ \text{其中}w_k\text{和}z_k\text{满足下面的关系:} \\ w_1\le z_1,\ w_2\le z_1+z_2,\ \cdots ,\ w_n\le z_{n-1}+z_n,\ w_{n+1}\le z_n \\ z_1+z_2+\cdots +z_n=1,\ z_k=0\text{或}1 \\ w_1+w_2+\cdots +w_{n+1}=1,\ w_k\ge 0\ \left( k=1,2,\cdots ,n+1 \right) \\ 设一个n段线性函数f(x)的分点为b1≤⋯≤bn≤bn+1,可以引入wk和zk将x和f(x)分别表示为 x=k=1∑n+1wkbkf(xk)=k=1∑n+1wkf(bk)其中wk和zk满足下面的关系:w1≤z1, w2≤z1+z2, ⋯, wn≤zn−1+zn, wn+1≤znz1+z2+⋯+zn=1, zk=0或1w1+w2+⋯+wn+1=1, wk≥0 (k=1,2,⋯,n+1)
如果无法理解上面的模型处理方式的话,可以仔细理解下面的图片