运筹优化(十)--整数规划求解

版权声明:随便转,取之于网络,用之于网络。。。 https://blog.csdn.net/App_12062011/article/details/86531921

分支界定法

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割平面寻优

0-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元素。首先每行减去该行最小数,再每列减去该列最小数。

-4

(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,BC的缩减矩阵。符合匈牙利法的条件。由定理1可知:所得的最小解就是原问题的最大解。

(2)系数矩阵不是方阵,目标仍为Min型问题:系数矩阵化为方阵。

其特点是:个人分派做 项工作,系数矩阵(Cij) m×矩阵, n 

 m < n ,则增添虚构的 s = n – m 行,补成方阵,但是对应的Cij=0 

 m > n ,则增添虚构的 s = m – n 列,补成方阵,但是对应的Cij=0 

猜你喜欢

转载自blog.csdn.net/App_12062011/article/details/86531921