目录

前言

一、排班问题

二、遗传算法

1.背景介绍

2.编码

总结


前言

对于遗传算法的学习,相信很多和我一样的初学者都是从最简单的二元函数求极值开始的。一步步的理解去理解种群数量、基因长度、迭代次数、交叉变异概率、初始种群的生成以及二进制编码转换为十进制编码。针对上述二元函数求极值问题经过自己的学习调试之后,本人针对护理人员排班问题进行了算法设计。

护士排班问题是能够影响一个科室能否满足运转需求以及需要保证24小时有人工作情况下护士的休息以及工作效率,一个良好的排班必须要兼顾岗位需求以及满足人员需求。本文采用遗传算法建立护士排班表,并将实际的约束条件进行输入,能够提供满足需求的排班表。


一、排班问题

在护理人员排班中,最为理想的方案是对于所有的约束条件,每天的在岗人员以及每个护理人员一周的工作时间都满足要求,因此排班方案的依据要看约束条件的满足情况。护理人员排班中的约束条件可以分为两大类:一类是硬约束,如果不满足条件,则为无效的排班表,如一个上完夜班的护理人员第二天必须休息,否则将过度劳累;另一类则为软约束,这类约束条件尽量满足即可,例如一次16小时的夜班后保证至少休息一天的前提下尽量休息两天。在考虑排班的约束条件时,还要尽量兼顾到每个护士的满意度,如一周40小时的工时,尽量少调休,保证每周的休息均衡。

虽然理想方案是满足所有的硬约束与软约束,但是在实际的约束条件适应值函数设置中,可能由于本人才疏学浅,函数设计的不恰当,导致无法达到理想值,只能追求尽量的优化。实际排班过程中,本方案设置了两个约束条件的适应值函数y1、y2。

二、遗传算法

1.背景介绍

某医院的急诊科有16名护理人员,前12名为老员工,后4名为新员工,每天有六种班型:早班(8:00 - 16:30)4种:A1(导诊台)、A2(抢救室)、A3(留观室)、A4(外围);晚班(16:30 - 24:00)1种:P帮;夜班(16:30 - 8:00)1种:P+N。

早班A1-A4需要至少4名护理人员工作,其中A2与A4最好有两名护理人员在岗,晚班护理人员只是帮助夜班人员做辅助工作,夜班需要两名护理人员。确定约束条件如下:①某天一名护理人员上完夜班后,第二天一定要休息;②每天的晚班仅由一名新人来上,慢慢熟悉夜班内容;③每天仅需两名老员工上夜班;④A1-A4均至少一人在岗,其中A2和A4是较为重要的岗位最好有两名员工在岗;⑤夜班后至少休息一天,最好休息两天;⑥尽量少调休,标准班为每人每周上5次班,一个夜班算2次班

2.编码

在采用遗传算法时,先确定染色体的编码,这里一个染色体代表一个排班表,染色体中每三位二进制编码代表一个班型:000与111表示休息日,001、010、011、100分别表示A1-A4,101代表晚班,110代表夜班。(此处休息日用两个基因表现是为了尽量满足双休)

因此,对于一周7天,每天16名护理人员,一个染色体由7*16 = 112个护理人员基因组成,每一个基因均采用复合基因,再由3位的班期基因组成。因此,一个排班表中周一的基因构成如图1所示,由16*3=48位二进制编码组成。以此类推,一周的排班表由一个7*16*3 = 336位编码的染色的组成。

废话少说,直接上代码:

clear all
close allpop = 50; %初始种群数量
length = 336; %种群基因编码长度,一周七天,每天16个排班人员,总共7种班型(用3位二进制编码表示)
gen = 1000; %迭代次数
crossover_probablity = 0.9; %交叉概率
variation_probablity = 0.8; %变异概率
initial_pop = round(rand(pop,length)); %生成初始种群%算法迭代m次
for m=1:gen%将每一代 染色体长度为336位的二进制种群 转化为16*7的矩阵(16个护理人员,一周7天)x = zeros(16,7,pop)for i = 1:size(initial_pop,1) %分别遍历50个排班表for j = 1:7  %遍历一周七天for k = 1:16 %遍历16个排班人员for l = 1:3 %二进制班型转换为十进制x(k,j,i) = initial_pop ( i,48*(j-1)+3*(k-1)+l ) * 2^(3-l) + x(k,j,i);endend      % 基因111与000的表现型均为0 (增加休息的概率)x(x==7) = 0;end%加入夜班后休息约束for j = 1:6  %遍历一周七天for k = 1:16 %遍历16个排班人员if x(k,j,i)==6x(k,j+1,i)=0;endendendend%每日排班需求,适应值y1_day计算:%硬约束y11:仅新人里面1个5、仅老人里面2个6%软约束y12:1、2、3、4均至少一个,2,4最佳情况为2个y1_day = zeros(pop,7);%每天的适应值y11_day = zeros(pop,7);y12_day = zeros(pop,7);for i=1:size(initial_pop,1)for j=1:7%硬约束y11,设置较高权重y11_day(i,j) = 1/( (sum(x(13:16,j,i)==5) - 1)^2 + ( sum(x(1:12,j,i)==6) - 2 )^2 + ( sum(x(13:16,j,i)==6) )^2 + ( sum(x(1:12,j,i)==5) )^2 + 1);  %软约束12,设置较低的权重y12_day(i,j) = 1/( ( sum(x(:,j,i)==1) - 1 )^2 + ( sum (x(:,j,i)==2) - 2 )^2 + ( sum (x(:,j,i)==3) -1 )^2 + ( sum (x(:,j,i)==4) - 2 )^2 + 1 );y1_day(i,j) = y11_day(i,j)*0.8 + y12_day(i,j)*0.2;endend%y1_day为每天的适应值(最大值为1),y1为每周的适应值(理论最大值为7)for i=1:size(initial_pop,1)y1(i,1) = sum(y1_day(i,:));end% 夜班后休息一天,适应值y2计算:% 软约束:夜班后至少休息一天,最佳休息两天y2_person = ones(pop,k);for i = 1:size(initial_pop,1) for k = 1:16for j = 1:5  %遍历周一至周五的夜班if x(k,j,i) == 6 % 若夜班为周一至周五后继续工作的惩罚函数y2_person(i,k) = y2_person(i,k) - 1/5 *( x(k,j+2,i)~=0 );endendendend%y2_person为每人的适应值(最大值为1),y2为整个排班表的适应值(理论最大值为16)for i=1:size(initial_pop,1)y2(i,1) = sum( y2_person(pop,:) );end% y1很容易达到最大值,y2比较难,故给予较大权重y = 0.1*y1 + 0.9*y2;%找到种群中的最优基因[a,b] = max(y);fit1=y/sum(y); %?计算每个种群的适应度在总适应度里所占的比例fit2=cumsum(fit1); %?每个位置都是都是之前所有位置占比的累加(可以理解为在总长度为1的线段里面每个种群都占据了一段位置,适应度大的种群占据的位置长)%基因选择choose=sort(rand(pop,1)); %有序随机数序列k=1;i=1;while k<=popif choose(k)<fit2(i) %随机数小于种群choosen_population(k,:)=initial_pop(i,:);k=k+1;elsei=i+1;endend%基因交叉for i=1:2:pop-1if rand<crossover_probablity% 选择基因交叉长度crossover_length=round(rand*(length-1))+1;% 例:随机生成length长度为19,即第一行前19个与第二行后一个交叉生成新的子代,结果放在第一行crossover_population(i,:)=[choosen_population(i,1:crossover_length),choosen_population(i+1,crossover_length+1:end)];% 第二行前19个与第一行后一个交叉生成新的子代,结果放在第二行crossover_population(i+1,:)=[choosen_population(i+1,1:crossover_length),choosen_population(i,crossover_length+1:end)];endend%基因变异variation_population=crossover_population; for i=1:popif rand<variation_probablityvariation_location=round(rand*(length-1))+1;variation_population(i,variation_location)=1-variation_population(i,variation_location);endendvariation_population(end,:)=initial_pop(b,:); %?保留该次迭代中的最优种群initial_pop=variation_population; %经选择、交叉、变异后的种群作为下一代的初始种群,从而完成迭代best(m,1)=y(b); % 记录下第m代的最优函数值best(m,2) = y1(b);best(m,3) = y2(b);endplot(1:size(best,1),best(:,1)) 

总结

代码注释很详细了,算法运行结果呈现大部分约束条件达到理想值,部分约束条件可能由于适应值函数设置的不恰当或者与其他约束条件有冲突导致无法达到最优,只能取一个尽量大的结果

基于遗传算法的护士排班问题(含Matlab源码)相关推荐

  1. 【生产优化】基于matlab遗传算法求解帐篷工序问题【含Matlab源码 2145期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源: [生产优化]基于matlab遗传算法求解帐篷工序问题[含Matlab源码 2145期] 点击上面蓝色字体,直接付费下载,即可. 获取代码 ...

  2. 【ELM分类】基于matlab遗传算法优化ELM神经网络数据分类【含Matlab源码 2138期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[ELM分类]基于matlab遗传算法优化ELM神经网络数据分类[含Matlab源码 2138期] 点击上面蓝色字体,直接付费下载,即可. ...

  3. 【LSSVM分类】基于matlab遗传算法优化LSSVM烟叶识别【含Matlab源码 1944期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[ELM分类]基于matlab鲸鱼算法优化核极限学习机数据分类[含Matlab源码 2012期] 获取代码方式2: 付费专栏Matlab智 ...

  4. 【多式联运】基于matlab粒子群结合遗传算法求解陆海空多式联运问题【含Matlab源码 1963期】

    一.联运运输简介 1 引言 随着全球经济一体化进程的加快, 产业供应链变得越来越复杂, 运输网络变得越来越广泛, 货物运输需求也发生了变化---以顾客需求为中心的方便.快捷.高效.低价的货物运输已成为 ...

  5. 【GA三维路径规划】基于matlab遗传算法无人机三维路径规划【含Matlab源码 1526期】

    一.无人机简介 0 引言 随着现代技术的发展,飞行器种类不断变多,应用也日趋专一化.完善化,如专门用作植保的大疆PS-X625无人机,用作街景拍摄与监控巡察的宝鸡行翼航空科技的X8无人机,以及用作水下 ...

  6. 【优化分配】基于遗传算法求解医疗资源分配优化问题附Matlab源码

    1 简介 本文以医疗人员的合理配置为切入点,在抗震救灾.战场救护等特殊任务背景下,基于遗传算法,研究有限的医疗人员面对多批次伤者时如何进行合理人员配置,才能够得到最大化的治疗效益,并针对解算结果进一步 ...

  7. 【优化调度】基于遗传算法实现车辆发车间隔优化问题matlab源码

    1 简介 根据公交调度优化问题的特点,考虑车辆满载率及最大,最小发车间隔的约束,以企业收益和乘客利益最大为目标建立的公交发车间隔模型,采用遗传算法进行求解.实际应用表明,利用该模型及其算法能够快速得到 ...

  8. 【滤波器】基于低通滤波实现肌电信号处理含Matlab源码

    1 简介 FIR数字滤波器是数字滤波器系统中常见的滤波器,本文提出FIR数字滤波器的设计方案,并基于Ma tlab实现滤波仿真.通过使用Matlab信号处理工具箱提供的函数,选择适当的窗函数编写程序, ...

  9. 【多式联运】基于matlab粒子群结合遗传算法求解陆海空多式联运问题【含Matlab源码 2061期】

    一.联运运输简介 1 引言 运输问题(Transportation Problem)是一类特殊的线性规划问题,最早是由Hichcock于1941年提出的,由于它不仅能解决物资的合理调运和车辆的合理调度 ...

最新文章

  1. vector邻接表建图+dijkstra模板
  2. log4j按天生成且有按照文件大小分割_论文阅读TGM:轨迹生成
  3. LeetCode 7 整数反转
  4. JQuery发起ajax请求,并在页面动态的添加元素
  5. 一个maven错误:org/apache/maven/shared/filtering/MavenFilteringException
  6. pytorch GPU加速运算
  7. ip访问次数统计 nginx_nginx访问量统计
  8. json在线解析工具
  9. SPSS——描述性统计分析——探索性分析
  10. 计算机wps文字背景怎么设置,如何在wps文本中添加背景以及如何将图片设置为页面背景...
  11. Python GUI学习感想
  12. 优化vue打包chunk-vendors.js 过大
  13. Excel单元格首位数字为“0”不显示的问题
  14. Dem与遥感影像制作三维效果简单教程
  15. WPS自定义样式功能太弱了
  16. 安卓Android游戏类ASO优化策略,android的aso优化
  17. 重启计算机连线的标志是,win10右下角总出现一个小地球图标怎么办_win10电脑网络连接图标变成地球如何解决...
  18. Javascript 控制文本框的输入法切换
  19. 聊聊在Vue项目中使用Decorator装饰器
  20. java找出和最接近指定值_如何找到数组元素与特定值最接近的和?

热门文章

  1. 北京python r语言培训
  2. LBM学习记录1 Introduction
  3. Windows系统下的包管理器chocolatey
  4. Css简单动画实现蔡徐坤跳舞
  5. Torrent Freak 点评十大 Torrent 站点 BTbt 站点
  6. 安居客住房系统-基于Python-Django前后端分离开发(四)——户型、用户数据接口处理及其筛选
  7. 总结一波 Redis 面试题,收藏起来。
  8. ​数据分析项目-宝洁销售额预测分析
  9. 人工智能在制造业的工程化应用实践----工业软件讲坛第九次讲座
  10. 6款漂亮HTML CSS样式用户留言表单