💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
⛳️赠与读者
👨💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能解答你胸中升起的一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。
或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎
💥1 概述
班组(Crew)以j作为其序号,每个班组具有特定的任务能力(如能做某类任务,不能做某类任务);针对其能力所及的任务﹐班组因其人员组成的能力或配置的设备能力不同,具有不同的作业效率(效率采用完成该任务的小时数来表示)。对班组根据其任务能力和作业效率进行班组类别(Crew_Type)划分,即相同类别的班组完成同一任务的作业效率相等。
对于企业管理者来说,如何合理的分配员工去完成任务,是降低企业运行费用,提升企业产品开发的重要手段。现代化企业需要制定一套科学的方法对员工进行任务分配,以达到最大的效益。一般来说,该类问题可以归结到指派问题上。但是,随着社会发展,人员类型变得越来越复杂。不同的任务之间往往存在先后顺序以及优先级关系。
传统的方法通常首先对该问题进行数学建模。在这个过程中,需要考虑问题的相关特性,并用数学语言进行表述。然后可以通过线性规划等方法对问题进行优化,最后得到排班结果。然而,由于现实世界并非总是线性的,因此问题的数学模型将包含非线性部分。一般来说,可以通过一些方法,比如引入辅助决策变量,将模型的非线性部分转化为线性部分,从而达到使用传统方法求解的效果。该类方法在不破坏数学模型的前提下具有较好的效果,因此被广泛研究和应用。但是该方法也会导致数学模型与真实世界存在差别。
另一方面,随着考虑问题维度的增加,员工调度问题往往是一个多目标优化问题。在对问题进行优化时,需要考虑完成时间、员工工资等目标函数。不是一般性,我们定义多目标优化问题如下:
传统的线性规划方法在处理多目标优化问题时,通常通过事先给定的一组权重向量把多目标优化问题转化成单目标优化问题,例如线性加权方法。该方法形式简单、实现容易,因此一直是处理多目标优化问题的一个考虑方向。但是,线性加权方法具有许多弊端,具体表现在:1、权重向量难以确定。多个目标函数之间必然存在矛盾,如果使用简单的线性加权的话,只能通过调节权值大小来获得多组不同的解。但是这样权值的确定其实是很难的,往往需要通过多次实验来确定。二、各个目标之间量纲的不统一,可能会造成单目标优化问题鲁棒性差。对于现实世界中的工程问题,各个目标之间量纲往往不统一,比如买车价格为10万至100万,而舒适度为0到1。为了平衡各个目标之间的量纲,往往需要设置较大的权值。而如果小量纲的目标函数包含noise的话,很大的权值就会对整个目标函数产生巨大的影响,从而导致问题的鲁棒性较差。三、单目标加权求和只能逼近凸的帕累托面。加权求和的方式只能逼近帕累托前沿面为凸集的情况,如果多目标优化问题的帕累托面为非凸,则加权求和的方式就不能和原多目标优化问题等价,此时只有直接处理原多目标优化问题才能解决。四、多目标优化问题的帕累托解集包含更多有效信息。多目标优化问题的求解是会得到一个帕累托解集的,这个解集里边包含着很多的信息,例如可以分析目标之间的关系,便于决策者更好地了解模型。
一、引言
-
员工排班在企业管理中的重要性
-
在现代企业中,合理的员工排班对于企业的高效运作至关重要。有效的排班能够确保各项任务得到妥善安排,降低企业运行成本并提升生产效率等众多好处。这与文献[1]中提到的企业管理者需要合理分配员工完成任务以降低运行费用、提升产品开发等观点相符。
-
-
多目标遗传算法在员工排班中的应用潜力
-
多目标遗传算法作为一种优化算法,能够处理复杂的多目标问题。在员工排班调度中,由于需要同时考虑多个目标(如完成时间、员工工资等),多目标遗传算法具有很大的应用潜力。
-
二、传统员工排班方法及其局限性
-
传统排班方法的常见类型
-
传统的员工排班方法通常先对问题进行数学建模,然后采用线性规划等方法进行优化。例如,对于一些简单的任务分配问题,可以归结为指派问题,通过构建线性模型求解[1]。
-
-
局限性
-
数学模型与现实世界的差异
-
现实世界中问题往往包含非线性部分,而传统方法为了使用线性规划求解,可能会通过引入辅助决策变量将非线性部分转化为线性部分,这会导致数学模型与真实世界存在差别[1]。
-
-
多目标处理的难题
-
在多目标优化方面,传统方法存在诸多弊端。例如线性加权方法权重向量难以确定,因为多个目标函数之间存在矛盾,权值的确定往往需要多次实验[1]。
-
各目标之间量纲不统一,可能会造成单目标优化问题鲁棒性差。若要平衡量纲,设置较大权值时,小量纲目标函数包含noise会对整个目标函数产生巨大影响[1]。
-
单目标加权求和只能逼近凸的帕累托面,对于帕累托面为非凸的多目标优化问题无法等价处理,并且多目标优化问题的帕累托解集包含更多有效信息,传统单目标加权求和方式无法充分利用这些信息[1]。
-
-
三、多目标遗传算法(MOGA)概述
-
算法原理
-
多目标遗传算法受自然界生物进化适应环境的启发,通过模拟进化过程搜索问题的最优解。它能够处理非线性问题,并且在目标个数较低(如2或3目标优化问题)时,能够给出令决策者满意的帕累托最优解集,因此被广泛应用于工程问题,包括员工排班调度[1]。
-
-
算法流程
-
编码与解码
-
在多技能员工排班调度中,首先需要对员工的技能、可工作时间等信息进行编码,形成染色体。在解码过程中,按照任务顺序分配任务等操作,如文献[1]中提到的根据任务完成时间、开始时间等变量进行任务分配。
-
-
选择操作
-
可以采用不同的选择策略,如轮盘赌选择、锦标赛选择等,从种群中选择优良个体进入下一代种群。
-
-
交叉操作
-
设计合适的交叉算子,使两个父代染色体交换部分基因,产生新的子代染色体,增加种群的多样性。
-
-
变异操作
-
以一定的概率对染色体的某些基因进行变异,避免算法过早收敛。
-
-
四、基于多目标遗传算法的多技能员工排班调度模型构建
-
目标函数
-
以完成任务时间最短和员工工资成本最低为例
-
完成任务时间:通过对每个任务的开始时间、工期等因素的计算,构建一个表示总完成任务时间的函数。
-
员工工资成本:考虑不同技能员工的工资水平以及工作时长等因素,建立员工工资成本的函数。
-
-
-
约束条件
-
员工技能约束
-
确保分配的任务与员工所具备的技能相匹配,避免员工执行其不具备技能的任务。
-
-
工作时间约束
-
每个员工在排班周期内的工作时间不能超过法定工作时间上限,同时也要满足员工的休息时间要求。
-
-
任务顺序约束
-
对于有先后顺序要求的任务,要保证在前序任务完成后才能开始后续任务。
-
-
五、模型求解与结果分析
-
求解过程
-
初始化种群
-
根据员工和任务的相关信息,随机生成初始种群。
-
-
迭代优化
-
通过多目标遗传算法的选择、交叉、变异等操作,不断迭代优化种群,直至满足停止条件(如达到最大迭代次数或种群收敛)。
-
-
-
结果分析
-
帕累托最优解集分析
-
得到的帕累托最优解集包含了多个非劣解,每个解在不同目标上有不同的权衡。分析这些解可以帮助决策者了解不同排班方案在完成时间和工资成本之间的权衡关系。
-
-
与传统方法对比
-
将基于多目标遗传算法的排班结果与传统排班方法得到的结果进行对比,展示多目标遗传算法在处理多技能员工排班调度问题上的优势。
-
-
六、结论与展望
-
研究结论
-
总结基于多目标遗传算法的多技能员工排班调度研究的主要成果,包括算法在解决多目标排班问题上的有效性等。
-
-
研究展望
-
提出研究的不足之处,如算法在处理大规模问题时的效率问题等,以及未来可能的改进方向,如进一步优化算法的操作算子,或者结合其他优化算法进行混合优化等。
-
📚2 运行结果
部分代码:
%% 解码
global m Rjd salary Tjd_min
% 按照任务顺序分配任务,直到完成
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); %辅助变量
a=-log(0.91)/log(2);
b=-log(1-0.04)/log(2);
%基本想法,每次分配完任务,更新Tijd表。
index = 1;
e_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); %工期是最大的工人工作时间
%分配完一个任务之后,更新Eij
for j=1:1:numel(skill)
%找到相关人员
worker = x(e_index);
Eij(worker,skill(j)) = Eij(worker,skill(j)) * (needtime(j)^a) * (Td(i)-needtime(j))^b;
%更新T表
Tijd(worker,skill(j),i) = Tjd_min(skill(j),i)/Eij(worker,skill(j));
e_index = e_index+1;
end
FTd(i) = STd(i) + Td(i);
end
final_date = max(FTd);
z=[final_date;total_salary];
figure
color=['r','g','y','c','m','b','k','r','g','c',];
for i=1:m
rec(1) = STd(i);%矩形的横坐标
rec(2) = i-0.5; %矩形的纵坐标
rec(3) = FTd(i)-STd(i); %矩形的x轴方向的长度
rec(4) = 1;
rectangle('Position',rec,'LineWidth',0.5,'LineStyle','-','FaceColor',color(i));%draw every rectangle
end
🎉3 参考文献
文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。(文章内容仅供参考,具体效果以运行结果为准)
[1]章坚民,吴鑫淼,陈耀军,肖丰,王剑辉,章法源.供电公司移动作业排班调度优化模型及算法[J].电力系统自动化,2013,37(14):81-88
[2]杨英俊,王轶萍,赵祥模,等.基于遗传算法的城市客运出租汽车调度中心人员排班研究[J].公路交通科技, 2010, 27(7):142-146.
[3]王梦真,陈欢良.基于改进遗传算法解决多目标智能排班问题研究[J].电脑知识与技术, 2022(002):018.
🌈4 Matlab代码实现
资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取