数学建模社区-数学中国

标题: 职员排序问题 利用lingo如何解决 [打印本页]

作者: wangkai2013    时间: 2013-8-10 10:01
标题: 职员排序问题 利用lingo如何解决
例5.13 职员时序安排模型 一项工作一周7 天都需要有人(比如护士工作),每
天(周一至周日)所需的最少职员数为20、16、13、16、19、14 和12,并要求每个职
员一周连续工作5 天,试求每周所需最少职员数,并给出安排。注意这里我们考虑稳定
后的情况。
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+I-5,7))) >= required(J));
end

(@wrap(J+I-5,7) 中的 J+I-5 是怎么确定出来的,为什么还可以是J+I+2
作者: madio    时间: 2013-8-10 11:20
7天一个循环,所以+2和-5是一样的
作者: wujianjack2    时间: 2013-8-10 14:40
madio 发表于 2013-8-10 11:20
7天一个循环,所以+2和-5是一样的

感谢madio大哥的回复,我还有几个方案,再补充说明下吧!
作者: wujianjack2    时间: 2013-8-10 14:59
  楼主你好!你提的问题很好,相当经典!
  首先做个说明,对你的帖子的标题进行了修改,方便大家阅读,请理解!
  就你的问题来说,J+I-5的确定,是因为员工每周连续工作5天休息2天,当天开始上班的人数加上前4天已经上班的人数要满足每天员工需求的数量。比如:周四才开始上班的人数加上周日,周一,周二,周三开始上班的人数之和要大于等于16。至于为什么可以写成J+I+2这种形式,与@WRAP()函数工作机理有关,建议你自行学习下,印象会更深刻!madio大哥说得对,你也可以尝试J+I+9,J+I-12等这些形式,结果应不变。
  本问题的结果应为(仅列出部分重要结果):
  Global optimal solution found.
  Objective value:                              22.00000
  Infeasibilities:                                    0.000000
  Total solver iterations:                             5

   START( MON)        8.000000            0.000000
   START( TUE)         2.000000            0.000000
   START( WED)       0.000000            0.000000
   START( THU)         6.000000            0.000000
   START( FRI)          3.000000            0.000000
   START( SAT)          3.000000            0.000000
   START( SUN)         0.000000           0.3333333

关于这个问题,我还提供下另外两个不同的方案,程序代码如下:
1.引自《LINGO和Excel在数学建模中的应用》书中P36-37:
MODEL:
SETS:
DAYS/MON..SUN/:R,X;
ENDSETS
DATA:
R=20,16,13,16,19,14,12;!每天所需的最少职员数;
ENDDATA
MIN=Z;!最小化每周所需职员数;
N=@SIZE(DAYS);
Z=@SUM(DAYS:X);
@FOR(DAYS(I):Z-X(@WRAP(I+1,N))-X(@WRAP(I+2,N))>=R(I));
END

2.引自LINGO 11自带教程:
MODEL:
SETS:
  DAYS:REQUIRED,START;
ENDSETS
DATA:
  DAYS=MON TUE WED THU FRI SAT SUN;
  REQUIRED=20 16 13 16 19 14 12;
ENDDATA
MIN=@SUM(DAYS(I):START(I));
@FOR(DAYS(J):@SUM(DAYS(I)|I#LE#5:START(@WRAP(J-I+1,7)))>=REQUIRED(J));
END

上述两个程序的结果都与之前给出的相同,楼主可以试着运行一下。

以上是个人对本问题的见解,仅供参考,如有错误,请不吝指出,谢谢支持!





作者: magic2728    时间: 2013-8-10 17:08
@wrap(J+I-5,7)表示(J+I-5)-7*n,n取恰当的整数使得返回值是1~7之间的整数,这样就解决了周二以后的人工作时间跨过了一周的问题。sum表示把在当天日期还在工作的人数加和。要求是必须符合最少人数的限制,而for那层循环解决的问题是,7天都必须满足。




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5