现实生活中,比如机器的台数,参与工作的人数,可调动的车辆数,这些数据都是整数。因此对于变量中包含整数、或者完全是整数的规划问题,我们称之为整数规划。在解决整数规划常用的算法便是单纯形法。
课题名称:任务的分配
设有甲、乙、丙、丁四个人,各有能力去完成A、B、C、D、E五项任务中的任一项,由于四个人的能力和经验不同,所需完成各项任务的时间如表1所示.由于任务数多于人数,要求考虑如下问题:
(1) 任务E必须完成,其他四项中可任选三项完成;
(2) 要求有一个人完成两项任务,其他人各完成一项;
(3) 要求任务A可由甲或丙完成,任务C可由丙或丁完成,任务E可由甲、乙或丁完成,且规定四个人中丙或丁能够完成两项任务,其他人完成一项任务。
试分别确定最优的分配方案,使得完成任务的总时间最少。
表1 每个人完成各项任务的能力
项目 人员 | A | B | C | D | E |
甲 | 25 | 29 | 31 | 42 | 37 |
乙 | 39 | 38 | 26 | 20 | 33 |
丙 | 34 | 27 | 28 | 40 | 32 |
丁 | 24 | 42 | 36 | 23 | 45 |
由于任务数大于人数,所以需要有一个虚拟的人,设为戊。因为工作E必须完成,故设戊完成E的时间为M(M为非常大的数),即戊不能做工作E,其余的假想时间为0,建立的效率矩阵如表2:
表2 每个人完成各项任务的能力
项目 人员 | A | B | C | D | E |
甲 | 25 | 29 | 31 | 42 | 37 |
乙 | 39 | 38 | 26 | 20 | 33 |
丙 | 34 | 27 | 28 | 40 | 32 |
丁 | 24 | 42 | 36 | 23 | 45 |
戊 | 0 | 0 | 0 | 0 | M |
令第 i 个人表示甲、乙、丙、丁、戊,第 j 个任务分别表示A、B、C、D、E项任务,cij 表示第 i 个人完成第 j 个任务的时间(d)。设:
Z为完成任务的总时间(d)。则该问题的数学模型为:
为输入程序方便,令M=1000.
方法一:Matlab求解
Matlab程序:
c=[25 29 31 42 37;39 38 26 20 33;34 27 28 40 32;24 42 36 23 45;0 0 0 0 1000];
n=size(c,1);
c=c(:);
a=zeros(2*n,n^2);
for i=1:na(i,(i-1)*n+1:n*i)=1;a(n+i,i:n:n^2)=1;
end
b=ones(2*n,1);
[x,y]=linprog(c,[],[],a,b,zeros(n^2,1),ones(n^2,1));
X=reshape(x,n,n);
X_min=round((X)),y
Matlab运行结果:
Optimization terminated.
X_min =0 1 0 0 00 0 0 1 00 0 0 0 11 0 0 0 00 0 1 0 0
y =105.0000
方案:甲——B ,乙——D ,丙——E ,丁——A , 总时间为105(d).
方法二:lingo求解
Lingo程序:
model:
sets:
row/1..5/;
arrange/1..5/;
link(row,arrange):c,x;
endsets
data:
c=25,29,31,42,37,39,38,26,20,33,34,27,28,40,32,24,42,36,23,45,0,0,0,0,1000;
enddata
[OBJ]min=@sum(link(i,j):c(i,j)*x(i,j));
x(1,1)+x(1,2)+x(1,3)+x(1,4)+x(1,5)=1;
x(2,1)+x(2,2)+x(2,3)+x(2,4)+x(2,5)=1;
x(3,1)+x(3,2)+x(3,3)+x(3,4)+x(3,5)=1;
x(4,1)+x(4,2)+x(4,3)+x(4,4)+x(4,5)=1;
x(5,1)+x(5,2)+x(5,3)+x(5,4)+x(5,5)=1;
x(1,1)+x(2,1)+x(3,1)+x(4,1)+x(5,1)=1;
x(1,2)+x(2,2)+x(3,2)+x(4,2)+x(5,2)=1;
x(1,3)+x(2,3)+x(3,3)+x(4,3)+x(5,3)=1;
x(1,4)+x(2,4)+x(3,4)+x(4,4)+x(5,4)=1;
x(1,5)+x(2,5)+x(3,5)+x(4,5)+x(5,5)=1;
@for(link(i,j):x(i,j)>=0;);
end
Lingo运行结果:
Global optimal solution found.Objective value: 136.0000Infeasibilities: 0.000000Total solver iterations: 9Elapsed runtime seconds: 0.04Variable Value Reduced CostC( 1, 1) 25.00000 0.000000C( 1, 2) 29.00000 0.000000C( 1, 3) 1000.000 0.000000C( 1, 4) 42.00000 0.000000C( 1, 5) 37.00000 0.000000C( 2, 1) 1000.000 0.000000C( 2, 2) 38.00000 0.000000C( 2, 3) 1000.000 0.000000C( 2, 4) 20.00000 0.000000C( 2, 5) 33.00000 0.000000C( 3, 1) 34.00000 0.000000C( 3, 2) 27.00000 0.000000C( 3, 3) 28.00000 0.000000C( 3, 4) 40.00000 0.000000C( 3, 5) 1000.000 0.000000C( 4, 1) 1000.000 0.000000C( 4, 2) 42.00000 0.000000C( 4, 3) 36.00000 0.000000C( 4, 4) 23.00000 0.000000C( 4, 5) 45.00000 0.000000C( 5, 1) 34.00000 0.000000C( 5, 2) 27.00000 0.000000C( 5, 3) 28.00000 0.000000C( 5, 4) 23.00000 0.000000C( 5, 5) 45.00000 0.000000X( 1, 1) 1.000000 0.000000X( 1, 2) 0.000000 11.00000X( 1, 3) 0.000000 981.0000X( 1, 4) 0.000000 28.00000X( 1, 5) 0.000000 10.00000X( 2, 1) 0.000000 969.0000X( 2, 2) 0.000000 14.00000X( 2, 3) 0.000000 975.0000X( 2, 4) 0.000000 0.000000X( 2, 5) 1.000000 0.000000X( 3, 1) 0.000000 0.000000X( 3, 2) 0.000000 0.000000X( 3, 3) 1.000000 0.000000X( 3, 4) 0.000000 17.00000X( 3, 5) 0.000000 964.0000X( 4, 1) 0.000000 966.0000X( 4, 2) 0.000000 15.00000X( 4, 3) 0.000000 8.000000X( 4, 4) 1.000000 0.000000X( 4, 5) 0.000000 9.000000X( 5, 1) 0.000000 0.000000X( 5, 2) 1.000000 0.000000X( 5, 3) 0.000000 0.000000X( 5, 4) 0.000000 0.000000X( 5, 5) 0.000000 9.000000
lingo所得的方案与matlab一致。甲——B ,乙——D ,丙——E ,丁——A , 总时间为105(d).
lingo的运行结果怎么解读的问题,我已经在上一篇“非线性规划”的文章中说了,不再赘述,不懂的同学可以过去看一看,以后用lingo解决的问题还会有,不会每次都讲解怎么看运行结果哦,希望见谅,下面是“非线性规划”文章的链接。
数据建模-用非线性规划解决问题
整数规划问题是线性规划问题的一种特殊情况,本例题为典型的非标准形式的指派问题,根据题目的不同要求,相应地添加虚拟人或任务以及修改效率矩阵。另外,在转换成程序语言时,引进的M可以任意取定一个较大的数,方便计算的进行。