!设各时段开始上班人数x1~x6;
x6+x1>=60;!第一时段所需的护士由第6时段和第1时段组成,以下依次推;
x1+x2>=70;
x2+x3>=60;
x3+x4>=50;
x4+x5>=20;
x5+x6>=30;
min=x1+x2+x3+x4+x5+x6;!总人数最小;
结果:150.0000
X6 30.00000 X1 40.00000 X2 30.00000 X3 30.00000 X4 20.00000 X5
0.000000
(二)用0-1整数,x12=1表示第一个人到岗位二
sets:
a/1..16/:;
b/1..4/:limit;
link(a,b):x,mark;!x为变量是一个16乘4的矩阵;
!(后面有限制其为0-1变量,0为不选,1为选中,如当x12=1时为第一个人到岗位二);
endsets
data:
mark=0.9064 0.929 0.8474 0.8677!评分矩阵;
0.778 0.8783 0.816 0.7793
0.7675 0.748 0.6668 0.7103
0.7468 0.7945 0.7338 0.7332
0.7004 0.7039 0.6515 0.6662
0.627 0.6751 0.725 0.6751
0.6449 0.6779 0.5986 0.6166
0.6697 0.6972 0.6749 0.6595
0.6423 0.6664 0.6964 0.6664
0.5616 0.5687 0.6251 0.5895
0.5755 0.4989 0.6211 0.6188
0.6634 0.6498 0.6219 0.6498
0.5381 0.4842 0.5196 0.5455
0.5173 0.4957 0.5839 0.5543
0.539 0.572 0.4927 0.5107
0.524 0.5275 0.475 0.4897;
limit=1 2 2 2;!各岗位人数限制;
enddata
@for(link: @bin(x));!令x为0-1变量;
@for(b(j): @sum(a(i): x(i,j))>=limit);!各岗位人数约束;
@for(a(i): @sum(b(j): x(i,j))<=1);!一个人一个岗位约束;
@sum(link: x)=8;!总人数为8人;
max=@sum(link: x*mark);!目标函数,入选的人在各个岗位的评价之和最大;
结果:
X( 1, 2)
X( 2, 2)
X( 3, 1)
X( 4, 2)
X( 5, 4)
X( 6, 3)
X( 8, 4)
X( 9, 3)
第一个数为人的编号,第二个数为入选的岗位。
zi