1. 概论
1.1整数规划的定义
规划中的变量(部分或全部)限制为整数时,称为整数规划。若在线性规划模型中,变量限制为整数,则称为整数线性规划。(目前求解整数规划方法只是适用整数线性规划)
1.2整数规划的分类
如不加特殊说明,一般指整数线性规划。对于整数线性规划模型大致可分为两类:
1.变量全限制为整数时,称纯(完全)整数规划。
2.变量部分限制为整数时
,称混合整数规划。
1.3整数规划的特点
(1)原线性规划有最优解,当自变量限制为整数后,其整数规划会出现:
①原线性规划最优解全是整数,则整数规划最优解与线性规划最优解一致。
②整数规划无可行解。
③有可行解(当然就存在最优解),但最优解值变差。
(2) 整数规划最优解不能按照实数最优解简单取整而获得。
1.4求解方法的分类
(1)分枝定界法—可求纯或混合整数线性规划。
(2)割平面法—可求纯或混合整数线性规划。
(3)隐枚举法—求解“0-1”整数规划:
①过滤隐枚举法;
②分枝隐枚举法。
(4)匈牙利法—解决指派问题(“0-1”规划特殊情形)。
(5)蒙特卡洛法—求解各种类型规划。
1.5整数线性规划模型
整数线性规划模型为:
2. 分枝定界法
2.1定义
对有约束条件的最优化问题(其可行解为有限)的所有可行解空间恰当地进行系统搜索,这就是分枝与定界内容。分支定界法把全部可行解空间反复地分割为越来越小的子集,称为分枝;并且对每个子集内的解集计算一个目标上界,称为定界。每次分枝后,对于超出已知可行解集目标值的那些子集不再进一步分枝,就可以删减很多子集,这称为剪枝。
2.2解法过程
设有最大化的整数规划问题 A ,与它相应的线性规划为问题 B ,从解问题 B 开始,若其最优解不符合 A 的整数条件,那么 B 的最优目标函数必是 A 的最优目标函数 z* 的上界,记作 z1 ;而 A 的任意可行解的目标函数值将是 z* 的一个下界 z2 。分枝定界法就是将 B 的可行域分成子区域的方法。逐步减小 z1 和增大 z2 ,最终求到 z* .
2.3例题求解
- 求解整数化规划
(1)先不考虑整数规划,求解线性规划B得出最优解:
当x1 = 4.8092, x2 = 1.8168,则最优解 z = 355.8779
所以得出来是问题 A 的最优目标函数值 z* 的上界,记作 z 1。而x1 = 0, x2 = 0 显然是问题 A 的一个整数可行解,这时 z = 0 ,是 z* 的一个下界,记作 z2 , 即0 ≤ z* ≤ 356。
(2) 上述求出来的x1, x2 当前均为非整数,故不满足整数要求,任选一个进行分枝。设选 x1进行分枝,把可行集分成 2 个子集:x1 ≤ [4.8092] = 4, x1 ≥ [4.8092] +1 = 5
因为 4 与 5 之间无整数,故这两个子集的整数解必与原可行集合整数解一致。这一步称为分枝。这两个子集的规划及求解如下:
- 根据求解出来的最优值来确定z* 的界域
(3)根据求解出来x1的值,由问题B1继续分枝可得
- 由于x1=4和x2=2是整数解,所以z是B1的可行解,故z11是z*的下界。
(4)由问题B2继续分枝,并将不满足的子集删除
- 由于其它子集都不满足,只有B11满足,则最优解就是B11
2.4求解步骤
从以上解题过程可得用分枝定界法求解整数规划(最大化)问题的步骤为:
开始,将要求解的整数规划问题称为问题 A ,将与它相应的线性规划问题称为问题 B 。
(i)解问题 B 可能得到以下情况之一:
(a) B 没有可行解,这时 A 也没有可行解,则停止.
(b) B 有最优解,并符合问题 A 的整数条件, B 的最优解即为 A 的最优解,则停止。
(c) B 有最优解,但不符合问题 A 的整数条件,记它的目标函数值为 z1。
(ii)用观察法找问题 A 的一个整数可行解,一般可取 xj = 0, j = 1,L,n ,试探,求得其目标函数值,并记作 z2 。以 z* 表示问题 A 的最优目标函数值;这时有 z2 ≤ z* ≤ z1进行迭代。
第一步:对A分枝,在 B 的最优解中任选一个不符合整数条件的变量 x j ,其值为bj , 以[bj] 表示小于bj 的最大整数。构造两个约束条件xj ≤ [bj] 和 xj ≥ [bj] +1将这两个约束条件,分别加入问题 B ,求两个后继规划问题 B1 和 B2 。
定界,以每个后继问题为一分枝标明求解的结果,与其它问题的解的结果中,找出最优目标函数值最大者作为新的上界 z1。从已符合整数条件的各分支中,找出目标函数值为最大者作为新的下界 z2,若无作用 z2不变。
第二步:比较与剪枝,各分枝的最优目标函数中若有小于 z1 者,则剪掉这枝,即删除不满足的子集。若大于 z1 ,且不符合整数条件,则重复第一步骤。一直到最后得到z* = z1 为止。得最优整数解
3.割平面法
割平面法的基本思路是先求解普通线性规划问题的最优解,再对非整数解添加约束条件使可行域缩小,如此反复求解添加了约束条件的普通线性规划问题,直到得到整数解。
在先不考虑整数约束条件,直接求解松弛问题的最优解,如果满足整数条件就结束了,如果不满足整数条件,就在此非整数解的基础上增加新的约束条件重新求解。这个新增加的约束条件称为割平面,对松弛问题的可行域割一刀,割去松弛问题的部分非整数解。经过有限次的反复切割,必定可在缩小的可行域的一个整数极点上达到整数规划问题的最优解 。
割平面法的计算量比较小,但对问题的结构及求解的要求较高,算法比较复杂。割平面法
-
1.松弛变量
不等式约束相对于等式约束来说越说条件更多,有时候不好解决问题
比如x1+x2<=10
可以写为x1+x2+x3=10
只需要x3>=0
则x3被称为松弛变量 -
2.剩余变量
x1+x2>=10
可以写为x1+x2-x3=10
x3<=0
则x3被称为剩余变量
4. 0-1型整数规划
0 −1型整数规划是整数规划中的特殊情形,它的变量 x j 仅取值 0 或 1。这时 x j 称 为0 −1变量,或称二进制变量。 x j 仅取值 0 或 1 这个条件可由下述约束条件:0 ≤ xj ≤ 1,整数。
4.1相互排斥的约束条件
若有两个相互排斥的约束条件为:5x1 + 4x2 ≤ 24 或 7x1 + 3x2 ≤ 45。
为了统一在一个问题中,引入0 −1变量 y ,则上述约束条件可改写为:
式中:M为充分大的数
若把相互排斥的约束条件改为普通约束条件,就不需要引入M:
改写为:
- 若有 m 个互相排斥的约束条件:
为了保证这 m 个约束条件只有一个起作用,我们引入 m 个0 −1变量 yi(i = 1,2…m)1代表第i个约束条件起作用反之不起作用,引入一个充分大的常数 M ,而下面这一组m +1个约束条件
- 由于m个yi中只有一个能取1,设yi* = 1,所以就只有i = i*的约束条件才起作用。
4.2关于固定费用的问题(Fixed Cost Problem)
在讨论线性规划时,有些问题是要求使成本为最小。那时总设固定成本为常数,并在线性规划的模型中不必明显列出。但有些固定费用(固定成本)的问题不能用一般线性规划来描述,但可改变为混合整数规划来解决。
- 例题
某工厂为了生产某种产品,有几种不同的生产方式可供选择,如选定的生产方式投资高(选购自动化程度高的设备),由于产量大,因而分配到每件产品的变动成本就降低;反之,如选定的生产方式投资低,将来分配到每件产品的变动成本可能增加。
所以必须全面考虑。今设有三种方式可供选择:
令x j 表示采用第 j 种方式时的产量;
cj 表示采用第 j 种方式时每件产品的变动成本;
k j 表示采用第 j 种方式时的固定成本。
各种生产方式的总成本分别为:
引入0 −1变量 y j ,令:
目标函数为:
由引入0-1变量中可表示3个线性约束条件:
其中ε 是一个充分小的正常数,M 是个充分大的正常数。 - 当 x j > 0时 y j必须为 1;当 x j = 0时只有 y j 为 0 时才有意义,所以上述约束条件完全可以代替引入0-1变量。
4.3指派问题的数学模型
- 例题
拟分配n人去做n项工作,每人做且仅做一项工作,若分配第i人去做j项工作,需要花费c(ij)单位时间,求如何分配工作使工人花费时间最少?
设矩阵C = c(ij),C称为指派问题的系数矩阵。
引入0-1变量,若x(ij) = 1表示第i个人做第j项工作。
数学模型:
5. 蒙特卡洛法(随机取样法)
蒙特卡洛方法也称为计算机随机模拟方法,它是基于对大量事件的统计结果来实现一些确定性问题的计算。
- 例题
如果用显枚举法试探,共需计算(100)5 = 1010 个点,其计算量非常之大。然而应用蒙特卡洛去随机计算106 个点,便可找到满意解,那么这种方法的可信度究竟怎样呢?
下面就分析随机取样采集106 个点计算时,应用概率理论来估计一下可信度。
不失一般性,假定一个整数规划的最优点不是孤立的奇点。
假设目标函数落在高值区的概率分别为 0.01,0.00001,则当计算106 个点后,有 任一个点能落在高值区的概率分别为
1− 0.991000000 ≈ 0.99L99(100多位);
1− 0.999991000000 ≈ 0.999954602。
% 先编写M文件mengte定义目标函数 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];
% 编写M文件main如下求问题的解
rand('state',sum(clock)); % 初始化随机数发生器
p0=0;
tic % 计时开始
for i=1:10^6
x=randi([0,99],1,5); % 产生一行五列在区间[0,99]上的随机数
[f,g]=mengte(x);
if all(g<=0)
if p0<=f
x0=x;p0=f; % 记录当前较好的解
end
end
end
x0,p0
toc % 计时结束
输出为
x0 =
41 96 3 99 12
p0 =
49500
6. 整数线性规划的计算机求解
在Matlab上求解需要把多维决策变量化为一维决策变量,但是变量替换后很难把约束条件写出来。
Matlab求解混合整数线性规划的命令为:
[x,fval] = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)
对应数学模型为:
min f’x,
- 例题1
已知指派矩阵
% 需要把二维决策变量x(ij)i,j=1,...5变成一维决策变量y(k)k=1,...,25
代码为:
clc,clear
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);
intcon = 1: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);
lb = zeros(25,1);
ub = ones(25,1);
[x,y]=intlinprog(c,intcon,[],[],a,b,lb,ub);
x=reshape(x,[5,5]),y
输出为
x =
0 0 0 0 1
0 0 1 0 0
0 1 0 0 0
0 0 0 1 0
1 0 0 0 0
y =
21
- 例题2
clc,clear
f = [-3;-2;-1];
intcon = 3;
a = ones(1,3); % 整数变量的地址
b = 7;
Aeq = [4,2,1];
beq = 12;
lb = zeros(3,1);
ub = [inf;inf;1]; % x(3)为0-1变量
[x,z] = intlinprog(f,intcon,a,b,Aeq,beq,lb,ub)
x,z
输出为
x =
0
5.5000
1.0000
z =
-12