1.分枝定界法的思想
分枝定界法通过增加附加约束条件,使整数最优解最终成为线性规划的一个极点(顶点),于是整个问题就可使用单纯形法找到这个整数最优解;对有约束条件的最优化问题(其可行解为有限数)的可行解空间恰当地进行系统搜索,这就是分枝与定界的内容。通常,把全部可行解空间反复地分割为越来越小的子集,称为分枝;并且对每个子集内的解集计算一个目标下界,这称为定界。在每次分枝后,凡是界限不优于已知可行解集目标值的那些子集不再进一步分枝,这样,许多子集可不予考虑,这称为剪枝。这就是分枝定界法的主要思路。
下面通过例子说明分枝定界法的步骤。
2.用分枝定界法求解整数规划
例1: 某厂拟购进甲、乙两类机床生产新产品。已知甲、乙机床进价分别为2万元和3万元;安装占地面积分别为4m2和2m2;投后的收益分别为3百元/日和2百元/日。厂方目前仅有资金14万元,安装面积18m2,为使收益最大,厂方应购进甲、乙机床各多少台?
解:设应购进甲、乙机床台数分别为x1和x2,对此问题可建立整数规划数模如下:
(1)去掉约束(4),用图解法求得对应的松弛问题LP0(松弛问题LP0与原模型的区别:仅不含整数约束,目标函数与其他约束均同。)的最优解(见图1)。
图1
由图1知,松驰问题的最优解为h点:,Z(0)=14.75
由此可知ILP的最优解为:0≤z* ≤ Z(0)*=14.75, 且必为整数,从而可以断言: 0≤z* ≤14。因 x1=3.25 ,x2=2.5非整数解,故选择一个非整数变量分枝,这里选x1,即对 3 ≤ x1 ≤ 4 进行分枝。
(2)对上问题分枝构成两个子问题数模LP1和LP2如下:
子问题数模 LP1 子问题数模LP2
max Z=3x1+2x2 max z=3x1+2x2
(3)对这两个子问题数模用图解法求得最优解分别为 (见图1):
记Z*为当前最好的整数解,则Z*=Z(2)=14
(4)由于Z(1)> =14,对子问题LP1需继续分枝,选择x2分枝得到子问题LP3和LP4如下:
子问题数模LP3 子问题数模LP4
max Z=3x1+2x2 max Z=3x1+2x2
(5)对LP3和LP4两个子问题数模用图解法求得最优解分别为(见2):
X(3)=(3, 2) T, Z(3)=13
X(4)=(2.5, 3) T, Z(4)=13.5
(6)此时由于所有子问题的目标值均小于或等于Z(2),故Z* =Z(2)=14。最优解为:
X* =X(2)=(4,1)T , Z * =14
由此可知,例1的最优解是:工厂应购进甲类机床4台,乙类机床1台,可获最大收益为14(百元/日)。
3.分枝定界法的一般步骤
设有最大化的整数规划问题A ,与它相对应的松弛问题为 B。
(1)先不考虑原问题的整数约束,求解相应的松弛问题。用图解法或单纯形法求得最优解,记为 。
(2)若求得的最优解 刚好就是整数解,则该整数解就是原整数规划问题的最优解;否则,对原问题进行分枝寻求整数最优解。
(3)分枝。根据对变量重要性的了解,在最优解中选择一个不符合整数约束条件的xj ,其值为bj ,以[bj]表示小于bj 的最大整数。构造两个约束条件: x≤ [bj]和 x≥[bj]+1分别加入原LP问题形成两个子问题,因为[bj] 与[bj]+1之间无整数,故这两个子集内的整数解必定与原可行解集合整数解一致,这一步称为分枝。
(4)定界。首先判断各个子问题是否存在整数解。若存在,找出目标函数值最大对应的整数解,设为Z*,则A问题的整数解目标函数Z≥Z*,这就是定界。而且分枝过程中,一旦有某个子问题Z≥Z*,则令Z*=Z。
(5)若存在大于Z*的子问题则需分枝。第(4)步中若不存在整数解,也需继续分枝寻找整数解,并从目标函数值最大对应的子问题先分枝。
(6)若所有子问题的目标值都小于等于Z*,则不需继续分枝,Z*所对应的整数解即为最优解。
1.割平面法思想
分枝定界法是对原问题可行解域进行了切割,切割的方法是对取非整数解相邻整数作附加约束,这些附加约束从图解的几何概念上说,是一些相当于切割可行解域的超平面,它们的特点是与坐标轴平行,虽然约束方程简单,但子问题却由于分枝的增多而呈指数增长。为了克服上述缺点,本节介绍的割平面法则采用另一种切割办法,既要切割掉非整数解域,又不希望对原问题进行分枝。
割平面法的基础仍然是用解线性规划的方法去解整数规划问题。首先不考虑变量为整数这一约束条件。但增加线性约束条件(用几何术语,称为割平面)使得从原可行解域中切割掉一部分,这部分只包含非整数解,但没有切割掉任何整数可行解。因此,采用割平面法的关键是如何找到割平面约束方程,使切割后最终得到这样的可行解域,它的一个有整数坐标的极点恰好就是问题的最优解(见图1示)。
2.割平面法的步骤
(1)去掉整数约束,用单纯形法求解。若最优解是整数,停止计算,否则转下一步;
(2)寻求附加约束(割平面方程);
① 从最优表中抄下非整数解的某个约束方程;
② 将该约束方程的所有系数和常数分解为整数和正真分数之和;
③ 整数项(包括整系数项和整常数项)归写于方程左边,真分数项写于右边;
④ 利用整数约束条件求出割平面方程。
(3)将割平面方程标准规范化后加到约束方程组中求解,如所得最优解仍为非整数,则转到第(2)步继续进行,直到找到最优整数解为止。
现举例来说明割平面法解题步骤。
例1:求下列整数规划模型:
解:(1)去掉整数约束。如果约束条件系数和右边常数不是整数,则需化约束为整,而后才能标准规范化(这是保证所添加的松驰变量均为整数)。如下:
用单纯形法迭代得最终表1。
表1
XB |
x1 |
x2 |
x3 |
x4 |
b |
x2 |
0 |
1 |
1/2 |
-1/2 |
5/2 |
x1 |
1 |
0 |
-1/4 |
3/4 |
13/4 |
-Z |
0 |
0 |
-1/4 |
-5/4 |
-59/4 |
最优解:X1=13/4,X2=5/2,Z=59/4 为非整数解。
(2)寻找割平面方程。从最优表1中抄下非整数解的约束方程。例如第一个约束方程:
将①式的所有系数和常数分解为整数和正真分数之和,即:
将上式中的整系数项归写于方程左边,真分数项写于右边,即有:
现对②式进行分析:考虑整数约束条件,②式左边为整数,右边的(·)内是正数;为保持方程平衡,所以②式右边必是负数。因此有:
即有:,③式即为割平面方程。
对原数模引入割平面约束,将③式标准规范化(松驰变量x5也必为整数):加到表1中,用对偶单纯形法求解,求解过程示于表2。
表2
XB |
x1 |
x2 |
x3 |
x4 |
x5 |
b |
x2 |
0 |
1 |
1/2 |
-1/2 |
0 |
5/2 |
x1 |
1 |
0 |
-1/4 |
3/4 |
0 |
13/4 |
x5 |
0 |
0 |
[-1/2] |
-1/2 |
1 |
-1/2 |
-Z |
0 |
0 |
-1/4 |
-5/4 |
0 |
-59/4 |
x2 |
0 |
1 |
0 |
-1 |
1 |
2 |
x1 |
1 |
0 |
0 |
1 |
-1/2 |
7/2 |
x3 |
0 |
0 |
1 |
1 |
-2 |
1 |
Z |
0 |
0 |
0 |
-1 |
-1/2 |
-58/4 |
得最优解为x1=7/2,x2=2,仍为非整数,故又转入第二步求割平面方程。为此从表2中抄下非整数解x1=7/2的约束方程为:,按整数、分数归并原则写成:,考虑整数约束条件,上式左边为整数;为保持方程平衡,因此上式右边必为负数,有:
④式为割平面方程。将④式标准规范化:加到表2中,用对偶单纯形法求解,求解过程如表3所示。得最优解:x1=4,x2=1,Z=56/4=14,为整数最优解,计算停止。
表3
XB |
x1 |
x2 |
x3 |
x4 |
x5 |
x6 |
b |
x2 |
0 |
1 |
0 |
-1 |
1 |
0 |
2 |
x1 |
1 |
0 |
0 |
1 |
-1/2 |
0 |
7/2 |
x3 |
0 |
0 |
1 |
1 |
-2 |
0 |
1 |
x6 |
0 |
0 |
0 |
0 |
[-1/2] |
1 |
-1/2 |
-z |
0 |
0 |
0 |
-1 |
-1/2 |
0 |
-58/4 |
x2 |
0 |
1 |
0 |
-1 |
0 |
2 |
1 |
x1 |
1 |
0 |
0 |
1 |
0 |
-1 |
4 |
x3 |
0 |
0 |
1 |
1 |
0 |
-4 |
3 |
x5 |
0 |
0 |
0 |
0 |
1 |
-2 |
1 |
-Z |
0 |
0 |
0 |
-1 |
0 |
-1 |
-56/4 |
上述过程中找到的两个用决策变量表示的割平面方程分别为:
2x1+2x2≤11
x1+x2≤5
它们的切割过程见图1。由图1可知:
①去掉整数约束,求得最优解为(3.25,2.5),非整数解。
②第一个割平面方程:2x1+2x2≤11,得最优解为(3.5,2),非整数解。
③第二个割平面方程:x1+x2≤5,得最优解为(4,1),整数解。
图1割平面寻优
当决策变量xi的取值仅为0或1时的规划问题称为0-1型整数规划问题。它是整数规划中的特殊情形,应用很广泛,因此成为整数规划中的一个重要分支。
0–1整数规划虽然可用一般求整数规划的方法求解。但0–1型整数规划是整数规划的一种特例,有自身的特殊解法――隐枚举法。现举例说明。
1. 0-1规划数学模型
例1:某厂拟在A,B,C,D,E五个城市中建立若干产品经销联营点,各处设点都需资金、人力、设备等,需求量以及能提供的利润各处不同,有些点可能亏本,但却能获得贷款和人力等。假设数据已知,见表1,为使总收益最大,问厂方应作何种最优选点决策?
表1
资源 城市 |
应投资金 (百万元) |
应投人力 (人) |
应投设备 (套) |
利润 (十万元) |
A |
4 |
5 |
1 |
4.5 |
B |
6 |
4 |
1 |
3.8 |
C |
12 |
12 |
1 |
9.5 |
D |
-8 |
3 |
0 |
-2 |
E |
1 |
-8 |
0 |
-1.5 |
限制资源 |
20 |
15 |
2 |
|
解:上述各城市是否被选,可用决策变量xj表示(j=1,2,…5),xj=1表示被选,否则xj=0,根据已知数据可建数模如下:
每个城市都有可能入选和不入选,即xj取值有0或1两种状态;有五个变量,这样的0,1组合就共有25=32个。把每种组合列出,代入约束方程检验是否可行,这是一项很繁琐的工作,并且找出可行组合后还要代入目标函数去比较得出最优解,因此,用枚举法仅对一些小型问题是可行和有效的。当变量个数增多时,组合解个数是按指数规律倍增,用枚举法将会非常困难。
实际上只要我们按目标函数值从优到劣(本例是从大到小)顺序列出组合,逐个检验其可行性,最先满足所有约束方程的组合就是最优解;而劣于最优解的组合即使可行,也不用去列出和检验,这就相当于把枚举法得出的所有非优组合隐去不算了,故称为隐枚举法。
2.隐枚举法求解步骤
(1)变换目标函数和约束方程组
① 价值系数Cj前的符号统一。 在目标要求极大时,统一带负号;求极小时统一带正号。方法是:在不满足上述要求时,用代入目标函数。如例1求极大,x1,x2,x3前符号不满足要求,用代入目标函数和约束方程;
② 按∣Cj∣值从小到大排列决策变量项。上例变换结果如下:
(2)用目标函数值探索法求最优解
组合又满足全部约束条件,则它为最优解;否则,按劣于Z0的组合解方向探索可行解。为此,按公式(1)须由小到大逐项计算组合解的Σ|Cj|值及其相应的Z值,代入约束方程组检查可行性,如全部满足,即为最优解。
目标函数值探索法计算过程示于表2,得最优解为:x1=1-=1,x2=1-=0,x3=1-=1,x4=0,x5=1,即在A,C,E三个城市中设联营点,可获最大收益12.5(十万元)。
表2
在生活中经常遇到这样的问题,某单位需完成n项任务,恰好有n个人可承担这些任务。由于每人的专长不同,各人完成任务 (或所费时间) 不同,效率也不同。于是产生应分派哪个人去完成哪项任务,使完成n项任务的总效率最高(或所需总时间最短)。这类问题称为分派问题(Assignment Problem)。
1.分派问题数学模型
例1:有A、B、C、D四项任务需分派给甲、乙、丙、丁四个人去做,这四个人都能承担上述四项任务,但完成各项任务所需时间如表1所示。问应如何分派任务可使完成任务的总工时最少?试建立基数学模型。
表1
任务 人 |
A |
B |
C |
D |
甲 |
9 |
17 |
16 |
7 |
乙 |
12 |
7 |
14 |
16 |
丙 |
8 |
17 |
14 |
17 |
丁 |
7 |
9 |
11 |
9 |
解:引入决策变量xij
指派问题的解矩阵应当是每行或每列只能有一个元素为1,其余均为 0 的 n 阶方阵。如例 1的一个解矩阵:
2.匈牙利法原理
分派问题是0-1规划的特例,也是运输问题的特例。虽然分派问题可用整数规划、0-1规划或运输问题的解法去求解,但都很费事。匈牙利数学家柯尼格(D. Konig)提出了一种新颖而又简便的解法,常称为匈牙利法。
匈牙利法是针对目标要求极小问题提出来的。其基本原理是:为了实现目标极小,在系数矩阵元素Cij≥0的条件下,如果能使矩阵具有一组处于不同行又不同列的零元素(C’ij=0)打上括号(),对应该元素的决策变量xij=1,未打括号元素对应的决策变量xij=0,那么目标函数值Z=为最小,这样的组合解就是最优解。
定理1:从(cij )矩阵的每行(或列)减去或加上一个常数ui(或vj)构成新矩阵(c′ij),c′ij= cij±(uI+vj ),则对应(c′ij)的(xij)最优解与原(cij )的最优解等价。
证明:如从新矩阵中得到最优解(xij),则其目标函数值达到极值:其中:K为一常数,故当Z‘达到极值时Z也达到极值。所以(xij)也为原矩阵(cij )的最优解。
利用这个定理,可以使原系数矩阵(Cij)变换成含有很多0元素的新系数矩阵(c′ij),从而最优解保持不变。
独立的0元素:在系数矩阵(c′ij)中,位于不同行不同列的0元素。
若能在系数矩阵(c′ij)中找出n个独立的0元素,则令解矩阵(Xij)中对应这n个独立0元素的取值为1,其他元素取值为0。将其代入目标函数中得到Z’=0,因C′ij≥0,故它一定是最小值。这就是以(c′ij)为系数矩阵的分派问题的最优解,也就是原问题的最优解。
3.匈牙利法求解步骤
例2:求解例1中的最优解。
(1)变换系数矩阵,使其每行每列都出现0元素。首先每行减去该行最小数,再每列减去该列最小数。
|
(2)进行试分派,寻求最优解
经过上一步变换后,系数矩阵每行每列都已有了0元素,此时需找出n个独立的0元素,为此按下列步骤进行。
① 从只有一个0元素的行(两个或两个以上0元素的行暂时不考虑,跳过去)开始,给这个0元素打上括号(),记作(0),表示对这行所代表的人,只有一种任务可分派。同时划去(0)所在列的其他0元素,记作φ。这表示这列所代表的任务已分派完,不必再考虑别人了。
② 给只有一个0元素的列(两个或两个以上0元素的列暂时不考虑,跳过去)的0元素打括号;然后划去(0)所在行的其他0元素,记作φ。
③ 反复进行①,②两步,直到所有0元素都被打括号和划掉为止。转第⑤步。
④ 若仍有没有打括号或划掉的0元素,且同行(列)的0元素至少有两个,则找有0元素的矩形闭回路,任选一个0元素打括号,破闭回路,直到所有0元素都已打括号或划掉为止。
⑤ 若打括号0元素的数目m等于矩阵的阶数n,那么这分派问题的最优解已得到,否则转第(3)步。
对例1中的系数矩阵变换后,按上面步骤进行试分派,如下:
,
找到了4个独立的0元素,解矩阵如(xij)示。即甲→D,乙→B,丙→A,丁→C。总工时:Z=7×1+7×1+8×1+11×1=33。
例3下列系数矩阵出现0元素闭回路,可通过第④步破闭回路求解:
若所有的0元素都已打括号或划掉,但独立的0元素个数小于矩阵阶数,还需下面的第三步继续求解。
(3)用覆盖理论继续求解
定理2:覆盖所有0元素的最少直线条数正好等于已打括号的0元素个数。
方法:作最少的直线覆盖所有0元素。步骤如下:
① 对没有打括号0元素的行打√号;
② 对已打√的行中所有0元素所对应的列打√号;
③ 再对打有√的列中打括号的0元素所对应的行打√号;
④ 重复②,③,直到得不出新的打√号的行、列为止。
⑤ 对没有打√号的行画一横线,已打√号的列画一纵线,这就得到了覆盖所有0元素的最少直线数。
⑥ 在未被直线覆盖的部分中找出最小数,然后未覆盖区所有元素减去这个最小数;而覆盖区的交叉元素加上刚才的最小数,其余元素不变。这样得到新的系数矩阵,它的最优解和原问题相同,转第(2)步。
上面的覆盖理论,主要是为了第⑥步,增加0元素的个数。
例4:下列系数矩阵得打括号的0元素个数小于矩阵阶数,用覆盖理论求最优解。
此时, 得最优解为:
4.非标准指派问题
匈牙利法只适用于符合以下三个条件的分派问题的求解:
① 目标函数为极小型;
② 系数矩阵为方阵;
③ 系数矩阵元素值非负。即:
对于不满足上述三个条件的分派问题应转化为标准指派问题。
(1)当分派问题目标要求极大时,即求,此时,可把求极大型转变为求极小型,利用式:
即:,
再由定理1,矩阵(-Cij)nxn每行均可加上一个常数M(或令Cij中最大元素为M即可),令:,这时系数矩阵可变换为:这时,bij≥0,B叫C的缩减矩阵。符合匈牙利法的条件。由定理1可知:所得的最小解就是原问题的最大解。
(2)系数矩阵不是方阵,目标仍为Min型问题:系数矩阵化为方阵。
其特点是:m 个人分派做 n 项工作,系数矩阵(Cij)为 m×n 矩阵,m ≠ n 。
①若 m < n ,则增添虚构的 s = n – m 行,补成方阵,但是对应的Cij=0 。
②若 m > n ,则增添虚构的 s = m – n 列,补成方阵,但是对应的Cij=0 。