第二章 整数规划
2.1 整数规划的基本知识
1、定义:数学规划中的变量(部分或全部)限制为整数时,称为整数规划。
2、分类:
(1)变量全限制为整数时,称纯(完全)整数规划。
(2)变量部分限制为整数时,称混合整数规划。
3、特点:
(1)整数规划无可行解(在原线性规划最优解是实数解)。
(2)整数规划最优解不能由实数最优解简单取整得到。
4、求解方法:
(1)分枝定界法;(2)割平面法;(3)隐枚举法:过渡隐枚举法、分枝隐枚举法;(4)匈牙利方法(5)蒙特卡罗方法。
2.2 0-1型整数规划,一种特殊的整数规划
核心:构造相互排斥的约束条件。
可以采用如下的方法解决:
如果有m个互相排斥的约束条件,
2.2.2固定费用问题
2.2.3指派问题
2.3 蒙特卡罗法(随机取样法)
核心:所谓蒙特卡罗方法,就是从概率理论来估计出对应区间范围内的一个满意解。
应用:
1、用蒙特卡罗方法求解图形面积的近似值(投点法)
例题:
y
=
x
2
,
y
=
12
−
x
y=x^2,y=12-x
y=x2,y=12−x与
x
x
x轴在第一象限围成一个曲边三角形,求该图形面积的近似值。
解释:在矩形区域
[
0
,
12
]
∗
[
0
,
9
]
[0,12]*[0,9]
[0,12]∗[0,9]上产生服从均匀分布的
1
0
7
10^7
107个随机点,统计随机点落在曲边三角形的频数。
clc,clear
x=unifrnd(0,12,[1,10^7]);
y=unifrnd(0,9,[1,10^7]);
pinshu=sum(y<x.^2&x<=3)+sum(y<12-x&x>=3);//值得学习的是,可以在计算函数中用表达式控制计算的范围
area_appr=12*9*pinshu/10^7;
2、用Monte Carlo方法求解已知的非线性整数规划
编程时,可以先新建一个目标函数文件,里面包含定义的目标函数和约束条件;再编写求解过程和搜索的主程序。
//函数体部分
function[f,g]=mengte(x)
f=x(1)^2+x(2)^2+3*x(3)^2+4*x(4)^2+2*x(5)^2-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];
//主程序部分
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
disp([x0,p0]);
toc//计时结束
2.4 指派问题的MATLAB求解
使用intlinprog函数,但是要将所有的决策变量转化为一维决策变量。
在编程时,注意对约束条件的改写,参考2.2.3中的模型及下面的函数模型,用变量下标的变化来表示相应约束条件(可以通过找规律归纳出下标的表达式,便于用循环编程)
[x,fval]=intlinprog(f,intcon,A,b,Aeq,beq,lb,ub);
式子中,
f
,
x
,
i
n
t
c
o
n
,
b
,
b
e
q
,
l
b
,
u
b
f,x,intcon,b,beq,lb,ub
f,x,intcon,b,beq,lb,ub为列向量;
A
,
A
e
q
A,Aeq
A,Aeq为矩阵。
例题:
已知指派问题矩阵:
解析:将二维决策变量变成一维决策变量。
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,fval]=intlinprog(c,intcon,[],[],a,b,lb,ub);
x=reshape(x,[5,5]);
disp(fval);
参考文献
[1]司守奎,孙玺菁. 数学建模算法与应用. 北京:国防工业出版社,2011.