当前位置 : 主页 > 编程语言 > python >

【优化调度】基于NSGA2算法多技能员工调度优化模型含Matlab源码

来源:互联网 收集:自由互联 发布时间:2022-06-18
1 简介 问题描述: 一个软件项目P,共分为m个任务。每一个任务需要多种技能,项目P总共需要的技能总数为s种。项目组合中共有n个可供调用的多技能研发人员。i,j,d分别表示员工、技

1 简介

问题描述:

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

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

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

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

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

【优化调度】基于NSGA2算法多技能员工调度优化模型含Matlab源码_前序

【优化调度】基于NSGA2算法多技能员工调度优化模型含Matlab源码_参考文献_02

【优化调度】基于NSGA2算法多技能员工调度优化模型含Matlab源码_无人机_03

2 部分代码

%% 解码
global m Rjd salary Tjd_min
%从文件读取数据
[a,b,c]=xlsread('data.xlsx');
Eij=zeros(40,8);
for i=1:1:8
str1=b{i,1};str2=b{i,2};
tmp1=regexp(str1, ',', 'split');
tmp2=regexp(str2, ',', 'split');
for j=1:1:size(tmp1,2)
x=str2num(tmp1{j});
y=str2num(tmp2{j});
Eij(x,i) = y;
end
end
%计算Tijd
Tijd = zeros(40,s,m);
for i=1:1:40
for j=1:1:s
for d=1:1:m
Tijd(i,j,d) = Tjd_min(j,d)/Eij(i,j);
end
end
end
x = [F1.Position];
x=x(1:43);
% 按照任务顺序分配任务,直到完成
FTd = zeros(1,m); %任务完成时间
STd = zeros(1,m); %任务的开始时间
FTpd = zeros(1,m); %前序工作的完成时间
Td = zeros(1,m); %任务d的工期
total_salary = 0;
next_time_work = zeros(1,40); %辅助变量
%基本想法,每次分配完任务,更新Tijd表。
index = 1;
record = [];
for i=1:1:m
%看一下前序工作的完成时间
if i==3
STd(i) = FTd(2);
end
if i==5
STd(i) = max(FTd(1),FTd(2));
end
if i==6
STd(i) = max(FTd(1),FTd(4));
end
if i==7
STd(i) = max(FTd(3),FTd(5));
end
if i==8
STd(i) = FTd(3);
end
if i==9
STd(i) = max(FTd(6),max(FTd(7),FTd(8)));
end
if i==10
STd(i) = FTd(9);
end
%找到需要的技能
skill = find(Rjd(:,i)==1);
needtime = zeros(1,numel(skill));
for j=1:1:numel(skill)
%找到相关人员
worker = x(index);
total_salary = total_salary + salary(worker);
needtime(j) = Tijd(worker,skill(j),i);
%检查工人什么时候可以开工
if STd(i) > next_time_work(worker) %任务开始时,工人处于空闲
%buganshenme
else %任务开始时,工人处于忙碌状态
needtime(j) = needtime(j) + next_time_work(worker) - STd(i);
end
next_time_work(worker) = STd(i) + needtime(j);
record(index,:) = [worker i skill(j) STd(i) next_time_work(worker)];
index = index+1;
end
Td(i) = max(needtime); %工期是最大的工人工作时间
FTd(i) = STd(i) + Td(i);
end
final_date = max(FTd);
z=[final_date;total_salary];

3 仿真结果

【优化调度】基于NSGA2算法多技能员工调度优化模型含Matlab源码_无人机_04

4 参考文献

[1]张欢欢, 李继庚, 洪蒙纳,等. 基于NSGA-Ⅱ算法的柔性流水车间优化调度模型的构建与应用[J]. 中国造纸学报, 2020, 35(4):6.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。

【优化调度】基于NSGA2算法多技能员工调度优化模型含Matlab源码_前序_05




网友评论