【管理运筹学】背诵手册(四)| 整数规划

四、整数规划

整数规划根据变量取值的限制形式,可分为三种:

  1. 纯整数规划(IP)。
  2. 混合整数规划(MIP)。
  3. 0-1 整数规划(BIP)。

不能用凑整的方法去求整数规划问题的最优解,用四舍五入得到的解往往与最优整数解相差甚远,甚至不是可行解。

整数规划问题和对应的松弛问题一个重要的关系就是,对于 max 型问题,松弛问题的最优解值 ≥ \geq 整数规划最优解值。

分支定界法

分支定界法的基本思想是根据某种策略将原问题的可行域分解为越来越多的子域(称为分支),并检查某个子域内整数解的情况,不断调整上下界(称为定界)直到找到最优的整数解或证明整数解不存在。

分支是通过添加一对互斥的约束,砍掉 k k k k + 1 k+1 k+1 之间的非整数域,从而缩小搜索范围。定界的上界通常由各打开节点中最大的目标函数值确定,下界则由已经找到的最好的整数解来确定。

求解任何一个子问题都有以下三种可能结果:

  1. 子问题无可行解。
  2. 得到一个整数解,不继续分支。
  3. 得到非整数解。
    3.1 目标函数值大于剪枝界,继续分支;
    3.2 目标函数值小于或等于剪枝界,因剪枝而关闭。

因此分支定界法,剪枝的情况有两种,一种是子问题不可行,还有一种是子问题目标函数值小于下界。

每当下界被修改后(即找到一个整数解),都应检查所有打开的节点中那些目标函数小于下界的节点。因此在实际做题时,最好一直往一个方向分支,有可能可以直接求出一个整数解,这样另一个方向的子问题就可以直接剪掉了。

理论的做法是利用线性规划问题的灵敏度分析那里的内容,添加新的约束条件,然后重新迭代。但是这样做实在是太费时间了。考试如果出了只有两个变量的分支定界法,最好就用图解法,作答只画那个分支树就好。要是多于 3 个以上,还是先去做别的题吧。

割平面法

分支定界法可以求解混合整数规划问题,而割平面法只能求解纯整数规划问题。

割平面的关键就是那个割平面方程,要利用到一些整数的知识,举个例子,选择的非整数基变量为 x 1 x_1 x1 ,它在最优单纯形表中对应的约束方程为 x 1 − 0.25 x 3 + 0.25 x 4 = 0.75 x_1-0.25x_3+0.25x_4=0.75 x10.25x3+0.25x4=0.75 首先把约束中非整数系数都写成一个整数加上真分数的和: x 1 + ( − 1 + 0.75 ) x 3 + ( 0 + 0.25 ) x 4 = 0 + 0.75 x_1+(-1+0.75)x_3+(0+0.25)x_4=0+0.75 x1+(1+0.75)x3+(0+0.25)x4=0+0.75 需要注意的是 − 0.25 -0.25 0.25 应写成 − 1 + 0.75 -1+0.75 1+0.75 ,而不是 0 − 0.25 ) 0-0.25) 00.25) 。然后整数移到一边,分数移到另一边: x 1 − x 3 = 0.75 − ( 0.75 x 3 + 0.25 x 4 ) x_1-x_3=0.75-(0.75x_3+0.25x_4) x1x3=0.75(0.75x3+0.25x4) 想想如果里面的变量都是整数,会发生什么?如果都是整数的话,首先右边最大只能取 0.75 0.75 0.75 ,但是因为左边的也是整数,所以右边最大只能取到 0 ,于是有 0.75 − ( 0.75 x 3 + 0.25 x 4 ) ≤ 0 0.75-(0.75x_3+0.25x_4)\leq0 0.75(0.75x3+0.25x4)0 这就是我们的割平面方程。我们最好先别化成整数,直接这样作为新的约束,因为有可能原来的模型系数也是分数,这样就可以约掉。最初我们选择哪个非整数基变量先开始时也有一些讲究,尽量选择真分数较大的那一个先割。

0-1 型整数规划

这一部分主要是建模,通过引入 0-1 变量,可以很巧妙的表达一些约束条件。如至多选两个, x 1 + x 2 + x 3 ≤ 2 x_1+x_2+x_3\leq2 x1+x2+x32 ;至少选一个, x 1 + x 2 + x 3 ≥ 1 x_1+x_2+x_3\geq1 x1+x2+x31 ;选了 x 2 x_2 x2 才能选 x 3 x_3 x3 ,则有 x 2 ≥ x 3 x_2\geq x_3 x2x3 ;同时选了 x 2 , x 3 x_2,x_3 x2,x3 才能选 x 4 x_4 x4 ,则有 x 2 + x 3 ≥ 2 x 4 x_2+x_3\geq 2x_4 x2+x32x4 ;选了 x 2 x_2 x2 x 3 x_3 x3 就不能选 x 4 x_4 x4 ,反之亦然,则有 x 2 + x 4 ≤ 1 & x 3 + x 4 ≤ 1 x_2+x_4\leq1 \& x_3+x_4\leq1 x2+x41&x3+x41 ,用两个式子表示。

保证起约束作用的条件个数,如有 m m m 个互相排斥的约束: a i 1 x 1 + a i 2 x 2 + ⋯ + a i n x n ≤ b i ( i = 1 , 2 , ⋯   , m ) a_{i1}x_1+a_{i2}x_2+\cdots+a_{in}x_n\le b_i(i=1,2,\cdots,m) ai1x1+ai2x2++ainxnbi(i=1,2,,m) 若要求只能有 1 个约束起作用,则可以引入 0-1 变量 y i y_i yi 和一个充分大的数 M M M a i 1 x 1 + a i 2 x 2 + ⋯ + a i n x n ≤ b i + ( 1 − y i ) M ( i = 1 , 2 , ⋯   , m ) a_{i1}x_1+a_{i2}x_2+\cdots+a_{in}x_n\le b_i+(1-y_i)M(i=1,2,\cdots,m) ai1x1+ai2x2++ainxnbi+(1yi)M(i=1,2,,m) 则添加约束 ∑ y i = 1 \sum y_i=1 yi=1 ,即可表达只有一个约束起作用。类似地,还可以使得有 k k k 个( ∑ y i = k \sum y_i=k yi=k)和至少有 k k k 个( ∑ y i ≥ k \sum y_i\geq k yik)。

关于固定费用的问题,需要选择采用几种方式,如 x j x_j xj 表示采用第 j j j 种方式时的产量; c j c_j cj 表示采用第 j j j 种方式时每件产品的变动成本, k j k_j kj 表示采用第 j j j 种方式时的固定成本。则采用各种方式的总成本为 P j = { k j + c j x j , x j > 0 0 , x j = 0 P_j=\begin{cases} k_j+c_jx_j,& x_j>0 \\ 0,&x_j=0 \end{cases} Pj={kj+cjxj,0,xj>0xj=0 为了统一在目标函数中表达,引入 0-1 变量表示是否采用第 j j j 种方式,则模型可表达为: min ⁡ z = ∑ j = 1 3 k j y j + c j x j x j ≤ y j M \min z=\sum _{j=1}^3k_jy_j+c_jx_j \\ x_j\leq y_jM minz=j=13kjyj+cjxjxjyjM

隐枚举法

首先要化为标准型: min ⁡ z = ∑ j = 1 n c j x j s . t . { ∑ j = 1 n a i j x j ≤ b i , i = 1 , 2 , ⋯   , m x j = 0 或 1 , ∀ j \min z =\sum_{j=1}^nc_jx_j \\ s.t.\begin{cases} \sum_{j=1}^na_{ij}x_j\leq b_i,i=1,2,\cdots,m \\ x_j=0或1,\forall j \end{cases} minz=j=1ncjxjs.t.{j=1naijxjbi,i=1,2,,mxj=01,j 其中, c j ≥ 0 c_j\geq0 cj0 b i b_i bi 可以是正数、负数和零,所有约束条件必须是 ≤ \leq 形式。

隐枚举法思路和分支定界法有些相似,首先令全部变量取 0 ,检验解是否可行,若可行,已得到最优解 z ∗ = 0 z^*=0 z=0 ;若不可行,令一个变量为固定变量,取 0 或 1,将问题分为两个子域,其余变量称为自由变量。令自由变量取值 0 ,加上固定变量取值,组成此子域的解。

计算此解的目标函数值,如果比已经求出的一个可行目标函数值大,那直接停止分支,去检验另一个子域的解;若更小,再检验是否可行,若可行,已获得一个可行解,记录 z z z 值;若不可行,看看它继续往下分能否找到可行解,方法是:

将子域固定变量的值代入约束方程,不等式左端自由变量当系数为负时取 1 ,系数为正时取 0 ,这就是左端能取的最小值,如果满足约束,说明可以继续往下分支,否则停止分支。

若所有的子域都停止分支,计算停止,目标函数值最小的可行解就是最优解。

实际解题时,优先选取对目标函数影响系数大的(由于求最小,选择系数小的)作为固定变量,可能可以加快计算速度。

指派问题

指派问题求极小化时的数学模型为: min ⁡ z = ∑ i ∑ j c i j x i j s . t . { ∑ i x i j = 1 , j = 1 , 2 , ⋯   , n ∑ j x i j = 1 , i = 1 , 2 , ⋯   , n x i j = 1 或 0 \min z =\sum_i\sum_jc_{ij}x_{ij}\\ s.t.\begin{cases} \sum_i x_{ij}=1,j=1,2,\cdots,n\\ \sum_jx_{ij}=1,i=1,2,\cdots,n\\ x_{ij}=1或0 \end{cases} minz=ijcijxijs.t. ixij=1,j=1,2,,njxij=1,i=1,2,,nxij=10 当问题是求最大时,则用效率矩阵中的最大元素减去各元素,作为新的效率矩阵。

指派问题是 0-1 规划问题的特例,也是运输问题的特例( m m m 个产地, n n n 个销地且 m = n m=n m=n a i = b i = 1 a_i=b_i=1 ai=bi=1 )。当然也可以用隐枚举法或表上作业法求解,不过有更简便的方法 —— 匈牙利法。

匈牙利法第一步,变换使得各行各列出现 0 元素。变换方法为每行减去最小,每列减去最小。

第二步,试指派。从只有一个 0 的行开始,画圈,所在列其他 0 变为 Φ \varPhi Φ ;再给只有一个 0 的列加圈,所在行其他 0 变为 Φ \varPhi Φ 。若反复进行后,还有没被画圈的,且同行同列的 0 有两个及以上的,给选择性少的画圈。若带圈的 0 的个数比人少,进入下一步。

第三步,确定能画圈的最多独立 0 个数。首先给没有圈 0 的行打√,再给打√行中 Φ \varPhi Φ 所在列打√,然后给打√列中 Φ \varPhi Φ 所在行打√,重复进行。给没有打√的行划线,给打了√的列划线,这就是能覆盖所有 0 的最少直线数。如果少于人数,则需要增加。如果等于人数,则回到第二步另行指派。

当人少于任务数时,需要虚拟一个人,其做任务的费用均为 0。当任务数小于人数时,需要虚拟一个任务,所有人做该任务的费用均为 0 。如果某个人可以同时担任多项任务,应该将该人员看成相同的多个人,即效率矩阵重复某一行。如果某人一定要分配到一项,则这个人做虚拟任务的费用就为 M 。如果某人一定不能做某项,相应的费用取 M 。

如果人数少于任务数,但是任务一定要做完,也就是有人要多做,可虚拟一个人,这个人做各项任务的费用是实际所有人中最小的。这种方法,同样适用在出现,某人最多完成几项工作的要求时。

书写时,注意添加适当文字,如“使用匈牙利法求解”、“试指派”等等;写矩阵时,先写一个原矩阵,再写一个每行减去最小的,再写一个每列减去最小的,可以在这个矩阵上直接试指派并画线,如果不够再添加(有可能需要多次添加)。


你可能感兴趣的:(#,运筹学,运筹学考研,背诵手册,整数规划,隐枚举法,分支定界法,匈牙利法,割平面法)