目录
方法简介
概述
若在规划问题中,变量(全部或部分)限制为整数,则称为整数规划。
目前所流行的求解整数规划的方法,往往只适 用于整数线性规划。目前还没有一种方法能有效地求解一切整数规划。
分类
(1)变量完全为整数时,称纯整数规划
(2)变量部分为整数时,称混合整数规划
特点
(1)原线性规划有最优解,当自变量限制为整数后,其整数规划解的存在特点如下:
1) 原线性规划最优解全是整数,则整数规划最优解与线性规划最优解一致。
2) 整数规划无可行解。
3)有可行解,最优解也存在,但最优解值被削弱~
(2) 整数规划最优解不能按照实数最优解简单取整而获得。
简单例题一
思路分析
若在第一时段开始安排服务员上班,则会在第四时段结束后下班;同理若在第五时段开始时安排服务员,则会在第八时段结束后下班,故第六、七、八时段不应再安排服务员上班
设第 j 时段开始时安排上班的服务员数目为 ( j = 1, 2, 3, 4,5)
代码实现
clc,clear;
f=[1,1,1,1,1];
A=[-1,0,0,0,0;-1,-1,0,0,0;-1,-1,-1,0,0;-1,-1,-1,-1,0;0,-1,-1,-1,-1;0,0,-1,-1,-1;0,0,0,-1,-1;0,0,0,0,-1];
b=[-10;-8;-9;-11;-13;-8;-5;-3];
lb=zeros(5,1);
[x,y]=linprog(f,A,b,[],[],lb)
找到最优解 x = 5×1 10 1 0 0 12
y = 23
简单例题二
代码实现
clc,clear;
f=[-40,-30];
intcon=[1,2];% 限制两个变量为整数解
A=[1,1;240,120];
b=[6;1200];
lb=ones(2,1);
[x,fval]=intlinprog(f,intcon,A,b,[],[],lb);
x,fval=-fval
找到最优解 Intlinprog 在根节点处停止,因为目标值在最优值的间隙容差范围内,options.AbsoluteGapTolerance = 1e-06。intcon 变量是容差范围内的整数,options.ConstraintTolerance = 1e-06。
x = 2×1 4 2
fval = 220
简单例题三(背包问题表现为单目标、单下标)
思路分析
代码实现
clc,clear;
f=ones(6,1);
intcon=1:6;
A=[-1,-1,-1,0,0,0;0,0,0,-1,0,-1;0,0,-1,0,-1,0;0,-1,0,-1,0,0;0,0,0,0,-1,-1;-1,0,0,0,0,0];
b=-ones(6,1);
lb=0;
ub=1;
[x,fval]=intlinprog(f,intcon,A,b,[],[],lb,ub);
x,fval
找到最优解 Intlinprog 在根节点处停止,因为目标值在最优值的间隙容差范围内,options.AbsoluteGapTolerance = 1e-06。intcon 变量是容差范围内的整数,options.ConstraintTolerance = 1e-06。
x = 6×1 1 0 0 1 1 0
fval = 3
% 蒙特卡洛法暴力求解
clc,clear;
% 模拟次数
n=100000;
% 初始化
res_x=0;
res_min=+Inf;
% 循环
for i=1:n
x=randi([0,1],6,1);% 随机生成一组解
if((x(1)+x(2)+x(3)>=1)&(x(4)+x(6)>=1)&(x(3)+x(5)>=1)&(x(2)+x(4)>=1)&(x(5)+x(6)>=1)&(x(1)>=1))
sum_x=sum(x);
if(sum_x<res_min)
res_x=x;
res_min=sum_x;
end
end
end
res_min,res_x
简单例题四(指派问题表现为多目标、双下标)
思路分析
约束条件:(1)每台设备必然分给四个企业中的一个
(2)每个企业最少分一台
代码实现
clc,clear;
f=-[4 2 3 4, 6 4 5 5,7 6 7 6,7 8 8 6,7 9 8 6,7 10 8 6];
intcon=1:24;
A=-[eye(4),eye(4),eye(4),eye(4),eye(4),eye(4)];
b=-ones(4,1);
Aeq=[ones(1,4),zeros(1,20);
zeros(1,4),ones(1,4),zeros(1,16);
zeros(1,8),ones(1,4),zeros(1,12);
zeros(1,12),ones(1,4),zeros(1,8);
zeros(1,16),ones(1,4),zeros(1,4);
zeros(1,20),ones(1,4)];
beq=ones(6,1);
lb=zeros(24,1);
ub=ones(24,1);
[x,fval]=intlinprog(f,intcon,A,b,Aeq,beq,lb,ub);
x,fval=-fval
找到最优解 Intlinprog 在根节点处停止,因为目标值在最优值的间隙容差范围内,options.AbsoluteGapTolerance = 1e-06。intcon 变量是容差范围内的整数,options.ConstraintTolerance = 1e-06。
x = 24×1 0 0 0 1 1 0 0 0 1 0
fval = 44
%蒙特卡洛法暴力求解
clc,clear;
% 模拟次数
n=10000;
f=[4 2 3 4; 6 4 5 5;7 6 7 6;7 8 8 6;7 9 8 6;7 10 8 6];
% 初始化
res_x=0;res_max=0;
% 循环
for k=1:n
flag=1;
x=randi([1,4],1,6);
for J=1:4
% 判断每个企业是否分到一台设备
z=ismember(J,x);
if(z==0)
flag=0;
break;
end
end
% 每个企业分到一台设备
if(flag==1)
sum=0;
for i=1:6
sum=sum+f(i,x(J));
end
% 比较利润大小
if(sum>res_max)
res_max=sum;
res_x=x;
end
end
end
res_x,res_max
res_x = 1×6 2 1 3 3 4 1
res_max = 39