(matlab代码分享,可运行) 多技能员工排班调度多目标优化(技能熟练度包含学习型、遗忘型)(Part 1)

一、技能值不变的多技能员工调度优化模型

1、问题描述

对于企业管理者来说,如何合理的分配员工去完成任务,是降低企业运行费用,提升企业产品开发的重要手段。现代化企业需要制定一套科学的方法对员工进行任务分配,以达到最大的效益。一般来说,该类问题可以归结到指派问题上。但是,随着社会发展,人员类型变得越来越复杂。不同的任务之间往往存在先后顺序以及优先级关系。
传统的方法通常首先对该问题进行数学建模。在这个过程中,需要考虑问题的相关特性,并用数学语言进行表述。然后可以通过线性规划等方法对问题进行优化,最后得到排班结果。然而,由于现实世界并非总是线性的,因此问题的数学模型将包含非线性部分。一般来说,可以通过一些方法,比如引入辅助决策变量,将模型的非线性部分转化为线性部分,从而达到使用传统方法求解的效果。该类方法在不破坏数学模型的前提下具有较好的效果,因此被广泛研究和应用。但是该方法也会导致数学模型与真实世界存在差别。
另一方面,随着考虑问题维度的增加,员工调度问题往往是一个多目标优化问题。在对问题进行优化时,需要考虑完成时间、员工工资等目标函数。不是一般性,我们定义多目标优化问题如下:
传统的线性规划方法在处理多目标优化问题时,通常通过事先给定的一组权重向量把多目标优化问题转化成单目标优化问题,例如线性加权方法。该方法形式简单、实现容易,因此一直是处理多目标优化问题的一个考虑方向。但是,线性加权方法具有许多弊端,具体表现在:1、权重向量难以确定。多个目标函数之间必然存在矛盾,如果使用简单的线性加权的话,只能通过调节权值大小来获得多组不同的解。但是这样权值的确定其实是很难的,往往需要通过多次实验来确定。二、各个目标之间量纲的不统一,可能会造成单目标优化问题鲁棒性差。对于现实世界中的工程问题,各个目标之间量纲往往不统一,比如买车价格为10万至100万,而舒适度为0到1。为了平衡各个目标之间的量纲,往往需要设置较大的权值。而如果小量纲的目标函数包含noise的话,很大的权值就会对整个目标函数产生巨大的影响,从而导致问题的鲁棒性较差。三、单目标加权求和只能逼近凸的帕累托面。加权求和的方式只能逼近帕累托前沿面为凸集的情况,如果多目标优化问题的帕累托面为非凸,则加权求和的方式就不能和原多目标优化问题等价,此时只有直接处理原多目标优化问题才能解决。四、多目标优化问题的帕累托解集包含更多有效信息。多目标优化问题的求解是会得到一个帕累托解集的,这个解集里边包含着很多的信息,例如可以分析目标之间的关系,便于决策者更好地了解模型。

针对上述提到的问题,进化多目标优化(Evolutionary multiobjective
optimization,EMO)算法越来越得到学界的广泛关注。EMO算法受自然界生物进化适应环境的启发,通过模拟进化的过程去搜索问题的最优解。由于EMO算法不受模型的约束,能够处理非线性问题,并且在目标个数较低时,如2或3目标优化问题,能够给出令决策者满意的帕累托最优解集,因此被应用在许多的工程问题上。

一个软件项目P,共分为m个任务。每一个任务需要多种技能,项目P总共需要的技能总数为s种。项目组合中共有n个可供调用的多技能研发人员。i,j,d分别表示员工、技能和任务(1⩽i⩽n,
,1⩽j⩽s,1⩽d⩽m)。每一个任务需要多种技能,每一种技能由多个员工掌握,每一个员工具有多种效率异质的技能。假设人员的数量以及人员所掌握的技能水平不随时间变化而变化。模型中不考虑时滞及任务抢占的情况,确定人员安排方案使软件项目的研发周期和研发成本实现最优化。模型假设如下:

1)不考虑员工离职的情况,也就是保证在整个项目周期内人员的数量保持不变。

2)研发成本为参加所有项目员工的工资。

3)在工期的计算中,不考虑任务抢占,不考虑时滞。假设一个工序紧前工序的完成时间即为该工序的开始时间,之间没有时间间隔,不考虑工作转换时间和准备时间。

4)每个任务中途不能中断,即分配给一个任务的员工只能等该任务结束才能被分配到下一个任务。

2、问题建模:

以软件项目研发周期和研发成本为目标建立多目标优化调度模型。相关符号如下所示:

符号 意义
Tijd 表示员工i使用技能j参加任务d的时间;
T j d m i n T_{jd}^{min} Tjdmin 表示任务d所需技能j的最短完工时间,代表企业中技能j的最高水平,表示任务d由企业中水平最高的员工去做所需要的时间,1⩽i⩽n,1⩽d⩽m;
Eij 表示员工具备的技能j的水平高低,1⩽i⩽n,1⩽j<⩽s,Eij∈[0,1],Eij=1表示员工i具备的技能j的水平为企业最高水平;Eij=0,表示员工i不具备技能j;
FTd 表示任务的完工时间;
STd 表示任务的开始时间;
FTPd 表示前序工作的完成时间;
Td 表示任务d的工期;
Pd 表示任务d的紧前任务的集合;
Jd 表示任务d所需技能总数的集合;
R d j R_d^j Rdj 表示任务d是否需要技能j,若需要则=1,否则=0,1⩽j<⩽s,1⩽d⩽m;
Ci 表示在一定时间内(比如月、周、日)员工i的薪酬,1⩽i⩽n;
xijd 为0-1决策变量,1⩽i⩽n,1⩽j<⩽s,1⩽d⩽m。若xijd=1,表示员工i使用技能j参加任务d,否则为零。
yijdt 为0-1辅助变量,1⩽i⩽n,1⩽j<⩽s,1⩽d⩽m。若yijdt=1,表示员工i在时段t使用技能j参加任务d,否则为零。

目标函数

(matlab代码分享,可运行) 多技能员工排班调度多目标优化(技能熟练度包含学习型、遗忘型)(Part 1)_第1张图片

约束条件:

(matlab代码分享,可运行) 多技能员工排班调度多目标优化(技能熟练度包含学习型、遗忘型)(Part 1)_第2张图片
(matlab代码分享,可运行) 多技能员工排班调度多目标优化(技能熟练度包含学习型、遗忘型)(Part 1)_第3张图片

(1)表示软件项目工期最短化目标,最迟完成任务的时间为项目的最终工期;

(2)表示软件项目成本最小化目标,总的成本为参与任务的员工工资的总和;

(3)表示员工i使用技能j参与软件项目的P时间;

(4)表示每一个任务的工期,为任务中所有技能花费时间的最大值;

(5)任务d的完成时间为任务d的开始时间和任务的工期只和;

(6)任务d的开始时间为其前序任务的完成时间;

(7)前序任务的完成时间为前序任务中花费时间最大者;

(8)若一个任务没有前序任务,则该前序任务的完成时间为空;

(9)表示每项任务的每一个技能要求有且只有一个人完成;

(10)表示每一个员工只能使用一种技能参加同一个任务;

(11)表示在同一时刻一个员工只能参加同一个任务;

(12)表示变量xijd与变量yijdt之间的关系;

(13)-(14)为变量范围的界定。

算法设计:

1、包括针对本需求算法是如何实现

2、伪代码

算例分析1

一个软件项目总共可以分为10个任务,分别为D1、D2…D10,总共需要8种开发技能分别为S1、S2…S8,每一个任务需要其中的多种技能,每个技能是并行进行的,员工的技能由项目经理、研发主管和技术负责人等组成的专家小组评价给出的。可以参加该项目的员工为40名。任务之间的先后关系如表一,每个任务所需要的技能及最短开发时间见表二,员工的工资见表三,每位员工掌握的技能及技能水平见表四。

表一 任务先后关系约束

任务名称 紧前任务 所需技能
D1 —— S1,S2,S3,S5,S7
D2 —— S1,S2,S3,S5,S7
D3 D2 S2,S5,S6,S7
D4 —— S1,S2,S3,S5,S7
D5 D1,D2 S2,S4,S6,S8
D6 D1,D4 S3,S5,S7,S8
D7 D3,D5 S3,S5,S7,S8
D8 D3 S3,S5,S7,S8
D9 D6,D7,D8 S3,S5,S7,S8
D10 D9 S3,S5,S7,S8

表二 任务中各技能的最短时间需求(单位:月)

任务 S1 S2 S3 S4 S5 S6 S7 S8
D1 1 2 4 ---- 11 ---- 2 -----
D2 1 2 2 ----- 5 ----- 1 ----
D3 ----- 2 ----- ----- 8 1 2 -----
D4 2 4 2 ----- 3 ---- 6 ----
D5 ----- 4 ----- 6 ----- 2 ----- 1
D6 ----- ----- 2 ----- 2 ----- 2 4
D7 ----- ----- 1 ----- 1 ----- 5 1
D8 ----- ----- 4 ----- 4 ----- 1 1
D9 ----- ----- 5 ----- 2 ----- 1 1
D10 ----- ----- 3 ----- 4 ----- 3 1

表三 员工工资(元/月)

员工序号 员工工资
1~10 8000 6000 10000 12000 7000 15000 10000 7000 9000 8000
11~20 7000 8000 11000 12000 7000 10000 13000 9000 10000 9000
21~30 10000 7000 9000 9000 8000 15000 12000 12000 9000 8000
31~40 9000 10000 12000 10000 8000 8000 10000 13000 9000 10000

表四 掌握各技能的员工及技能值

技能 员工序号 员工技能初始值
S1 (1,3,5,6,8,9,10,16,18,21,37) (0.8,1.0,0.6,0.8,0.7,0.5,0.7,0.8,0.9,0.7,0.8)
S2 (1,2,4,5,6,7,8,9,11,13,16,20,21,25,27,28,29,30,31) (0.6,0.7,0.8,0.8,0.8,1.0,0.9,0.8,0.6,0.7,0.8,0.5,0.7,0.6,0.7,0.8,0.5,0.6,0.8)
S3 (3,6,25,26,28,32,34,36,39) (0.8,0.7,0.8,1.0,0.7,0.6,0.5,0.8,0.9)
S4 (14,15,16,17,18,19,20,23,24,25,40) (0.5,0.7,0.6,0.9,0.8,1.0,0.8,0.8,0.8,0.6,0.8)
S5 (14,15,16,32,40) (1.0,0.8,0.7,0.6,0.6,0.9)
S6 (13,15,16,17,19,25,26,33,40) (0.6,0.5,0.8,0.8,0.6,0.9,0.6,1.0,0.7)
S7 (6,7,8,9,10,12,22,27,33) (0.8,0.8,0.7,0.9,1.0,0.5,0.6,0.5,0.8)
S8 (4,29,30,31,33,35,36,38,39) (0.5,0.5,0.6,1.0,0.7,0.8,0.7,0.6,0.6)

算法求解后的结果为:

1)给出算法运行后的截图,并给出分析。

2)给出10个接近最优的调度方案,其中包括最优的方案;(表格列出来)

3)给出2)中10个方案的目标函数的值:成本和工期的值;(表格列出来)

最后,博主专注于论文的复现工作,有兴趣的同学可以私信共同探讨。相关代码已经上传到资源共享,点击我的空间查看分享代码。

你可能感兴趣的:(matlab,开发语言,算法)