基于随机变邻域搜索算法的护士排班方法和装置与流程

文档序号:13137331阅读:480来源:国知局
基于随机变邻域搜索算法的护士排班方法和装置与流程

本发明涉及人员调度领域,尤其涉及一种基于随机变邻域搜索算法的护士排班方法和装置。



背景技术:

医院科室里的多约束人员排班问题一直以来都是充满挑战性的工作。建立一个护士排班表不仅要考虑科室里的工作负载,同时需要考虑护士自身的技术水平和需求等因素。如果进行人工排班则非常费时,而目前仍有许多医院的科室对护士表进行人工的排班。

利用软件进行排班表的建立是一项复杂且难解的离散优化问题。过去几十年,许多算法被研究出来。解决护士排班的算法可以分类两大类:分别是基于整数规划的确定性算法和基于启发式策略或元启发搜索框架的启发式搜索算法。前者可以找到确定的最优解但花费时间较长而后者可以较为快速的找到近似的最优解。如何在复杂的约束条件下高效的进行护士排班仍然是本领域技术人员需要解决的技术问题。



技术实现要素:

为了解决上述问题,本发明提供一种基于随机变邻域搜索算法的护士排班方法和装置,使用随机交换和移动两个算子对排班表的解进行迭代的搜索,并使用一个循环移动算子对解进行扰动使其能够跳出局部最优。本发明采用的随机变邻域搜索算法较已有的变邻域搜索算法更为简单且更为稳定,能够达到目前已有的最好算法性能。

为了实现上述目的,本发明采用如下技术方案:

一种基于随机变邻域搜索算法的护士排班方法,包括以下步骤:

步骤1:设定护士排班需满足的约束条件,建立目标函数;

步骤2:生成一个随机的初始解,并将其作为当前解和历史最优解;

步骤3:采用随机变邻域搜索算法对当前解进行迭代搜索,并设置迭代终止条件;

所述迭代过程中,使用随机选择交换或者移动操作算子对临时解,即当前解的副本执行操作;

当临时解对应的目标函数值小于等于当前解对应的目标函数值时,将该临时解作为新的当前解;反之,若迭代次数满足一定阈值,将历史最优解设为当前解并执行扰动操作算子得到新的当前解。

进一步地,所述目标函数表示为:

这里pj(ci)表示护士nj的软性约束ci的惩罚值,f(x)是整个排班表的目标函数值。

进一步地,当临时解对应的目标函数值小于当前解对应的目标函数值时,还重新计数迭代次数。

进一步地,对当前解执行扰动操作算子时,还重新计数迭代次数。

进一步地,所述随机选择交换或者移动操作算子,对临时解执行操作包括:

随机选取两个护士、一段时间长度,和[0,1]间的随机数b;若b<0.95,采用交换操作算子,若b≥0.95,采用移动操作算子。

进一步地,所述时间长度的确定方法为:首先在[1,28]之间随机选取一个数作为d1,然后在[d1,28]之间随机选取一个数作为d2,[d1,d2]即所选择的时间长度。

进一步地,所述扰动操作算子为循环移动算子,操作过程如下:随机选择一天,随机选择一段序号连续的护士,将这一部分护士的排班进行循环移动操作,移动步数为一固定值。

根据本发明的另一方面,本发明还提供了一种基于随机变邻域搜索算法的护士排班装置,包括:

目标函数建立模块,用于设定护士排班需满足的约束条件,建立目标函数;

初始解生成模块,用于生成一个随机的初始解,并将其作为当前解和历史最优解;

最优解搜索模块,用于采用随机变邻域搜索算法对当前最优解进行迭代搜索,并设置迭代终止条件;

所述迭代过程中,随机选择交换或者移动操作算子,对临时解,即当前解的副本执行操作;

当临时解对应的目标函数值小于等于当前解对应的目标函数值时,将该临时解作为新的当前解;反之,若迭代次数满足一定阈值,将历史最优解设为当前解并执行扰动操作算子得到新的当前解。

9.如权利要求1所述的一种基于随机变邻域搜索算法的护士排班装置,其特征在于,所述随机选择交换或者移动操作算子,对临时解执行操作包括:

随机选取两个护士、一段时间长度,和[0,1]间的随机数b;若b<0.95,采用交换操作算子,若b≥0.95,采用移动操作算子。

10.如权利要求5所述的一种基于随机变邻域搜索算法的护士排班装置,其特征在于,所述扰动操作算子为循环移动算子,操作过程如下:随机选择一天,随机选择一段序号连续的护士,将这一部分护士的排班进行循环移动操作,移动步数为一固定值。

本发明的有益效果:

1、本发明中采用的操作算子均发生在某天之中,两个硬性约束不会出现冲突,并且操作算子均为交换和移动,实现效率高。

2、目标函数可以看作是|d|,|c|和|n|的函数。本发明中,|d|和|c|都是固定值,因此时间复杂度可以简化为o(|n|)。而由于交换和移动算子都只是作用在两个护士之间,因此在每次迭代的时候不需要重新计算其他护士的值而只计算两个发生改变的护士的函数值即可。因此时间复杂度降为o(1),缩短的计算时间从而提高了算法的效率。

3、本发明采用随机的方式来选择交换和移动两个简单的操作算子,没有用到额外复杂的策略,简化了传统的排班算法。

附图说明

图1为本发明算法流程图;

图2为交换操作算子操作示意图,其中2(a)表示交换前的排班表,2(b)交换后的排班表;

图3为移动操作算子操作示意图,其中3(a)操作前的排班表,3(b)操作后的排班表;

图4为循环移动操作算子操作示意图;

图5搜索算子不同结合方式的算法效果对比图;

图6两种解接受机制的算法效果对比图。

具体实施方式

下面结合附图与实施例对本发明作进一步说明。

实施例1

本实施例提供了一种基于随机变邻域搜索算法的护士排班方法,如图1所示,包括以下步骤:

步骤1:设定护士排班需满足的约束条件,根据所述约束条件获取目标函数f(x);

本发明采用的是第一届国际护士排班大赛(firstinternationalnurserosteringcompetition,inrc-2010)所采用的模型和数据集,该模型基本上能够描述了真实情况中的排班情景并能够进行一定的扩展,这里简称inrc模型。一般情况下,一个护士排班表可以看做是一张二维表。表的行是不同的护士,列的不同的时间。表中的内容填写的是某个护士在某个时间的工作名称。工作名称指的是护士所上轮班的种类。在inrc模型中使用的工作名称包括:早班(e)、晚班(l)、夜班(n)、白班(d)和护士长班(hd)。而在大部分的实际排班情景中基本相同,也可以根据不同的情况替换。建立一个护士排班的基本过程就是将不同的工作名称分配给不同的护士,同时要满足不同的约束条件。

大部分的情况下,约束可以分为两种。一种是硬性约束,一种是软性约束。硬性约束保证排班能够执行,因此在排班过程中不能有任何违反硬性约束的情况出现。另一种是软性约束,一般情况软性约束无法全部满足,因此需要将对软性约束的冲突降低至最少。

下面是部分符号说明,用来更方便的说明模型:

d:连续的天的集合,也是一段时间的总称。inrc模型里d的大小是28,即28天(四周);

n:是护士集合,我们用|n|来表示护士的总人数,ni来表示第i个护士;

s:是工作名称的集合。

c:是软性约束的集合,用ci来表示第i个约束;

w:是软性约束的权重。在本研究的模型实例中,每个护士都有一个工作合同参数,用来指定每个护士的约束权重。我们用wij来表示护士nj的软性约束ci的权重值;

h:表示硬性约束的集合;

x:表示一个可行解,即一个满足所有硬性约束的排班表。

inrc模型中的约束条件具体描述如下(也可参考官方文档和其他文字里的描述)。期中c1-9设定了某个值的范围,如果排班表超出这个范围就表示冲突。c10-18主要针对希望和不希望出现的工作模式,如果出现或者不出现某个工作模式,则冲突出现。这里的工作模式指的是一段时间内的工作分配集合。

硬性约束:

h1:每天对某个护士只能分配一种工作名称;

h2:每天所有的必须的工作都要分配给护士(满足一定的工作负载)。

软性约束:

c1,c2:指定了分配给某一个护士最大和最小的工作日数;

c3,c4:指定了分配给某一个护士最大和最小的连续工作日数;

c5,c6:最大和最小的连续休息天数;

c7,c8:最大和最小的连续工作周末数(如果周末至少有一天工作,则算做为一个工作周末);

c9:最大工作周末数;

c10:完整周末约束——根据周末的定义,如果一个护士只是在周末的某一天工作而不是所有天工作,则出现冲突;

c11:相同工作周末约束——如果在周末分配给一个护士的工作名称不同,则出现冲突;

c12:夜班后两天休息——一个夜班后,如果没有两天休息时间,出现冲突;

c13:休息周末之前无夜班——如果周末是休息,则不应该在周末之前排夜班;

c14:不希望出现的工作模式——每个护士都有若干个不希望出现的工作模式,如果在排班周期内出现了该模式,则出现冲突;

c15:休息需求——每个护士在某个时间不希望上班,如果排班的话,出现冲突;

c16:技能水平约束——如果一个护士被分配到了不能胜任的工作名称,则出现冲突,比如将护士长班排给一个普通护士;

c17:特定排班需求——类似c15,每个护士在某个时间不希望排某种班,如果出现则冲突;

根据以上约束,该问题的目标函数可以表示为:

这里pj(ci)表示护士nj的软性约束ci的值惩罚值,f(x)是整个排班表的目标函数值。

步骤2:生成一个随机的初始解x,并将其作为当前最优解;

步骤3:使用随机变邻域搜索对当前最优解进行迭代搜索,所述迭代过程如下:

step1:设当前解和历史最优解为x,并设定stag_counter=0;

step2:设定迭代终止时间,判断算法是否达到时间限制,若是,算法结束,返回历史最优解;若否,执行step3;

step3:stag_counter=stag_counter+1,将x’赋值为x作为临时解(临时解可看做当前解的副本,在本算法中为一中间变量);

step4:随机选取两个护士、一段时间长度,和[0,1]间的随机数b;

step5:若b<0.95,对x’进行group_swap操作;

若b≥0.95,对x’进行group_move操作;

step6:计算f(x’);

step7:判断f(x’)与f(x)的大小关系

若f(x’)<f(x),更新历史最优解;stag_counter=0;x=x’即接收操作后的解为当前解;返回step2;

若f(x’)=f(x),x=x’即接收操作后的解为当前解;返回step2;

若f(x’)>f(x),判断stag_counter超过某个数值stag_limit,若是,stag_counter=0;x设置为历史最优解;对x进行part_cycle_shift操作;返回step2;若否,返回step2。

以下对上述迭代过程做进一步的解释说明:

(1)所述迭代过程涉及了两个操作算子group_swap和group_move。其中group_swap的操作过程是交换一段时间内两个随机选定的护士的所有工作名称。group_move的操作过程可通过举例说明:首先随机选定两名护士(n1和n2)和一段时间长度。在每一天,如果n1休息而n2上班,则把n2的工作名称分配给n1,并让n2休息。因此也可以看作是将n2的工作移动给n1。这两个操作算子的操作过程如图2和图3所示,时间长度设置为3。group_move算子还涉及移动方向问题,由于这个参数在算法中并不敏感,因此我们在实现中使用从下往上的方向。这里下表示护士序号较大的方向。

(2)本实施例中采用一种随机选取的结合方式来选择这两个操作符。

两个操作算子都需要先确定时间长度和两个要操作的护士。

时间长度的确定方法为:首先随机在[1,28]之间选取一个数作为d1,然后在[d1,28]之间选取一个数作为d2。

两个护士n1和n2的选取是直接在[1,|n|]之间随机选取两个不同数字。

group_swap或者group_move算子的选择是随机确定的,算法中通过[0,1]之间的随机数与设定值b的大小关系确定。本实施例中选取b=0.95,因而group_swap的选取概率较大。b的值是固定值,不需要针对不同的数据集来调节。

(3)一次迭代的过程中,如果目标函数值比当前解的值低或者相同,这个解会被接受为当前解。而stag_counter只有在找到比当前更好的解的时候才会重新设置为0。在此过程中历史最优解进行更新。

通常情况下,只有目标函数值比当前解的值低,即得到了更好的解时才接受,而本实施例中在每次迭代中当算法找到了一个函数值相等的解时,仍然接受该解为当前解,实验证明,本实施例的方法比只接受更好的解更为高效。

(4)我们使用stag_counter来记录扰动操作之前的迭代次数。使用stag_limit这个数值作为跳出局部最优解的容忍值。在进行了一定数量的迭代且没有任何更好或者相同的解出现,算法重新开始。而重新开始的当前解则是由历史最优解经过一个扰动操作算子part_cycle_shift操作后得到。

这个操作算子的工作过程如下:首先随机的选择一天,然后随机选择一段序号连续的护士。在这一小部分的排班中进行循环移动操作,具体如图4所示,本实施例中步数设置为1,护士数目为3。这个操作的步数在算法中我们采用一个固定值,因此不需要调节。移动方向同样不敏感,所以我们采取自下而上的方向。

实施例2

基于实施例1所述的方法,本发明还提供了一种基于随机变邻域搜索算法的护士排班装置,包括:

目标函数建立模块,用于设定护士排班需满足的约束条件,建立目标函数;

初始解生成模块,用于生成一个随机的初始解,并将其作为当前解和历史最优解;

最优解搜索模块,用于采用随机变邻域搜索算法对当前最优解进行迭代搜索,并设置迭代终止条件;

所述迭代过程中,随机选择交换或者移动操作算子,对临时解(当前解的副本)执行操作;

当临时解对应的目标函数值小于等于当前解对应的目标函数值时,将该临时解作为新的当前解;反之,若迭代次数满足一定阈值,将历史最优解设为当前解并执行扰动操作算子得到新的当前解。

所述目标函数表示为:

这里pj(ci)表示护士nj的软性约束ci的值惩罚值,f(x)是整个排班表的目标函数值。

当临时解对应的目标函数值小于当前解对应的目标函数值时,还重新计数迭代次数。

对当前解执行扰动操作算子时,还重新计数迭代次数。

所述随机选择交换或者移动操作算子,对临时解执行操作包括:随机选取两个护士、一段时间长度,和[0,1]间的随机数b;若b<0.95,采用交换操作算子,若b≥0.95,采用移动操作算子。

所述时间长度的确定方法为:首先在[1,28]之间随机选取一个数作为d1,然后在[d1,28]之间随机选取一个数作为d2,[d1,d2]即所选择的时间长度。

所述扰动操作算子为循环移动算子,操作过程如下:随机选择一天,随机选择一段序号连续的护士,将这一部分护士的排班进行循环移动操作,移动步数为一固定值。

由于上述装置是根据实施例1所述的方法得到的,具体实施细节可参见实施例1。

本发明采用护士-时间视图的表示方法,即二维表的形式。由于所有的操作算子全都是发生在某天当中,因此两个硬性约束不会出现冲突。而又由于操作算子均为交换和移动,在计算机内实现非常快,因此主要的时间花费在对目标函数的计算上。目标函数可以看作是|d|,|c|和|n|的函数。比如我们需要计算28天内每个护士的每个约束的值。因此时间复杂度可以看为o(|d||c||n|)。在我们使用的模型里,|d|和|c|都是固定值,因此时间复杂度可以简化为o(|n|)。而由于group_swap和group_move都只是发生在两个护士之间,因此在每次迭代的时候不需要重新计算其他护士的值而只计算两个发生改变的护士的函数值即可。因此时间复杂度降为o(1),缩短的计算时间从而提高了算法的效率。

实验效果

表1是算法对于55个数据实例在标准时限内的实验结果。表中的第一列是实例名称,第二列是目前已经发表的最新的每个实例的最优解。后面四列分别是本研究的算法得到的最小值(min),最大值(max),平均值(avg)和标准差(std)。其中已知的最优解用黑体标注,而已证明的理论最优解用星号标出。

表1中的数据显示对于sprinttrack,本算法可以对24/25的实例找到已知最优解。而对于唯一的sprint_late07,如果我们将时间延长至两倍的时限,算法可以找到已知最优解。对于mediumtrack,算法可以对7/15的实例搜索到已知最优解。而对于longtrack,算法可以对11/15的实例达到已知最优解。对于其他的实例,算法得到的值与最优值都很接近。如果看最大值,也就是多次搜索得到的最差解,仍然能对于21/55个实例达到已知最优解。所有实例的平均值都非常接近最优解。其中只有3个实例的标准差大于3,44个实例的标准差都小于1。从这个表可以看出,本研究的算法高效且稳定。

在表2中,我们将本研究的算法与目前国际最好的几个算法进行了对比。这些算法的结果都是已发表,且运行时间都是标准工具计算得到的相应硬件的时限,因此对比较为公平。这些算法包括:(a)本研究的算法;(b-g)目前国际针对该数据集最好的算法。有些算法对某些实例没有报告结果,因此表中有空缺。

表3已知最优解个数百分比对比

另外为了更清楚的比较,我们在表3给出了算法(a-d)能找到已知最优解的个数占总实例数的百分比。从表3可以看出,尽管本研究的算法对springtrack组的百分比稍低,但是对于medium和long组都是最高或者并列最高。所以对于所有55个实例本研究的算法仍然是最高。从表2的统计中,对于一些没有达到已知最优解的实例比如medium_late01,medium_late05和long_late03,本算法可以达到除了算法(e)之外的最好的值。另外,对于实例medium_hidden01,在标准时限内本研究的算法可以搜索到最为解决已知最优的解。而算法只对实例medium_hidden02表现的不是很好,对于余下的实例均处在平均水平。

由于算法(b)(c)和(d)在论文中提供的平均值和标准差,因此我们同样与本研究的算法进行了对比,见表4。从表4可以看出,不管是平均值还是标准差值,本算法都比其他三个算法的值要低,因此可以得到结论即本算法的表现更为稳定。

表4与其他算法的平均值和标准差对比

本发明迭代过程中各关键步骤的效果:

(1)结合方式的效果

上文提到group_swap和group_move是通过一定的概率选择其一进行搜索,我们设定的概率值为λ=0.95。我们这里保持其他实验条件不变,而使用不同的λ值进行结果对比。我们分别选取λ的值为1,0.95,0.50,0.25和0。当值为1时,只有group_swap会用到,而当值为0时,只有group_move会用到。我们使用了一个较难的实例medium_late01作为对象,其他实例的表现类似。从图5中可以看出,当λ为0时,也就是只是用group_move时,算法的性能显著下降。而其他情况,即使是λ为1,算法的效果非常相似。而我们在实际算法中之所以选定0.95是因为这个数值相对表现更好。

(2)对搜索算子针对整体时间段搜索方法

前面提高我们使用的两个的搜索算子group_swap和group_move都是针对排班表中一段时间内的所有排班进行操作。我们这里和只针对单独某一天的交换和移动的搜索算子进行对比分析。尽管在已有的研究中出现过类似的分析,但是不管是数据集还是算法框架都与这里的不同。我们与三种进行了对比,分别是(a)初始算法(b)只对某一天进行交换或移动(c)只对某一天进行交换,移动不变(d)只对某一天进行移动,交换不变。算法其他的条件保持不变,对于某天的选择我们是平均随机的选取一天进行操作。

为了更清楚的对比,我们采用了与表1相同的统计方式。因为其他实例表现相似,所以我们只对某些有代表性的实例进行了对比。结果如表5所示。从表5中可以看出,对于算法(b)和(c)的性能下降显著。而算法(d)的性能基本保持不变。一个原因是本身我们设定的group_move的选择概率就很小(0.05)。尽管如此,该算法与我们的初始算法相比还是能看出差距。比如对于一些较难的实例(sprint_late01,sprint_hidden01,和medium_hidden03)初始的算法所能达到的最优解更好。这也证实了我们使用整体时间段搜索算法的重要性。

(3)扰动算子的贡献

理论上说,任何能够对当前解产生较大变化的操作算子都可以作为扰动操作算子。我们这里主要与三种策略进行对比,分别是(a)初始算法(b)首先随机生成一个全新的初始解,然后随机选择14天并将这14天的排班表的内容拷贝到要进行扰动的当前解(c)随机生成一个全新的初始解并直接替换为当前解(d)对于当前要进行扰动的解,首先随机的选择属于[|d|,|d|/2]范围之间的一个数作为天数,然后随机的选择这个数值大小某些天。在这每一天中,再随机的选择两个护士并交换二者的工作名称。这三种策略均与迭代中的搜索操作算子不同,因此可以看作是一种补充并作为扰动操作算子。我们采取同上一节一样的方法进行对比实验,结果见表6。

从表6可以看出其他策略的标准差和最大值可以看出,算法运行的效果仍然很稳定。这个结果表明不管采取什么样的扰动策略,迭代阶段的搜索总是能够找到较好的解。从最优解和平均值来看,初始算法的策略要比其他算法的性能更为高效。因此可以得到结论即算法采用的part_cycle_shift操作算子可以帮助跳出迭代搜索算子陷入的局部最优区域从而辅助算法找到更好的解。一个可能的原因是该算子的操作方式和迭代阶段的操作方式完全不同,因此能够作为较好的补充,使算法能够达到不同的解区域。

表5不同的的搜索操作算子的对比

表6不同的扰动操作算子对比

(4)解接受机制的效果

本发明的其中一个创新点在于在每次迭代中当算法找到了一个函数值相等的解时,仍然接受该解为当前解。本发明对这种机制进行实验分析来表明该策略的重要性。我们与只接收更好的解的这种方式进行对比,采用与(1)相同的实验方式,结果如图6所示。从该图可以明显的看出初始算法的策略要比只接受更好的解更为高效。

理论上说,这种机制会导致重复搜索以前搜索过的解。比如我们曾经搜索到x,在找到更好的解之前,我们可能还会接受x作为当前解,因此会降低算法的效率。但是在实际运行过程中,这种情况几乎对算法没有影响,所以可以推断出现这种情况的概率较低。尽管该机制的理论原因并不清楚,但实验结果可以说明这种机制对于算法的确非常重要。

本领域技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算机装置来实现,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。本发明不限制于任何特定的硬件和软件的结合。

上述虽然结合附图对本发明的具体实施方式进行了描述,但并非对本发明保护范围的限制,所属领域技术人员应该明白,在本发明的技术方案的基础上,本领域技术人员不需要付出创造性劳动即可做出的各种修改或变形仍在本发明的保护范围以内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1