1. 概论
1.1 定义
规划中的变量(部分或全部)限制为整数时,称为整数规划。目前所流行的求解整数规划的方法,往往只适用于整数线性规划,一般的整数规划方法没有一般通用的方法。
1.2 分类
整数线性规划模型大致可分为两类:
- 变量全限制为整数时,称纯(完全)整数规划。
- 变量部分限制为整数的,称混合整数规划。
1.3 特点
- 原线性规划有最优解,当自变量限制为整数后,其整数规划解出现下述情况:
① 原线性规划最优解全是整数,则整数规划最优解与线性规划最优解一致。
② 整数规划无可行解。
③有可行解(当然就存在最优解),但最优解值变差。 - 整数规划最优解不能按照实数最优解简单取整而获得。
1.4 求解方法
- 分枝定界法—可求纯或混合整数线性规划
- 割平面法—可求纯或混合整数线性规划
- 隐枚举法—求解“0-1”整数规划:
①过滤隐枚举法;
②分枝隐枚举法。 - 匈牙利法—解决指派问题(“0-1”规划特殊情形)
- 蒙特卡洛法—求解各种类型规划
2. 0-1整数规划
变量值只取0和1的一种特殊的整数规划,此时的变量称为0-1变量或者二元变量。
2.1 相互排斥的约束条件
如果有m个相互排斥的约束条件:
2.2 关于固定费用的问题
在讨论线性规划时,有些问题是要求使成本为最小。那么,可设固定成本为常数,并在线性规划的模型中不必明显列出。但有些固定费用(固定成本)的问题不能用一般线性规划来描述,而可改变为混合整数规划来解决,见下例。
2.3 指派问题的数学模型
例 拟分配n人去做n项工作,每人做且仅做一项工作,若分配第i人去做第j
3. 蒙特卡洛法(随机取样法)
对于非线性整数规划目前尚未有一种成熟而准确的求解方法,因为非线性规划本身的通用有效解法尚未找到,更何况是非线性整数规划。对于非线性整数规划问题,采用显枚举法计算量大,应用蒙特卡洛法,可找到满意解。
% 编写mengte.m文件
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];
编写如下matlab程序求解:
rand('state',gum(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
由于是随机模拟,因此每次的运行结果都是不一样的。本题可以使用Lingo软件求得精确的全局最优解,程序如下∶
model:
sets:
row/1..4/:b;
col/1..5/:cl,c2,x;
link(row,col):a;
endsets
data;
cl=1,1,3,4,2;
C2=-8,-2,-3,-1,-2;
a= 1 1 1 1 1
1 2 2 1 6
2 1 6 0 0
0 0 1 1 5;
b=400,800,200,200;
enddata
max=@sum(col:c1*x^2+c2*x);
@for(row(i):@sum(col(j):a(i,j)*x(j))<b(i));
@for(col:@ gin(x));
@for(col:@ bnd(0,x,99));
end
4. 整数规划的计算机求解
Matlab求解混合整数线性规划的命令为
[x,fval]=intlinprog(f,intcon,A,b,Aeq,beq,Lb,ub)
对应的数学模型为: min x f T x s . t . { x 为 整 数 A ⋅ x ≤ b A e q