第二章整数规划 §1概论 1定义 规划中的变量(部分或全部)限制为整数时,称为整数规划。若在线性规划模型中 变量限制为整数,则称为整数线性规划。目前所流行的求解整数规划的方法,往往只适 用于整数线性规划。目前还没有一种方法能有效地求解一切整数规划。 2整数规划的分类 如不加特殊说明,一般指整数线性规划。对于整数线性规划模型大致可分为两类: 1°变量全限制为整数时,称纯(完全)整数规划。 2°变量部分限制为整数的,称混合整数规划。 12整数规划特点 (i)原线性规划有最优解,当自变量限制为整数后,其整数规划解出现下述情况: ①原线性规划最优解全是整数,则整数规划最优解与线性规划最优解一致 ②整数规划无可行解。 例1原线性规划为 min ==x,+x2 2x1+4x2=5,x1≥0,x2≥0 其最优实数解为:x=0,x4mms5 ③有可行解(当然就存在最优解),但最优解值变差。 例2原线性规划为 min ==x+x2 2x1+4x2=6,x1≥0,x2≥0 其最优实数解为:x,=0,2.mms3 若限制整数得:x1=1,x2=1,minz=2。 ⅱi)整数规划最优解不能按照实数最优解简单取整而获得。 13求解方法分类 (i)分枝定界法一可求纯或混合整数线性规划。 (ⅱi)割平面法一可求纯或混合整数线性规划 (ⅲi)隐枚举法一求解“0-1”整数规划: ①过滤隐枚举法; ②分枝隐枚举法。 (ⅳ)匈牙利法一解决指派问题(“0-1”规划特殊情形)。 (ⅴ)蒙特卡洛法一求解各种类型规划 下面将简要介绍常用的几种求解整数规划的方法 §2分枝定界法 对有约束条件的最优化问题(其可行解为有限数)的所有可行解空间恰当地进行系 统搜索,这就是分枝与定界内容。通常,把全部可行解空间反复地分割为越来越小的子 集,称为分枝;并且对每个子集内的解集计算一个目标下界(对于最小值问题),这称 为定界。在每次分枝后,凡是界限超出已知可行解集目标值的那些子集不再进一步分枝, 16
-16- 第二章 整数规划 §1 概论 1.1 定义 规划中的变量(部分或全部)限制为整数时,称为整数规划。若在线性规划模型中, 变量限制为整数,则称为整数线性规划。目前所流行的求解整数规划的方法,往往只适 用于整数线性规划。目前还没有一种方法能有效地求解一切整数规划。 1.2 整数规划的分类 如不加特殊说明,一般指整数线性规划。对于整数线性规划模型大致可分为两类: 1o 变量全限制为整数时,称纯(完全)整数规划。 2o 变量部分限制为整数的,称混合整数规划。 1.2 整数规划特点 (i) 原线性规划有最优解,当自变量限制为整数后,其整数规划解出现下述情况: ①原线性规划最优解全是整数,则整数规划最优解与线性规划最优解一致。 ②整数规划无可行解。 例 1 原线性规划为 min 1 2 z = x + x 2 4 5, 0, 0 x1 + x2 = x1 ≥ x2 ≥ 其最优实数解为: 4 5 ,min 4 5 0, x1 = x2 = z = 。 ③有可行解(当然就存在最优解),但最优解值变差。 例 2 原线性规划为 min 1 2 z = x + x 2 4 6, 0, 0 x1 + x2 = x1 ≥ x2 ≥ 其最优实数解为: 2 3 ,min 2 3 0, x1 = x2 = z = 。 若限制整数得: 1, 1,min 2 x1 = x2 = z = 。 (ii) 整数规划最优解不能按照实数最优解简单取整而获得。 1.3 求解方法分类: (i)分枝定界法—可求纯或混合整数线性规划。 (ii)割平面法—可求纯或混合整数线性规划。 (iii)隐枚举法—求解“0-1”整数规划: ①过滤隐枚举法; ②分枝隐枚举法。 (iv)匈牙利法—解决指派问题(“0-1”规划特殊情形)。 (v)蒙特卡洛法—求解各种类型规划。 下面将简要介绍常用的几种求解整数规划的方法。 §2 分枝定界法 对有约束条件的最优化问题(其可行解为有限数)的所有可行解空间恰当地进行系 统搜索,这就是分枝与定界内容。通常,把全部可行解空间反复地分割为越来越小的子 集,称为分枝;并且对每个子集内的解集计算一个目标下界(对于最小值问题),这称 为定界。在每次分枝后,凡是界限超出已知可行解集目标值的那些子集不再进一步分枝
这样,许多子集可不予考虑,这称剪枝。这就是分枝定界法的主要思路。 分枝定界法可用于解纯整数或混合的整数规划问题。在本世纪六十年代初由Land Doig和 Dakin等人提出的。由于这方法灵活且便于用计算机求解,所以现在它已是解 整数规划的重要方法。目前已成功地应用于求解生产进度问题、旅行推销员问题、工厂 选址问题、背包问题及分配问题等。 设有最大化的整数规划问题A,与它相应的线性规划为问题B,从解问题B开始, 若其最优解不符合A的整数条件,那么B的最优目标函数必是A的最优目标函数x的 上界,记作;而A的任意可行解的目标函数值将是x的一个下界。分枝定界法就 是将B的可行域分成子区域的方法。逐步减小三和增大〓,最终求到z。现用下例来 例3求解下述整数规划 Max=40x1+90x2 9x1+7x2≤56 7x1+20x2≤70 x1,x2≥0且为整数 解(i)先不考虑整数限制,即解相应的线性规划B,得最优解为: x1=48092,x2=18168,=3558779 可见它不符合整数条件。这时z是问题A的最优目标函数值z的上界,记作三。而 x1=0,x2=0显然是问题A的一个整数可行解,这时二=0,是z的一个下界,记作三 即0≤x≤356。 (ⅱi)因为x,x2当前均为非整数,故不满足整数要求,任选一个进行分枝。设选x1 进行分枝,把可行集分成2个子集 x1≤[48092]=4,x1≥[4.8092]+1=5 因为4与5之间无整数,故这两个子集的整数解必与原可行集合整数解一致。这 一步称为分枝。这两个子集的规划及求解如下 问题B1:Max=40x+90x2 9x1+7x2≤56 7x1+20x,≤70 0≤x1≤4,x,≥0 x2 最优解为:x1=4.0,x2=2.1,=1=349。 问题B2:Max2=40x1+90x2 9x1+7x2≤56 7x1+20x,≤70 x1≥5,x2≥0 最优解为:x1=5.0,x2=1.57,=1=341.4 再定界:0≤x≤349。 (i)对问题B1再进行分枝得问题B1和B12,它们的最优解为
-17- 这样,许多子集可不予考虑,这称剪枝。这就是分枝定界法的主要思路。 分枝定界法可用于解纯整数或混合的整数规划问题。在本世纪六十年代初由 Land Doig 和 Dakin 等人提出的。由于这方法灵活且便于用计算机求解,所以现在它已是解 整数规划的重要方法。目前已成功地应用于求解生产进度问题、旅行推销员问题、工厂 选址问题、背包问题及分配问题等。 设有最大化的整数规划问题 A ,与它相应的线性规划为问题 B ,从解问题 B 开始, 若其最优解不符合 A 的整数条件,那么 B 的最优目标函数必是 A 的最优目标函数 * z 的 上界,记作 z ;而 A 的任意可行解的目标函数值将是 * z 的一个下界 z 。分枝定界法就 是将 B 的可行域分成子区域的方法。逐步减小 z 和增大 z ,最终求到 * z 。现用下例来 说明: 例 3 求解下述整数规划 1 2 Max z = 40x + 90x ⎪ ⎩ ⎪ ⎨ ⎧ ≥ + ≤ + ≤ , 0 且为整数 7 20 70 9 7 56 1 2 1 2 1 2 x x x x x x 解 (i)先不考虑整数限制,即解相应的线性规划 B ,得最优解为: 4.8092, 1.8168, 355.8779 x1 = x2 = z = 可见它不符合整数条件。这时 z 是问题 A 的最优目标函数值 * z 的上界,记作 z 。而 0, 0 x1 = x2 = 显然是问题 A 的一个整数可行解,这时 z = 0 ,是 * z 的一个下界,记作 z , 即0 356 * ≤ z ≤ 。 (ii)因为 1 2 x , x 当前均为非整数,故不满足整数要求,任选一个进行分枝。设选 1 x 进行分枝,把可行集分成 2 个子集: [4.8092] 4 x1 ≤ = , [4.8092] 1 5 x1 ≥ + = 因为 4 与 5 之间无整数,故这两个子集的整数解必与原可行集合整数解一致。这 一步称为分枝。这两个子集的规划及求解如下: 问题 B1 : 1 2 Max z = 40x + 90x ⎪ ⎩ ⎪ ⎨ ⎧ ≤ ≤ ≥ + ≤ + ≤ 0 4, 0 7 20 70 9 7 56 1 2 1 2 1 2 x x x x x x 最优解为: 4.0, 2.1, 349 x1 = x2 = z1 = 。 问题 B2 : 1 2 Max z = 40x + 90x ⎪ ⎩ ⎪ ⎨ ⎧ ≥ ≥ + ≤ + ≤ 5, 0 7 20 70 9 7 56 1 2 1 2 1 2 x x x x x x 最优解为: 5.0, 1.57, 341.4 x1 = x2 = z1 = 。 再定界:0 349 * ≤ z ≤ 。 (iii)对问题 B1 再进行分枝得问题 B11和 B12 ,它们的最优解为
B1:x1=4,x2=2,=1=340 B2:x1=1.43,x2=3.00,-2=32714 再定界:340≤二≤341,并将B2剪枝 (ⅳv)对问题B2再进行分枝得问题B21和B2,它们的最优解为 B21:x1=544,x2=1.00,=22=308 B,无可行解 将B21B2剪枝 于是可以断定原问题的最优解为 x1=4,x2=2,z=340 从以上解题过程可得用分枝定界法求解整数规划(最大化)问题的步骤为: 开始,将要求解的整数规划问题称为问题A,将与它相应的线性规划问题称为问 题B (i)解问题B可能得到以下情况之一: (a)B没有可行解,这时A也没有可行解,则停止 (b)B有最优解,并符合问题A的整数条件,B的最优解即为A的最优解,则 停止 (c)B有最优解,但不符合问题A的整数条件,记它的目标函数值为2。 (ⅱi)用观察法找问题A的一个整数可行解,一般可取x,=0,j=1…,n,试探, 求得其目标函数值,并记作三。以x表示问题A的最优目标函数值;这时有 z<-<z 进行迭代。 第一步:分枝,在B的最优解中任选一个不符合整数条件的变量x,其值为b, 以[b,]表示小于b,的最大整数。构造两个约束条件 x≤[b,]和x≥[b+1 将这两个约束条件,分别加入问题B,求两个后继规划问题B和B2。不考虑整数条件 求解这两个后继问题 定界,以每个后继问题为一分枝标明求解的结果,与其它问题的解的结果中,找出 最优目标函数值最大者作为新的上界2。从已符合整数条件的各分支中,找出目标函数 值为最大者作为新的下界三,若无作用三不变。 第二步:比较与剪枝,各分枝的最优目标函数中若有小于二者,则剪掉这枝,即 以后不再考虑了。若大于三,且不符合整数条件,则重复第一步骤。一直到最后得到 z=z为止。得最优整数解x,j=1,…,n §30-1型整数规划 0-1型整数规划是整数规划中的特殊情形,它的变量x,仅取值0或1。这时x,称 为0-1变量,或称二进制变量。x仅取值0或1这个条件可由下述约束条件: 0≤x:≤1,整数
-18- : 4, 2, 340 B11 x1 = x2 = z11 = : 1.43, x 3.00, 327.14 B12 x1 = 2 = z12 = 再定界:340 341 * ≤ z ≤ ,并将 B12 剪枝。 (iv)对问题 B2 再进行分枝得问题 B21和 B22,它们的最优解为 : 5.44, x 1.00, 308 B21 x1 = 2 = z22 = B22无可行解。 将 21 22 B ,B 剪枝。 于是可以断定原问题的最优解为: 4, 2, 340 * x1 = x2 = z = 从以上解题过程可得用分枝定界法求解整数规划(最大化)问题的步骤为: 开始,将要求解的整数规划问题称为问题 A ,将与它相应的线性规划问题称为问 题 B 。 (i)解问题 B 可能得到以下情况之一: (a) B 没有可行解,这时 A 也没有可行解,则停止. (b) B 有最优解,并符合问题 A 的整数条件, B 的最优解即为 A 的最优解,则 停止。 (c) B 有最优解,但不符合问题 A 的整数条件,记它的目标函数值为 z 。 (ii)用观察法找问题 A 的一个整数可行解,一般可取 xj = 0, j = 1,L,n ,试探, 求得其目标函数值,并记作 z 。以 * z 表示问题 A 的最优目标函数值;这时有 z ≤ z ≤ z * 进行迭代。 第一步:分枝,在 B 的最优解中任选一个不符合整数条件的变量 j x ,其值为bj , 以[ ] bj 表示小于bj 的最大整数。构造两个约束条件 [ ] j bj x ≤ 和 xj ≥ [bj] +1 将这两个约束条件,分别加入问题 B ,求两个后继规划问题 B1 和 B2 。不考虑整数条件 求解这两个后继问题。 定界,以每个后继问题为一分枝标明求解的结果,与其它问题的解的结果中,找出 最优目标函数值最大者作为新的上界 z 。从已符合整数条件的各分支中,找出目标函数 值为最大者作为新的下界 z ,若无作用 z 不变。 第二步:比较与剪枝,各分枝的最优目标函数中若有小于 z 者,则剪掉这枝,即 以后不再考虑了。若大于 z ,且不符合整数条件,则重复第一步骤。一直到最后得到 z = z * 为止。得最优整数解 x j n j , 1, , * = L 。 §3 0 −1型整数规划 0 −1型整数规划是整数规划中的特殊情形,它的变量 j x 仅取值 0 或 1。这时 j x 称 为0 −1变量,或称二进制变量。 j x 仅取值 0 或 1 这个条件可由下述约束条件: 0 ≤ xj ≤ 1,整数
所代替,是和一般整数规划的约束条件形式一致的。在实际问题中,如果引入0-1变 量,就可以把有各种情况需要分别讨论的线性规划问题统一在一个问题中讨论了。我们 先介绍引入0-1变量的实际问题,再研究解法。 3.1引入0-1变量的实际问题 3.1.1投资场所的选定—相互排斥的计划 例4某公司拟在市东、西、南三区建立门市部。拟议中有7个位置(点) A(=1,2,…7)可供选择。规定 在东区。由A1,A2,A3三个点中至多选两个 在西区。由A4,A3两个点中至少选一个; 在南区,由A6,A1两个点中至少选一个。 如选用A点,设备投资估计为b元,每年可获利润估计为c1元,但投资总额不能 超过B元。问应选择哪几个点可使年利润为最大? 解题时先引入0-1变量x(=1,2,…,7) x=当4点被选中, i=1,2,…,7 0,当A点没被选中 于是问题可列写成: Max b.x. <B x1+x2+x3≤2 x4+x52 x6+x7≥1,x1=0或1 3.12相互排斥的约束条件 有两个相互排斥的约束条件 x1+3x2 为了统一在一个问题中,引入0-1变量y,则上述约束条件可改写为 5x,+4x,≤24+yM 7x1+3x2≤45+(1-y) 其中M是充分大的数。 约束条件 x1=0或500≤x1≤800 可改写为 500y≤x1≤800y V=
-19- 所代替,是和一般整数规划的约束条件形式一致的。在实际问题中,如果引入 0 −1变 量,就可以把有各种情况需要分别讨论的线性规划问题统一在一个问题中讨论了。我们 先介绍引入0 −1变量的实际问题,再研究解法。 3.1 引入0 −1变量的实际问题 3.1.1 投资场所的选定——相互排斥的计划 例 4 某公司拟在市东、西、南三区建立门市部。拟议中有 7 个位置(点) A (i = 1,2,L,7) i 可供选择。规定 在东区。由 1 2 3 A , A , A 三个点中至多选两个; 在西区。由 4 5 A , A 两个点中至少选一个; 在南区,由 6 7 A , A 两个点中至少选一个。 如选用 Ai 点,设备投资估计为bi 元,每年可获利润估计为 i c 元,但投资总额不能 超过 B 元。问应选择哪几个点可使年利润为最大? 解题时先引入0 −1变量 x (i =1,2,L,7) i 令 ⎩ ⎨ ⎧ = 0 . 1, 当 点没被选中 当 点被选中 , , i A i A i x i = 1,2,L,7 . 于是问题可列写成: i i i z ∑c x = = 7 1 Max ⎪ ⎪ ⎪ ⎩ ⎪ ⎪ ⎪ ⎨ ⎧ + ≥ = + ≥ + + ≤ ∑ ≤ = 1, 0 1 1 2 6 7 4 5 1 2 3 7 1 i 或 i i i x x x x x x x x b x B 3.1.2 相互排斥的约束条件 有两个相互排斥的约束条件 5 4 24 x1 + x2 ≤ 或 7 3 45 x1 + x2 ≤ 。 为了统一在一个问题中,引入0 −1变量 y ,则上述约束条件可改写为: ⎪ ⎩ ⎪ ⎨ ⎧ = + ≤ + − + ≤ + 0 1 7 3 45 (1 ) 5 4 24 1 2 1 2 y 或 x x y M x x yM 其中 M 是充分大的数。 约束条件 0 x1 = 或 500 800 ≤ x1 ≤ 可改写为 ⎩ ⎨ ⎧ = ≤ ≤ 0 1 500 800 1 y 或 y x y
如果有m个互相排斥的约束条件 amxn≤b 为了保证这m个约束条件只有一个起作用,我们引入m个0-1变量y(=1,2,…,m) 和一个充分大的常数M,而下面这一组m+1个约束条件 anY ≤b+yM ,2, 就合于上述的要求。这是因为,由于(2),m个y中只有一个能取0值,设y,=0, 代入(1),就只有i=1的约束条件起作用,而别的式子都是多余的 3.1.3关于固定费用的问题( Fixed Cost problem) 在讨论线性规划时,有些问题是要求使成本为最小。那时总设固定成本为常数,并 在线性规划的模型中不必明显列出。但有些固定费用(固定成本)的问题不能用一般线 性规划来描述,但可改变为混合整数规划来解决,见下例。 例5某工厂为了生产某种产品,有几种不同的生产方式可供选择,如选定的生产 方式投资高(选购自动化程度高的设备),由于产量大,因而分配到每件产品的变动成 本就降低;反之,如选定的生产方式投资低,将来分配到每件产品的变动成本可能增加。 所以必须全面考虑。今设有三种方式可供选择,令 x,表示采用第j种方式时的产量 c,表示采用第j种方式时每件产品的变动成本 k,表示采用第j种方式时的固定成本。 为了说明成本的特点,暂不考虑其它约束条件。采用各种生产方式的总成本分别为 k+cx,当x>0 P j=1,2,3 在构成目标函数时,为了统一在一个问题中讨论,现引入0-1变量y,令 「1,当采用第种生产方式,即x;>0时 y (3) 0,当不采用第神种生产方式,即x;=0时 于是目标函数 min :=(k,y, +Cx1)+(k2y2+C2x2)+(k3J3+Csx) (3)式这个规定可表为下述3个线性约束条件 yE≤x≤y,M,j=1,2,3 其中E是一个充分小的正常数,M是个充分大的正常数。(4)式说明,当x>0时y 必须为1:当x,=0时只有y为0时才有意义,所以(4)式完全可以代替(3)式。 3.20-1型整数规划解法之一(过滤隐枚举法) 解0-1型整数规划最容易想到的方法,和一般整数规划的情形一样,就是穷举法, 即检査变量取值为θ或1的每一种组合,比较目标函数值以求得最优解,这就需要检查 变量取值的2″个组合。对于变量个数n较大(例如n>100),这几乎是不可能的。因 此常设计一些方法,只检査变量取值的组合的一部分,就能求到问题的最优解。这样的 方法称为隐枚举法( Implicit Enumeration),分枝定界法也是一种隐枚举法。当然,对
-20- 如果有 m 个互相排斥的约束条件: ai1x1 +L+ ain xn ≤ bi i =1,2,L,m 为了保证这 m 个约束条件只有一个起作用,我们引入 m 个0 −1变量 y (i 1,2, ,m) i = L 和一个充分大的常数 M ,而下面这一组m +1个约束条件 ai1x1 +L+ ain xn ≤ bi + yi M i =1,2,L,m (1) y1 +L+ ym = m −1 (2) 就合于上述的要求。这是因为,由于(2),m 个 i y 中只有一个能取 0 值,设 * = 0 i y , 代入(1),就只有 * i = i 的约束条件起作用,而别的式子都是多余的。 3.1.3 关于固定费用的问题(Fixed Cost Problem) 在讨论线性规划时,有些问题是要求使成本为最小。那时总设固定成本为常数,并 在线性规划的模型中不必明显列出。但有些固定费用(固定成本)的问题不能用一般线 性规划来描述,但可改变为混合整数规划来解决,见下例。 例 5 某工厂为了生产某种产品,有几种不同的生产方式可供选择,如选定的生产 方式投资高(选购自动化程度高的设备),由于产量大,因而分配到每件产品的变动成 本就降低;反之,如选定的生产方式投资低,将来分配到每件产品的变动成本可能增加。 所以必须全面考虑。今设有三种方式可供选择,令 j x 表示采用第 j 种方式时的产量; j c 表示采用第 j 种方式时每件产品的变动成本; j k 表示采用第 j 种方式时的固定成本。 为了说明成本的特点,暂不考虑其它约束条件。采用各种生产方式的总成本分别为 ⎪⎩ ⎪ ⎨ ⎧ = + > = 0, 0 , 0 j j j j j j x k c x x P 当 当 j = 1,2,3. 在构成目标函数时,为了统一在一个问题中讨论,现引入0 −1变量 j y ,令 ⎪⎩ ⎪ ⎨ ⎧ = = > 0 . 0 0, 1, 当不采用第 种生产方式,即 时 当采用第 种生产方式,即 时, j j x j j x j y (3) 于是目标函数 min ( ) ( ) ( ) 1 1 1 1 2 2 2 2 3 3 3 3 z = k y + c x + k y + c x + k y + c x (3)式这个规定可表为下述 3 个线性约束条件: y j ε ≤ x j ≤ y jM , j = 1,2,3 (4) 其中ε 是一个充分小的正常数,M 是个充分大的正常数。(4)式说明,当 x j > 0时 j y 必须为 1;当 x j = 0时只有 j y 为 0 时才有意义,所以(4)式完全可以代替(3)式。 3.2 0 −1型整数规划解法之一(过滤隐枚举法) 解0 −1型整数规划最容易想到的方法,和一般整数规划的情形一样,就是穷举法, 即检查变量取值为 0 或 1 的每一种组合,比较目标函数值以求得最优解,这就需要检查 变量取值的 n 2 个组合。对于变量个数 n 较大(例如 n >100 ),这几乎是不可能的。因 此常设计一些方法,只检查变量取值的组合的一部分,就能求到问题的最优解。这样的 方法称为隐枚举法(Implicit Enumeration),分枝定界法也是一种隐枚举法。当然,对
有些问题隐枚举法并不适用,所以有时穷举法还是必要的 下面举例说明一种解0-1型整数规划的隐枚举法。 例6Maxz=3x1-2x,+5 x2-x3≤2 x1+4x2+x3≤4 4x,+x2≤6 或1 求解思路及改进措施 ()先试探性求一个可行解,易看出(x1,x2,x3)=(1,0,0)满足约束条件,故为 个可行解,且z=3。 (ⅱi)因为是求极大值问题,故求最优解时,凡是目标值z<3的解不必检验是否 满足约束条件即可删除,因它肯定不是最优解,于是应增加一个约束条件(目标值下界) (ⅲi)改进过滤条件。 (ⅳv)由于对每个组合首先计算目标值以验证过滤条件,故应优先计算目标值z大 的组合,这样可提前抬高过滤门槛,以减少计算量。 §4蒙特卡洛法(随机取样法) 前面介绍的常用的整数规划求解方法,主要是针对线性整数规划而言,而对于非线 性整数规划目前尚未有一种成熟而准确的求解方法,因为非线性规划本身的通用有效解 法尚未找到,更何况是非线性整数规划。 然而,尽管整数规划由于限制变量为整数而增加了难度;然而又由于整数解是有限 个,于是为枚举法提供了方便。当然,当自变量维数很大和取值范围很宽情况下,企图 用显枚举法(即穷举法)计算出最优值是不现实的,但是应用概率理论可以证明,在 定的计算量的情况下,完全可以得出一个满意解 例7已知非线性整数规划为 Max=x2+x2+3x2+4x2+2x3 0≤xs99(=1;5) x1+x2+x3+x4+x5≤400 x1+2x2+2x3+x4+6x5≤800 2x1+x2+6x3≤200 xs≤20 00 如果用显枚举法试探,共需计算(1005=100个点,其计算量非常之大。然而应 用蒙特卡洛去随机计算10°个点,便可找到满意解,那么这种方法的可信度究竟怎样 ? 下面就分析随机取样采集10°个点计算时,应用概率理论来估计一下可信度。 不失一般性,假定一个整数规划的最优点不是孤立的奇点 假设目标函数落在高值区的概率分别为001,00001,则当计算10个点后,有
-21- 有些问题隐枚举法并不适用,所以有时穷举法还是必要的。 下面举例说明一种解0 −1型整数规划的隐枚举法。 例 6 Max 3 1 2 2 5 3 z = x − x + x ⎪ ⎪ ⎪ ⎩ ⎪ ⎪ ⎪ ⎨ ⎧ = + ≤ + ≤ + + ≤ + − ≤ , , 0 1 4 6 3 4 4 2 2 1 2 3 2 3 1 2 1 2 3 1 2 3 x x x 或 x x x x x x x x x x 求解思路及改进措施: (i) 先试探性求一个可行解,易看出( , , ) (1,0,0) x1 x2 x3 = 满足约束条件,故为一 个可行解,且 z = 3。 (ii) 因为是求极大值问题,故求最优解时,凡是目标值 z < 3的解不必检验是否 满足约束条件即可删除,因它肯定不是最优解,于是应增加一个约束条件(目标值下界): (iii) 改进过滤条件。 (iv)由于对每个组合首先计算目标值以验证过滤条件,故应优先计算目标值 z 大 的组合,这样可提前抬高过滤门槛,以减少计算量。 §4 蒙特卡洛法(随机取样法) 前面介绍的常用的整数规划求解方法,主要是针对线性整数规划而言,而对于非线 性整数规划目前尚未有一种成熟而准确的求解方法,因为非线性规划本身的通用有效解 法尚未找到,更何况是非线性整数规划。 然而,尽管整数规划由于限制变量为整数而增加了难度;然而又由于整数解是有限 个,于是为枚举法提供了方便。当然,当自变量维数很大和取值范围很宽情况下,企图 用显枚举法(即穷举法)计算出最优值是不现实的,但是应用概率理论可以证明,在一 定的计算量的情况下,完全可以得出一个满意解。 例 7 已知非线性整数规划为: 1 2 3 4 5 2 5 2 4 2 3 2 2 2 1 8 2 3 2 Max 3 4 2 x x x x x z x x x x x − − − − − = + + + + ⎪ ⎪ ⎪ ⎩ ⎪ ⎪ ⎪ ⎨ ⎧ + + ≤ + + ≤ + + + + ≤ + + + + ≤ ≤ ≤ = 5 200 2 6 200 2 2 6 800 400 0 99 ( 1, ,5) 3 4 5 1 2 3 1 2 3 4 5 1 2 3 4 5 x x x x x x x x x x x x x x x x x i i L 如果用显枚举法试探,共需计算 5 10 (100) = 10 个点,其计算量非常之大。然而应 用蒙特卡洛去随机计算 6 10 个点,便可找到满意解,那么这种方法的可信度究竟怎样 呢? 下面就分析随机取样采集 6 10 个点计算时,应用概率理论来估计一下可信度。 不失一般性,假定一个整数规划的最优点不是孤立的奇点。 假设目标函数落在高值区的概率分别为 0.01,0.00001,则当计算 6 10 个点后,有
任一个点能落在高值区的概率分别为 1-0.9900.99…99(100多位), 1-0.99990009954602。 解(i)首先编写M文件 mente. m定义目标函数f和约束向量函数g,程序如下 function [f, g]=mengte(x)i f=x(1)^2+x(2)^2+3*x(3)^2+4*x(4)^2+2*x(5)-8*x(1)-2*x(2)-3*x(3) x(4)-2*x(5); g=[sum(x)-400 x(1)+2*x(2)+2*x(3)+x(4)+6*x(5)-800 2*x(1)+x(2)+6*x(3)-200 x(3)+x(4)+5*x(5)-200]; (ii)编写M文件 mainint.m如下求问题的解 rand( state, sum(clock)) tic x=99*rand(5,1) xl=floor(x): x2=ceil(x) If, g]=mengte (x1) if sum(g<=0)==4 if pO< end end If, g]=mengte(x2) if sum (g<=0)==4 x0=x2;p0=f; end 本题可以使用 LINGO软件求得精确的全局最有解,程序如下: row/1..4/:b; co1/1..5/:c1,c2,x link(row, col): ai endsets c1=1,1,3,4,2 a=11111 12216 21600
-22- 任一个点能落在高值区的概率分别为 1− 0.991000000 ≈ 0.99L99(100多位), 1 0.99999 0.999954602 1000000 − ≈ 。 解 (i)首先编写 M 文件 mente.m 定义目标函数 f 和约束向量函数 g,程序如下: function [f,g]=mengte(x); f=x(1)^2+x(2)^2+3*x(3)^2+4*x(4)^2+2*x(5)-8*x(1)-2*x(2)-3*x(3)-... x(4)-2*x(5); g=[sum(x)-400 x(1)+2*x(2)+2*x(3)+x(4)+6*x(5)-800 2*x(1)+x(2)+6*x(3)-200 x(3)+x(4)+5*x(5)-200]; (ii)编写M文件mainint.m如下求问题的解: rand('state',sum(clock)); p0=0; tic for i=1:10^6 x=99*rand(5,1); x1=floor(x);x2=ceil(x); [f,g]=mengte(x1); if sum(g<=0)==4 if p0<=f x0=x1;p0=f; end end [f,g]=mengte(x2); if sum(g<=0)==4 if p0<=f x0=x2;p0=f; end end end x0,p0 toc 本题可以使用LINGO软件求得精确的全局最有解,程序如下: model: sets: row/1..4/:b; col/1..5/:c1,c2,x; link(row,col):a; endsets data: c1=1,1,3,4,2; c2=-8,-2,-3,-1,-2; a=1 1 1 1 1 1 2 2 1 6 2 1 6 0 0
b=400,800,200,200; enddata max=@sum(col: Cl*x2+C2*x)i @for(row(i): sum(col(]):a(i,j)*x(3))<b(1)) @for(col: @gin(x)) @for(col: @bnd(0,x,99))i §5指派问题的计算机求解 整数规划问题的求解可以使用 Lingo等专用软件。对于一般的整数规划问题,无法 直接利用 Matlab的函数,必须利用 Matlab编程实现分枝定界解法和割平面解法。但对 于指派问题等0-1整数规划问题,可以直接利用 Matlab的函数 bintprog进行求解。 例8求解下列指派问题,已知指派矩阵为 222 375 103 87297 84235 解:编写 Matlab程序如下: [382103;87297;64275 84235;9106910]; a= zeros(10,25); for i=l: 5 a(i,(i-1)+5+1:5*i)=1 a(5+i,i:5:25)=1 b=ones(10, 1) [x, y]=bintprog(c,[],[], a,b)i x=reshape(x,[5, 51) 求得最优指派方案为x15=x23=x2=x4=x51=1,最优值为21。 求解的 LINGO程序如下: link(var, var): c,xi ndsets data c=382103 87297 64275 9106910 min=@sum (link:c*x)i @for(var(): @sum(var(3):x(1,3))=1) @for(var(3): @sum(var (1):x(1,3))=1)
-23- 0 0 1 1 5; b=400,800,200,200; enddata max=@sum(col:c1*x^2+c2*x); @for(row(i):@sum(col(j):a(i,j)*x(j))<b(i)); @for(col:@gin(x)); @for(col:@bnd(0,x,99)); end §5 指派问题的计算机求解 整数规划问题的求解可以使用 Lingo 等专用软件。对于一般的整数规划问题,无法 直接利用 Matlab 的函数,必须利用 Matlab 编程实现分枝定界解法和割平面解法。但对 于指派问题等0 −1整数规划问题,可以直接利用 Matlab 的函数 bintprog 进行求解。 例 8 求解下列指派问题,已知指派矩阵为 ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ 9 10 6 9 10 8 4 2 3 5 6 4 2 7 5 8 7 2 9 7 3 8 2 10 3 解:编写 Matlab 程序如下: c=[3 8 2 10 3;8 7 2 9 7;6 4 2 7 5 8 4 2 3 5;9 10 6 9 10]; c=c(:); a=zeros(10,25); for i=1:5 a(i,(i-1)*5+1:5*i)=1; a(5+i,i:5:25)=1; end b=ones(10,1); [x,y]=bintprog(c,[],[],a,b); x=reshape(x,[5,5]),y 求得最优指派方案为 x15 = x23 = x32 = x44 = x51 = 1,最优值为 21。 求解的 LINGO 程序如下: model: sets: var/1..5/; link(var,var):c,x; endsets data: c=3 8 2 10 3 8 7 2 9 7 6 4 2 7 5 8 4 2 3 5 9 10 6 9 10; enddata min=@sum(link:c*x); @for(var(i):@sum(var(j):x(i,j))=1); @for(var(j):@sum(var(i):x(i,j))=1);
@for (link: @bin(x))i end §6生产与销售计划问题 61问题实例 例9某公司用两种原油(A和B)混合加工成两种汽油(甲和乙)。甲、乙两种 汽油含原油的最低比例分别为50%和60%,每吨售价分别为4800元和5600元。该公 司现有原油A和B的库存量分别为500吨和1000吨,还可以从市场上买到不超过1500 吨的原油A。原油A的市场价为:购买量不超过500吨时的单价为10000元/吨;购买 量超过500吨单不超过1000吨时,超过500吨的部分8000元吨;购买量超过1000吨 时,超过1000吨的部分6000元吨。该公司应如何安排原油的采购和加工。 莫型 62建立模 (1)问题分析 安排原油采购、加工的目标是利润最大,题目中给出的是两种汽油的售价和原油A 的采购价,利润为销售汽油的收入与购买原油A的支出之差。这里的难点在于原油A的 采购价与购买量的关系比较复杂,是分段函数关系,能否及如何用线性规划、整数规划 模型加以处理是关键所在。 (2)模型建立 设原油A的购买量为x(单位:吨)。根据题目所给数据,采购的支出c(x)可表示 为如下的分段线性函数(以下价格以千元/吨为单位) 0≤x≤500 c(x)=1000+8x,500≤x≤1000 3000+6x,1000≤x≤1500 设原油A用于生产甲、乙两种汽油的数量分别为x1和x2,原油B用于生产甲 乙两种汽油的数量分别为x21和x2,则总的收入为48(x1+x21)+56(x12+x2)(千 元)。于是本例的目标函数(利润)为 maxz=48(x1+x21)+56(x12+x2)-c(x) 约束条件包括加工两种汽油用的原油A、原油B库存量的限制,原油A购买量的 限制,以及两种汽油含原油A的比例限制,它们表示为 x1+x1≤500+x x21+x2≤1000 (8) x≤1500 (9) ≥0.5 (10) ≥0.6 (11) x12+x2 x1,x2,x21,x22x≥0 (12) 由于(5)式中的c(x)不是线性函数,(5)~(12)给出的是一个非线性规划,而 且,对于这样用分段函数定义的c(x),一般的非线性规划软件也难以输入和求解。能 不能想办法将该模型化简,从而用现成的软件求解呢? -24
-24- @for(link:@bin(x)); end §6 生产与销售计划问题 6.1 问题实例 例 9 某公司用两种原油( A 和 B )混合加工成两种汽油(甲和乙)。甲、乙两种 汽油含原油的最低比例分别为 50%和 60%,每吨售价分别为 4800 元和 5600 元。该公 司现有原油 A 和 B 的库存量分别为 500 吨和 1000 吨,还可以从市场上买到不超过 1500 吨的原油 A 。原油 A 的市场价为:购买量不超过 500 吨时的单价为 10000 元/吨;购买 量超过 500 吨单不超过 1000 吨时,超过 500 吨的部分 8000 元/吨;购买量超过 1000 吨 时,超过 1000 吨的部分 6000 元/吨。该公司应如何安排原油的采购和加工。 6.2 建立模型 (1)问题分析 安排原油采购、加工的目标是利润最大,题目中给出的是两种汽油的售价和原油 A 的采购价,利润为销售汽油的收入与购买原油 A 的支出之差。这里的难点在于原油 A 的 采购价与购买量的关系比较复杂,是分段函数关系,能否及如何用线性规划、整数规划 模型加以处理是关键所在。 (2)模型建立 设原油 A 的购买量为 x(单位:吨)。根据题目所给数据,采购的支出c(x) 可表示 为如下的分段线性函数(以下价格以千元/吨为单位): ⎪ ⎩ ⎪ ⎨ ⎧ + ≤ ≤ + ≤ ≤ ≤ ≤ = 3000 6 , 1000 1500 1000 8 , 500 1000 10 , 0 500 ( ) x x x x x x c x (5) 设原油 A 用于生产甲、乙两种汽油的数量分别为 11 x 和 12 x ,原油 B 用于生产甲、 乙两种汽油的数量分别为 21 x 和 22 x ,则总的收入为 4.8( ) 5.6( ) 11 21 12 22 x + x + x + x (千 元)。于是本例的目标函数(利润)为 max 4.8( ) 5.6( ) ( ) 11 21 12 22 z = x + x + x + x − c x (6) 约束条件包括加工两种汽油用的原油 A 、原油 B 库存量的限制,原油 A 购买量的 限制,以及两种汽油含原油 A 的比例限制,它们表示为 x + x ≤ 500 + x 11 12 (7) 1000 x21 + x22 ≤ (8) x ≤ 1500 (9) 0.5 11 21 11 ≥ x + x x (10) 0.6 12 22 12 ≥ x + x x (11) , , , , 0 x11 x12 x21 x22 x ≥ (12) 由于(5)式中的c(x) 不是线性函数,(5)~(12)给出的是一个非线性规划,而 且,对于这样用分段函数定义的c(x) ,一般的非线性规划软件也难以输入和求解。能 不能想办法将该模型化简,从而用现成的软件求解呢?
63求解模型 下面介绍3种解法 (1)解法 个自然的想法是将原油A的采购量x分解为三个量,即用x1,x2,x3分别表示以 价格10千元/吨、8千元/吨、6千元/吨采购的原油A的吨数,总支出为 c(x)=10x1+8x2+6x3,且 (13) 这时目标函数(6)变为线性函数 maxz=48(x1+x21)+56(x12+x2)-(10x1+8x2+6x3) (14) 应该注意到,只有当以10千元/吨的价格购买x1=500(吨)时,才能以8千元/ 吨的价格购买x2(>0),这个条件可以表示为 )x2=0 (15) 同理,只有当以8千元吨的价格购买x2=500(吨)时,才能以6千元/吨的价格购买 x3(>0),于是 (x2-500)x3=0 (16) 此外,x1,x2,x3的取值范围是 0≤x1 50 (17) 由于有非线性约束(15)、(16),因而(7)~(17)构成非线性规划模型。将该模 型输入 LINGO软件如下: model sets var1/1..4/:y;!这里y(1)=x11,y(2)=x21,y(3)=x12,y(4)=x22; ar2/1..3/:x,c; endsets max=4.8*(y(1)+y(2))+5.6*(y(3)+y(4))-@sum(var2:c*x); y(1)+y(3)0; 0.4*y(3)-0.6*y(4)>0 (x(1)-500)*x(2)=0 (x(2)-500)*x(3)=0; @for(var2: @bnd(0, x, 500)) data 1086 enddata 可以用菜单命令“ LINGOOptions”在“ Global Solver”选项卡上启动全局优化选 型,并运行上述程序求得全局最有解:购买1000吨原油A,与库存的500吨原油A和 1000吨原油B一起,共生产2500吨汽油乙,利润为5000(千元)。 2)解法二 引入0-1变量将(15)和(16)转化为线性约束。 令1=1,z2=1,二3=1分别表示以10千元吨、8千元吨、6千元/吨的价格采 购原油A,则约束(15)和(16)可以替换为
-25- 6.3 求解模型 下面介绍 3 种解法 (1)解法一 一个自然的想法是将原油 A 的采购量 x 分解为三个量,即用 1 2 3 x , x , x 分别表示以 价 格 10 千元 / 吨 、 8 千 元 / 吨 、 6 千 元 / 吨采购的原油 A 的吨数,总支出为 10 1 8 2 6 3 c(x) = x + x + x ,且 1 2 3 x = x + x + x (13) 这时目标函数(6)变为线性函数: max 4.8( ) 5.6( ) (10 8 6 ) 11 21 12 22 1 2 3 z = x + x + x + x − x + x + x (14) 应该注意到,只有当以 10 千元/吨的价格购买 500 x1 = (吨)时,才能以 8 千元/ 吨的价格购买 ( 0) x2 > ,这个条件可以表示为 ( 500) 0 x1 − x2 = (15) 同理,只有当以 8 千元/吨的价格购买 500 x2 = (吨)时,才能以 6 千元/吨的价格购买 ( 0) x3 > ,于是 (x2 − 500)x3 = 0 (16) 此外, 1 2 3 x , x , x 的取值范围是 0 ≤ x1 , x2 , x3 ≤ 500 (17) 由于有非线性约束(15)、(16),因而(7)~(17)构成非线性规划模型。将该模 型输入 LINGO 软件如下: model: sets: var1/1..4/:y; !这里y(1)=x11,y(2)=x21,y(3)=x12,y(4)=x22; var2/1..3/:x,c; endsets max=4.8*(y(1)+y(2))+5.6*(y(3)+y(4))-@sum(var2:c*x); y(1)+y(3)0; 0.4*y(3)-0.6*y(4)>0; (x(1)-500)*x(2)=0; (x(2)-500)*x(3)=0; @for(var2:@bnd(0,x,500)); data: c=10 8 6; enddata end 可以用菜单命令“LINGO|Options”在“Global Solver”选项卡上启动全局优化选 型,并运行上述程序求得全局最有解:购买 1000 吨原油 A ,与库存的 500 吨原油 A 和 1000 吨原油 B 一起,共生产 2500 吨汽油乙,利润为 5000(千元)。 (2)解法二 引入 0-1 变量将(15)和(16)转化为线性约束。 令 1 z1 = , 1 z2 = , z3 = 1分别表示以 10 千元/吨、8 千元/吨、6 千元/吨的价格采 购原油 A ,则约束(15)和(16)可以替换为