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

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的时间;
TjdminT_{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所需技能总数的集合;
RdjR_d^jRdj​ 表示任务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,否则为零。

目标函数

约束条件:


(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代码分享,可运行) 多技能员工排班调度多目标优化(技能熟练度包含学习型、遗忘型)(Part 1)相关推荐

  1. arima模型matlab代码_PSTR面板平滑转换模型简介(附Matlab代码分享)

    写论文的时候用到的~相关的资料太少了,做一些简单内容和资料的分享.(PSTR模型的Matlab代码分享在最后)本文主要为简单理论和粗暴实操~ 有用的话可以点个赞哟(知乎小白卑微求赞) 嘻嘻下面进入正题 ...

  2. 使用.Net Core与Google Optimization Tools实现员工排班计划Scheduling

    上一篇说完<Google Optimization Tools介绍>,让大家初步了解了Google Optimization Tools是一款约束求解(CP)的高效套件.那么我们用.Net ...

  3. 餐厅员工排班软件市场现状研究分析报告-

    辰宇信息咨询市场调研公司最近发布-<2022-2028中国餐厅员工排班软件市场现状研究分析与发展前景预测报告> 内容摘要 本文研究中国市场餐厅员工排班软件现状及未来发展趋势,侧重分析在中国 ...

  4. 2022-2028全球与中国餐厅员工排班软件市场现状及未来发展趋势

    辰宇信息咨询市场调研公司最近发布-<2022-2028全球与中国餐厅员工排班软件市场调研报告> 内容摘要 本文重点分析在全球及中国有重要角色的企业,分析这些企业餐厅员工排班软件产品的市场规 ...

  5. 员工排班优化 员工排班 java 排班

    最近在做员工排班那块,要求要有多人多日期排班,于是做成如下效果: 左边是要排班的人员列表,右边是选中人员列表 以及  开始日期    结束日期 班制等信息. 实现方法是当点击提交的时候先遍历人员列表, ...

  6. (MATLAB代码分享,可运行)基于改进遗传算法的柔性作业车间调度优化研究

    问题描述 柔性加工车间,一个工件的单个工序的加工机床可以由多台机床完成,一个机床可以加工多种工件. 多目标优化的时候,加权系数暂定a=1,b=1; a+b=1,a=0.6或0.7或,0.8 单目标的时 ...

  7. 热动力数据MATLAB代码分享

    DSC 数据拟合和转化率计算 本文介绍 补充说明 热动力学介绍 拟合采用kissinger方程 拟合过程代码 拟合结果展示 通过计算,输出反应结果和拟合的r^2大小 反应转率介绍 反应产物转化计算程序 ...

  8. 【MATLAB代码完整可运行】多目标微电网规划设计、混合可再生能源系统、HRES、Hybrid Renewable Energy System、多目标优化

    目录 一.问题描述 二.问题建模 1.光伏建模 2.风机建模 3.储能系统部分 4.柴油发电机部分 5.HRES的目标函数和仿真过程 三.优化算法的选择 1.数据结构设计和封装 2.目标函数的计算 四 ...

  9. 经验分享 | SEN+Mk趋势分析(matlab代码分享)

    代码分享 方法介绍:Sen 斜率估计用于计算趋势值,通常与MK非参数检验结合使用.即首先计算Sen趋势值,然后使用MK方法判断趋势显著性 示例:1984-2018NDVI年最大值趋势分析 注意:在对N ...

最新文章

  1. 网页挂马防护市场探索
  2. asp之GetArray提取链接地址,以$Array$分隔的代码
  3. android记录登录状态
  4. Windows 7 提示AtBroke.exe初始化失败
  5. 八十七、探究最短路问题:Dijkstra算法
  6. $ is not defined 如何解决
  7. count(1)、count(*) 与 count(列名) 的执行区别
  8. 微信小程序api封装方案
  9. 控制器设计:MIPS单周期CPU
  10. 6.11 如何在Excel自选图形中显示公式的数值 [原创Excel教程]
  11. python学习资源分享(编程基础_数据分析_机器学习模型_行业资讯)
  12. 吴伯凡-认知方法论-真真切切的感觉
  13. git commit --amend撤销方法
  14. 1000句最常用英语口语 (四)
  15. C#中datagridview实现单元格输入框加按键,下拉框功能
  16. 【CSS】css 给盒子添加四周阴影
  17. Rosalind第五题:计算GC内容
  18. 灰度共生矩阵原理+Matlab中实现
  19. 每日一句--必应英语
  20. 网闸——(好)物理隔离网闸——入门篇

热门文章

  1. linux终端打英文间隔太大,解决vs code 内置终端,字体间隔过大问题。(linux centos7成功)...
  2. Xamarin.Forms学习之路——黑猫时钟App
  3. Opencv 笔记8 霍夫变换
  4. C# 判断本机是否安装Excel及多版本安装?获取Excel进程信息和打开Excel应用软件
  5. SpringBoot如何整合BBoss Elasticsearch呢
  6. 工作日常记录:整数有符号数除以无符号数的那些事
  7. 水瓶座的女人,生活中不只需要代码(转帖)
  8. C# 计算指定年月的当月工作日方法
  9. 阿里图标字体库的动态使用Android
  10. 阿里内部使用的12 款开发工具,很多人可能都没听过