Lingo超经典案例大全 五(每日一资料)
九、护士值班安排问题某医院,从周一到周日都要有人值班,每天至少需要的护士如表。要求每个护士每周连续上班5天,试问该医院至少需要多少护士?并给出上班安排计划。
周 1 2 3 4 5 6 7
人 20 16 13 16 19 14 12
取决策变量star(i):周i开始值班的人数;
目标函数:min sum(i=1,2,3,...,7)
约束条件:连续工作五天,周j值班的人数>=required(j)(j=1,2,3,...,7)
model:
sets:
days/mon..sun/: required,start;
endsets
data:
!每天所需的最少职员数;
required = 20 16 13 16 19 14 12;
enddata
!最小化每周所需职员数;
min=@sum(days: start);
@for(days(J):@sum(days(I) | I #le# 5:start(@wrap(J+2+I,7))) >= required(J));
end
解得: 总共需要22人,周一8人开始值班,周二2人,周三0人,周四6人,周五3人,周六3人,周日0人。
十、填数问题
分别把1,2,…,16填到图示的16个圈内,使得每个三角形上的所有圈内的数的和为81(共4个三角形)。
决策变量:e_ij=1,第i个圈填数a_j;e_ij=0,第i个圈不填数a_j。a_j=j,j=1,2,3,...,16。
模型:
model:
sets:
number/1..16/:a;
link(number,number):e;
tri1(number)/1 2 3 4 5 6 7 8 9/;
tri2(number)/1 2 3 4 16 15 12 11 10/;
tri3(number)/4 5 6 7 14 13 12 15 16/;
tri4(number)/7 8 9 1 10 11 12 13 14/;
endsets
data:
a=1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16;
enddata
max=sum(link(i,j):e(i,j)*a(j));
@for(number(i):sum(link(i,j):e(i,j))=1);
@for(number(j):sum(link(i,j):e(i,j))=1);
@for(link(i,j):@bin(e(i,j)));
@sum(number(j):sum(tri1(i):e(i,j)*a(j)))=81;
@sum(number(j):sum(tri2(i):e(i,j)*a(j)))=81;
@sum(number(j):sum(tri3(i):e(i,j)*a(j)))=81;
@sum(number(j):sum(tri4(i):e(i,j)*a(j)))=81;
@sum(link(i,j):e(i,j)*a(j))=136;
end
红色的那句程序可以去掉,也可以为:min=@sum(link(i,j):e(i,j)*a(j)),但求的结果不同,结果都符合要求。
编号1~16的圆圈的填数结果至少有3种:
(1)12 11 1 10 7 8 14 13 5 9 4 16 2 6 15 3
(2)14 3 5 15 8 7 13 4 12 6 11 10 9 2 16 1
(3)14 11 4 15 9 8 13 2 5 16 3 10 12 6 1 7
为了求得更多的解,可以约束编号1~16的圆圈的填数结果不为以上3种结果。
model:
sets:
number/1..16/:a;
link(number,number):e;
tri1(number)/1 2 3 4 5 6 7 8 9/;
tri2(number)/1 2 3 4 16 15 12 11 10/;
tri3(number)/4 5 6 7 14 13 12 15 16/;
tri4(number)/7 8 9 1 10 11 12 13 14/;
yueshu1:c1;
yueshu2:c2;
yueshu3:c3;
endsets
data:
a=1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16;
c1=12 11 1 10 7 8 14 13 5 9 4 16 2 6 15 3;
c2=14 3 5 15 8 7 13 4 12 6 11 10 9 2 16 1;
c3=14 11 4 15 9 8 13 2 5 16 3 10 12 6 1 7;
enddata
min=sum(number(i):@sum(number(j):e(i,j)*a(j)));
@for(number(i):sum(number(j):e(i,j))=1);
@for(number(j):sum(link(i,j):e(i,j))=1);
@for(link(i,j):@bin(e(i,j)));
@sum(number(j):sum(tri1(i):e(i,j)*a(j)))=81;
@sum(number(j):sum(tri2(i):e(i,j)*a(j)))=81;
@sum(number(j):sum(tri3(i):e(i,j)*a(j)))=81;
@sum(number(j):sum(tri4(i):e(i,j)*a(j)))=81;
@sum(link(i,j):e(i,j)*a(j))=136;
@sum(yueshu1(j):sum(link(i,j):e(i,j)))<16;
@sum(yueshu2(j):sum(link(i,j):e(i,j)))<16;
@sum(yueshu3(j):sum(link(i,j):e(i,j)))<16;
end
解得:(4)12 15 11 10 3 8 16 1 5 4 7 14 9 13 2 6
可以继续下去:······
页:
[1]