第二章 整数规划

第二章 整数规划

###1 概要
####1.1 整数规划的分类
####1.2 求解方法分类
###2 分枝定界法
###3 0 −1型整数规划
###4 蒙特卡洛法(随机取样法)
###5 指派问题的计算机求解
###6 生产与销售计划问题

###1.概要
####1.1 整数规划的分类
1) 变量全限制为整数时,称纯(完全)整数规划。
2) 变量部分限制为整数的,称混合整数规划。

####1.2 求解方法分类:
(i)分枝定界法—可求纯或混合整数线性规划。
(ii)割平面法—可求纯或混合整数线性规划。
(iii)隐枚举法—求解“0-1”整数规划:
①过滤隐枚举法;
②分枝隐枚举法。
(iv)匈牙利法—解决指派问题(“0-1”规划特殊情形)。
(v)蒙特卡洛法—求解各种类型规划。

###2 分枝定界法
设有最大化的整数规划问题 A ,与它相应的线性规划为问题 B ,从解问题 B 开始, 若其最优解不符合 A 的整数条件,那么 B 的最优目标函数必是 A 的最优目标函数 * z 的 上界,记作 z ;而 A 的任意可行解的目标函数值将是 * z 的一个下界 z 。分枝定界法就 是将 B 的可行域分成子区域的方法。逐步减小 z 和增大 z ,最终求到 * z 。

###3 0 −1型整数规划
0 −1型整数规划是整数规划中的特殊情形,它的变量 j x 仅取值 0 或 1。这时 j x 称 为0 −1变量,或称二进制变量。 j x 仅取值 0 或 1 这个条件可由下述约束条件:
0 ≤ xj ≤ 1,整数所代替,是和一般整数规划的约束条件形式一致的。
在这里插入图片描述
求解思路及改进措施:
(i) 先试探性求一个可行解,易看出( , , ) (1,0,0) x1 x2 x3 = 满足约束条件,故为一个可行解,且 z = 3。
(ii) 因为是求极大值问题,故求最优解时,凡是目标值 z < 3的解不必检验是否 满足约束条件即可删除,因它肯定不是最优解,于是应增加一个约束条件(目标值下界):
(iii) 改进过滤条件。
(iv)由于对每个组合首先计算目标值以验证过滤条件,故应优先计算目标值 z 大 的组合,这样可提前抬高过滤门槛,以减少计算量。

###4 蒙特卡洛法(随机取样法)
在这里插入图片描述
解 (i)首先编写 M 文件 No02_07_01.m 定义目标函数 f 和约束向量函数 g,程序如下:
function [f,g]=No02_07_01(x);
f=x(1)2+x(2)2+3x(3)2+4*x(4)2+2x(5)-8x(1)-2x(2)-3x(3)-…
x(4)-2
x(5);
g=[sum(x)-400
x(1)+2x(2)+2x(3)+x(4)+6x(5)-800
2
x(1)+x(2)+6x(3)-200
x(3)+x(4)+5
x(5)-200];
(ii)编写M文件No2_07.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]=No02_07_01(x1);
if sum(g<=0)==4
if p0<=f
x0=x1;p0=f;
end
end
[f,g]=No02_07_01(x2);
if sum(g<=0)==4
if p0<=f
x0=x2;p0=f;
end
end
end
x0,p0
toc
运行结果:x0 =
48
90
2
99
15

p0 =
48951
所以,x1=48,x2=90,x3=2,x4=99,x5=15 ,z=48951

###5 指派问题的计算机求解
整数规划问题的求解可以使用 Lingo 等专用软件。对于一般的整数规划问题,无法直接利用 Matlab 的函数,必须利用 Matlab 编程实现分枝定界解法和割平面解法。但对于指派问题等0 −1整数规划问题,可以直接利用 Matlab 的函数 bintprog 进行求解。(我在使用bintprog函数过程中出现函数未定义现象)
在这里插入图片描述
解: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
[email protected](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));
End
求得最优指派方案为 x15 = x23 = x32 = x44 = x51 = 1,最优值为 21。
下图为运行结果部分截图:
在这里插入图片描述
###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) 可表示
为如下的分段线性函数(以下价格以千元/吨为单位):
在这里插入图片描述 (5)
设原油 A 用于生产甲、乙两种汽油的数量分别为 x11和 x 12,原油 B 用于生产甲、乙两种汽油的数量分别为 x21 和 x22 ,则总的收入为 4.8( x11 + x 21) +5.6(x12 + x22 ) (千元)。于是本例的目标函数(利润)为
max z=4.8( x11 + x 21) +5.6(x12 + x22 ) — c(x) (6)
约束条件包括加工两种汽油用的原油 A 、原油 B 库存量的限制,原油 A 购买量的限制,以及两种汽油含原油 A 的比例限制,它们表示为
x 11+ x12 ≤ 500 + x (7)
x 21+ x22 ≤ 1000 (8)
x ≤ 1500 (9)
x11 / (x11 + x21) >= 0.5 (10)
x12 / (x12 + x22) >=0.6 (11)
x11 , x12, x21 , x22 , x>=0 (12)
由于(5)式中的c(x) 不是线性函数,(5)~(12)给出的是一个非线性规划,而且,对于这样用分段函数定义的c(x) ,一般的非线性规划软件也难以输入和求解。

6.3 求解模型
下面介绍 3 种解法
(1)解法一
一个自然的想法是将原油 A 的采购量 x 分解为三个量,即用 x1 , x2 , x3 分别表示以价 格 10 千元 / 吨 、 8 千 元 / 吨 、 6 千 元 / 吨采购的原油 A 的吨数,总支出为 c(x) = 10 x1 +8 x2 + 6 x3 ,且
x = x1 + x2 + x3 (13)
这时目标函数(6)变为线性函数:
max z=4.8( x11 + x21) + 5.6(x12 + x22 ) -(10 x1 + 8 x2 + 6 x3 ) (14)
应该注意到,只有当以 10 千元/吨的价格购买 x1 =500(吨)时,才能以 8 千元/吨的价格购买 x2( >0) ,这个条件可以表示为
( 500- x1 ) x2 = 0 (15)
同理,只有当以 8 千元/吨的价格购买 x2 = 500(吨)时,才能以 6 千元/吨的价格购买
x3 (>0) ,于是
(x2 − 500)x3 = 0 (16)
此外, x1 , x2 , x3 的取值范围是
0 ≤ x1 , x2 , x3 ≤ 500 (17)
由于有非线性约束(15)、(16),因而(7)~(17)构成非线性规划模型。
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))[email protected](var2:cx);
y(1)+y(3)<@sum(var2:x)+500;
y(2)+y(4)<1000;
0.5
(y(1)-y(2))>0;
0.4y(3)-0.6y(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

最优解:购买 1000 吨原油 A ,与库存的 500 吨原油 A 和1000 吨原油 B 一起,共生产 2500 吨汽油乙,利润为 5000(千元)。