1、2015 高教社杯全国大学生数学建模竞赛承 诺 书我们仔细阅读了全国大学生数学建模竞赛章程和全国大学生数学建模竞赛参赛规则 (以下简称为“竞赛章程和参赛规则” ,可从全国大学生数学建模竞赛网站下载) 。我们完全明白,在竞赛开始后参赛队员不能以任何方式(包括电话、电子邮件、网上咨询等)与队外的任何人(包括指导教师)研究、讨论与赛题有关的问题。我们知道,抄袭别人的成果是违反竞赛章程和参赛规则的,如果引用别人的成果或其他公开的资料(包括网上查到的资料) ,必须按照规定的参考文献的表述方式在正文引用处和参考文献中明确列出。我们郑重承诺,严格遵守竞赛章程和参赛规则,以保证竞赛的公正、公平性。如有违反竞赛
2、章程和参赛规则的行为,我们将受到严肃处理。我们授权全国大学生数学建模竞赛组委会,可将我们的论文以任何形式进行公开展示(包括进行网上公示,在书籍、期刊和其他媒体进行正式或非正式发表等) 。我们参赛选择的题号是(从 A/B/C/D 中选择一项填写): 我们的报名参赛队号为(12 位数字组成的编号): 所属学校(请填写完整的全名): 参赛队员 (打印并签名) :1. 2. 3. 指导教师或指导教师组负责人 (打印并签名) : (论文纸质版与电子版中的以上信息必须一致,只是电子版中无需签名。以上内容请仔细核对,提交后将不再允许做任何修改。如填写错误,论文可能被取消评奖资格。)日期: 年 月 日赛区评阅
3、编号(由赛区组委会评阅前进行编号):2015 高教社杯全国大学生数学建模竞赛编 号 专 用 页赛区评阅编号(由赛区组委会评阅前进行编号):赛区评阅记录(可供赛区评阅时使用):评阅人评分备注全国统一编号(由赛区组委会送交全国前编号):全国评阅编号(由全国组委会评阅前进行编号):1护士工作时间的安排摘要当前社会“看病难”成了大中城市的一块难以根治的顽疾。在城市的医院里常常出现患者爆满、医护人员人手不足的状况,现有的排班管理办法难以适应当前医院需求。在这种情况下医护人员工作效率较低,导致医院人力资源的浪费。为了缓解这一状况,本文以某医院的心脑血管科护士的工作时间安排表制定为例,在保证各时段护士人员需
4、求下,分成求解最优安排方式的两类问题,即不考虑加班情况下人员规模最小和人员规模固定情况下加班人数最少。针对问题一,为达到既满足工作需要又要尽可能少的人员编制,本文采取 0-1 整数规划,将护士 1 天的 8 小时工作分成 5 个模式。通过 LINGO 软件对 5 个模式进行组合分析得到最小人员需求为 87 人,并将每时段安排人数做成 EXCEL 表格。考虑到工作时长(工作时段+休息时段)给护士生活带来的影响,删减掉工作时长最长的模式。随后对保留的四种模式进行随机组合,在所有组合中挑选出所有人数最少的模式,然后进行比较分析,综合考虑夜班人数等因素,遴选出最优模式组合。具体模式选择及工作时间调度详
5、见模型求解及附录。针对问题二,护士人员限制为 80 人,需要部分护士加班 2 小时。本文研究的是如何使得加班护士人数最少,并给出最优工作安排方案。在问题一的基础上,增加两种加班模式,利用 LINGO 软件求解得到最少加班人数为 26 人。随后利用 EXCEL 软件进行分析,在保证加班人数最少的前提下,综合夜班人数等因素选出最优安排方式。具体模式选择及工作时间调度详见模型求解及附录。关键字:线性规划 0-1 整数规划 LINGO EXCEL 工作模式2一、问题重述某医院的心脑血管科需要制定护士的工作时间表。在心脑血管科的一个工作日分为 12 个两小时的时段,每个时段的人员要求不同。例如,在夜间只
6、要求有很少几名护士就足够了,但在早晨为了给病人提供特殊报务,需要很多护士。表 B1 列出了每个时段的人员需求量。表 B1 每个时段的人员需求问题 1: (1)为满足需求最少需要多少名护士?这里假定每位护士每天工作 8小时,且在工作 4 小时后需要休息 1 小时。 (2)如果满足需求的排班方案不止一种,请给出你认为最合理的排班方案,并说明其理由。问题 2:目前心脑血管科只有 80 名护士,如果这个数目不能满足指定的需求,只能考虑让部分护士加班。如果加班,每天加班的时间为 2 小时,且紧随在后一个 4 小时工作时段之后,中间没有休息。 (1)请给出护士工作时间安排的方案,以使需要加班的护士数目最少
7、。 (2)如果排班(包括加班)的方案不止一种,请给出你认为最合理的排班和加班方案,并说明其理由。3二、模型假设1、不考虑国家法定假期及护士年假对排班的影响2、不考虑护士因病假、事假换班带来的影响3、不考虑护士因个人问题对排班的影响4、所有给出的约束条件都真实、准确,且医院排班严格按照此执行三、符号说明1、i,j:表示第 i,j 个工作时段2、a(i):第 i 个时间段所需护士人数3、b(i):第 i 个时间段安排护士人数4、z:表示所需最少护士总数5、z : 表示所需最少加班护士总数, y:表示加班模式下,正常工作护士人数6、start1,start2startn:表示护士的 n 种工作模式6
8、、j =i+p-k*limit,取 适 当 值 k N,使 p 0,limit,表 示 为 满 足 时 段 循 环 而 定 义 的 算 法7、T:总工时(h)8、A:0-6 时段安排加班护士人数, B:6-12 时安排加班护士人数C:6-12 时段安排工作人数, D:0-6 时段安排工作人数9、权重计算总分 M注:i,j=1、2、312四、问题一的模型建立与求解4.1 问题分析此问中首要考虑的是满足工作需要条件下所需要人员数量最少,该问题是一个典型的线性规划问题。根据题目要求,护士每工作 4 小时需要休息 1 小时,由于护士是按工作时段上岗,休息完 1 小时后不能在中间时刻上岗,因此我们默认护
9、士每工作 4小时休息 2 小时。考虑到护士工作和休息是两种状态,本文采用 0-1 整数规划,用 1表示工作时段,用 0 表示休息时段,利用集循环函数建立相应模型完成求解。针对问4题需要,本文引用的集函数主要为:集操作函数 wrap(index,limit),集循环函数 for(setname:expression_list)sum(setname:expression_list)相应的等同于:start1 模式: 1,1,0,1,1 start2 模式: 1,0,1,0,1,1start3 模式:1,1,0,1,0,1start4 模式:1,0,1,1,0,1start5 模式: 1,0,1,
10、0,1,0,1本文假定每个护士选择 1 种工作方式,由 5 种模式随机组合。每时段工作的护士由前几个时段开始工作的护士和本时段新增的护士组成,因此需要解决首尾时段连续的影响,为 满 足 时 段 循 环 我们定义如下算法:j=i+p-k*limit,取 适 当 值 k N,使 p 0,limit利用 LINGO 软件进行求解得到最小人数 Z=87。考虑到实际情况下,五种值班模式排班过于繁琐,且 start5 工作时间过长,在此不作考虑。对剩下的 4 种模式随机组合进行分析,利用 LINGO 软件进行求解得到数据。再将分析结果通过 EXCEL 进行整理,从人员需求数目、夜班人数等因素进行比较排序,
11、得到最优结果。4.2 模型的求解4.2.1 所提供数据分析表 1:每个工作区间对应的时间段时段编号(i)1 2 3 4 5 6 7 8 9 10 11 12时段00-0202-0404-0606-0808-1010-1212-1414-1616-1818-2020-2222-245表 2:、各时间段需求护士人数时段编号(i)1 2 3 4 5 6 7 8 9 10 11 12a(i)15 15 15 35 40 40 40 30 31 35 30 204.2.2 编程求解LINGO(部分)求解结果如下(代码见附录):本文首先对五种模式共存的情况用 LINGO 进行求解得到最少需要人数 87 人
12、(求解代码和生成见附录),并将护士排班情况绘成 EXCEL 表格。在表格中,模式 5 持续时间过长,且工作休息间歇安排极不合理,在后面的分析中不作考虑。随后,对另 4种模式相互组合的情况分别用 LINGO 进行逐一求解,并将部分模式分析的程序代码呈现(见附录)。求解完数据后,通过 EXCEL 软件对所有数据按所需最少人数、0-6时段开始上班人数、6-12 时段开始上班人数进行排序分析,并用不同的颜色填充符合要求的解。(最优的前 30%)具体权衡条件如下:1、以所需人数最少为优先考虑条件2、考虑 0-6 时开始上班人数尽可能少3、要保证护士人员在 6-12 时上班的人数尽可能多结论:在每个护士每
13、天工作 8 小时,且在连续工作 4 小时后至少需休息 1 小时的条件下,该医院为满足工作需求至少需要 87 名护士,为减少 0-6 时段开始上班人数,将上班时间集中在 6-12 时段,通过对照分析,模式 3(101101 )和模式 4(110101)的组合为最优选择。对应调度安排见表 3:护士值班安排表-34(问题一)6表 4:护士值班安排表 1(问题一)注:1.模式组合中的数字代表不同模式,多个数字代表多种模式组合,例如:“123”代表模式 1、模式 2、模式 3 的组合2.0-6 人数,6-12 人数分别代表从 0:00 到 6:00 以及从 6:00 到 12:00 开始上班的人数五、问
14、题二的模型建立与求解5.1 问题的分析此问题整体解题思路与问题一相似,在护士人员只有 80 人的前提下要保证工作的完成,且尽可能少的安排加班人数,这也是一个典型的 0-1 整数规划问题。此处新增加约束条件:护士总人数限定位 80 人,加班人数最少,加班时间为 2 小时,加班时段紧随在正常工作时长结束后,不休息。在此继续采用保留的 4 种正常工作模式,编号同上。因为条件的限制,且必须满足护士工作 4 小时后需要休息 2 小时,所以只有两种加班模式符合,用 start6 和7start7 表示:start6:1,0,1,1,0,1,1start7:1,1,0,1,0,1,1在用 LINGO 软件分
15、析求解之前,先进行简单数据分析。将总工时与护士人数列二元一次方程组,设需要加班护士人数为 z,正常工作护士人数为 y。801692zy解得 z=26y =54由此可见加班人数最少为 26 人,在后面的 LINGO 求解过程中可以此为参考。5.2 模型求解LINGO(部分)求解结果如下(代码见附录):本问首先对 4 种正常工作模式与 2 种加班模式用 LINGO 程序进行求解,得到最少加班人数为 26 人,并将护士排班情况绘成 EXCEL 表格。(求解代码和生成见附录)。在 EXCEL 表格中对所有数据按所需加班人数、 0-6 时段安排加班人数(A)、6-12 时段安排加班人数(B),0-6 时
16、段安排开始上班人数( C)、6-12 时段安排开始上班人数(D )进行排,并用不同的颜色填充单元格以示区分(最优 30%)。具体数据及分析结果见表 5。具体权衡条件如下:1、以加班所需人数最少为优先考虑条件,在人数相同时再考虑下述条件2、对 A、B 、C 、D 人数通过加权综合分析,具体权重计算如下:A 0,9 B 0,25 C6,27 D34,52(1)由表格数据可知 A 区间长度为 9,B 区间长度为 25,C 区间长度为 21,D 区间长度为 18(2)0-6 时段,人数越少越好,系数取负;6-12 时段,人数越多越好,系数取正;ABCD 区间长度不同,做系数调整,*9=*25=*21=
17、*18(3)对 ABCD 不同因素,我们做如下权重分配:8A 占 36%,B 占 24%,C 占 24%,D 占 16%。加权值 M=0.36*A+0.24*B+0.24*C+0.16 *D3.通过分数计算结果得到最优答案,得分最高的即为最优解结论:在护士总数为 80 人前提下,考虑到护士每天加班的时间为 2 小时,且紧随在后一个 4 小时工作时段之后,中间没有休息,为保证完成工作需要至少有 26 名护士加班。考虑到加班人员工作时间较长,尽可能集中安排在上午(6-12)开始上班;尽量减少加班护士在凌晨(0-6)上班的情况,同时也兼顾正常上班护士的需求,综合考量,模式 1、模式 2、模式 3、模
18、式 6 和模式 7 的组合为最优选择,即正常工作模式:11011、101011、101101,加班工作模式:1101011 、 1011011 组合。对应调度安排见表 5:护士值班安排表-12367(问题二)。9表 6:护士值班安排表 2(问题二)六、模型的评价与改进6.1 模型优点文中采用 EXCEL 表格处理数据,使得工作安排醒目、分析逻辑清楚;在解决两个问题的时候,均采用了基于工作模式的 0-1 整数规划方式,使得问题分析更简单;在权衡模式选择的时候,文中对各种因素进行加权划分,结果更科学化、人性化。6.2 模型缺点由于该模型完全假设在护士保证全勤工作能力相同的理想条件下,一些客观因素考
19、虑不周;在假设工作模式的时候,文中假设每个护士只有一种工作模式这在事实很难做到,而且在这种情况下可能不是最优答案。10在加权过程中,所用的加权方式有一定局限性,对客观因素菇凉不到位6.3 模型改进(1)在模型建立过程中,为将多目标规划转化为 0-1 整数规划,在工作模式的选取存在偶然性。现实中,考虑到医院自己、护士本身受其他因素的影响,我们应该尽可能结合多种情况建立更多模型求解。(2)在求解完护士工作的规划后,应该设计一个影响护士自身出勤的因数、以及不同护士工作能力差别的因数,并在加权计算中体现【参考文献】1 姜启源、谢金星、叶俊./ 数学模型(第四版) . 北京: 高等教育出版社,2011.
20、1;2 卓金武、李必文、魏永生./MATLAB 在数学建模中的应用(第 2 版).北京:北京航空航天大学出版社3 三峡大学 2009 年三峡大学数学建模热身赛 .网络11附录模型一:1、五种模式组合分析Lingo 程序代码如下:model:! start1 11011;! start2 101011;! start3 101101;! start4 110101;! start5 1010101;sets:times/112/: start1,start2,start3,start4,start5,required;endsetsdata:!每时段所需的最少护士数;required = 15
21、15 15 35 40 40 40 30 31 35 30 20; ole(G:/值班.xls)=start1;ole(G:/值班.xls)=start2;ole(G:/值班.xls)=start3;ole(G:/值班.xls)=start4;ole(G:/值班.xls)=start5;enddata!最小化所需安排护士数;min=sum(times: start1+start2+start3+start4+start5);!人数取整;for(times:gin(start1);for(times:gin(start2);for(times:gin(start3);for(times:gin(
22、start4);for(times:gin(start5);for(times(J):start1(wrap(J+8,12)+start1(wrap(J+9,12)+start1(wrap(J+11,12)+start1(wrap(J,12)+start2(wrap(J+7,12)+start2(wrap(J+9,12)+12start2(wrap(J+11,12)+start2(wrap(J,12)+start3(wrap(J+7,12)+start3(wrap(J+9,12)+start3(wrap(J+10,12)+start3(wrap(J,12)+start4(wrap(J+7,12
23、)+start4(wrap(J+8,12)+start4(wrap(J+10,12)+start4(wrap(J,12)+start5(wrap(J+6,12)+start5(wrap(J+8,12)+start5(wrap(J+10,12)+start5(wrap(J,12)= required(J);End13运行结果:142、四种模式下的随机组合例:模式 3、4 组合Lingo 程序代码如下:model:! start3 101101;! start4 110101;sets:times/112/: start3,start4,required;endsetsdata:!每时段所需的最少
24、护士数;required = 15 15 15 35 40 40 40 30 31 35 30 20; ole(G:/值班.xls)=start3;ole(G:/值班.xls)=start4;enddata!最小化所需安排护士数;min=sum(times: start3+start4);!人数取整;for(times:gin(start3);for(times:gin(start4);for(times(J):start3(wrap(J+7,12)+start3(wrap(J+9,12)+start3(wrap(J+10,12)+start3(wrap(J,12)+start4(wrap(J
25、+7,12)+start4(wrap(J+8,12)+start4(wrap(J+10,12)+start4(wrap(J,12)= required(J);End15运行结果:16模型二:171、123467,6 种模式综合求解model:! start1 11011;! start2 101011;! start3 101101;! start4 110101;! start6 1101011;! start7 1011011;sets:times/112/: start1,start2,start3,start4,start6,start7,required;endsetsdata:!每
26、时段所需的最少护士数;required = 15 15 15 35 40 40 40 30 31 35 30 20; ole(G:/值班.xls)=start1;ole(G:/值班.xls)=start2;ole(G:/值班.xls)=start3;ole(G:/值班.xls)=start4;ole(G:/值班.xls)=start6;ole(G:/值班.xls)=start7;enddata!最小化安排加班护士数;min=sum(times: start6+start7);!人数取整;for(times:gin(start1);for(times:gin(start2);for(times:
27、gin(start3);for(times:gin(start4);for(times:gin(start6);for(times:gin(start7);!限定护士人数为80;sum(times: start1+start2+start3+start4+start6+start7)=80;for(times(J):start1(wrap(J+8,12)+start1(wrap(J+9,12)+18start1(wrap(J+11,12)+start1(wrap(J,12)+start2(wrap(J+7,12)+start2(wrap(J+9,12)+start2(wrap(J+11,12)
28、+start2(wrap(J,12)+start3(wrap(J+7,12)+start3(wrap(J+9,12)+start3(wrap(J+10,12)+start3(wrap(J,12)+start4(wrap(J+7,12)+start4(wrap(J+8,12)+start4(wrap(J+10,12)+start4(wrap(J,12)+start6(wrap(J+6,12)+start6(wrap(J+7,12)+start6(wrap(J+9,12)+start6(wrap(J+11,12)+start6(wrap(J,12)+start7(wrap(J+6,12)+star
29、t7(wrap(J+8,12)+start7(wrap(J+9,12)+start7(wrap(J+11,12)+start7(wrap(J,12)= required(J);End19运行结果:202、组合模式随机求解21例:1、2、3、6、7 模式Lingo 程序代码如下:model:! start1 11011;! start2 101011;! start3 101101;! start6 1101011;! start7 1011011;sets:times/112/: start1,start2,start3,start6,start7,required;endsetsdata:!
30、每时段所需的最少护士数;required = 15 15 15 35 40 40 40 30 31 35 30 20; ole(G:/值班.xls)=start1;ole(G:/值班.xls)=start2;ole(G:/值班.xls)=start3;ole(G:/值班.xls)=start6;ole(G:/值班.xls)=start7;enddata!最小化安排加班护士数;min=sum(times: start6+start7);!人数取整;for(times:gin(start1);for(times:gin(start2);for(times:gin(start3);for(times
31、:gin(start6);for(times:gin(start7);!限定护士人数为80;sum(times: start1+start2+start3+start6+start7)=80;for(times(J):start1(wrap(J+8,12)+start1(wrap(J+9,12)+start1(wrap(J+11,12)+start1(wrap(J,12)+start2(wrap(J+7,12)+22start2(wrap(J+9,12)+start2(wrap(J+11,12)+start2(wrap(J,12)+start3(wrap(J+7,12)+start3(wrap(J+9,12)+start3(wrap(J+10,12)+start3(wrap(J,12)+start6(wrap(J+6,12)+start6(wrap(J+7,12)+start6(wrap(J+9,12)+start6(wrap(J+11,12)+start6(wrap(J,12)+start7(wrap(J+6,12)+start7(wrap(J+8,12)+start7(wrap(J+9,12)+start7(wrap(J+11,12)+start7(wrap(J,12)= required(J);End23运行结果:24