【优化调度】基于NSGAII实现软件项目研发周期和研发成本多目标技能员工调度优化模型求解附matlab代码

 ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab完整代码及仿真定制内容点击👇

智能优化算法       神经网络预测       雷达通信       无线传感器        电力系统

信号处理              图像处理               路径规划       元胞自动机        无人机

物理应用             机器学习

🔥 内容介绍

问题描述:

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

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

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

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

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

问题建模:

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

Tijd表示员工i使用技能j参加任务d的时间;

表示任务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所需技能总数的集合;

表示任务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)为变量范围的界定。

📣 部分代码

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

⛳️ 运行结果

🔗 参考文献

🎈 部分理论引用网络文献,若有侵权联系博主删除
🎁  关注我领取海量matlab电子书和数学建模资料

👇  私信完整代码和数据获取及论文数模仿真定制

1 各类智能优化算法改进及应用
生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化、背包问题、 风电场布局、时隙分配优化、 最佳分布式发电单元分配、多阶段管道维修、 工厂-中心-需求点三级选址问题、 应急生活物质配送中心选址、 基站选址、 道路灯柱布置、 枢纽节点部署、 输电线路台风监测装置、 集装箱船配载优化、 机组优化、 投资优化组合、云服务器组合优化、 天线线性阵列分布优化
2 机器学习和深度学习方面

2.1 bp时序、回归预测和分类

2.2 ENS声神经网络时序、回归预测和分类

2.3 SVM/CNN-SVM/LSSVM/RVM支持向量机系列时序、回归预测和分类

2.4 CNN/TCN卷积神经网络系列时序、回归预测和分类

2.5 ELM/KELM/RELM/DELM极限学习机系列时序、回归预测和分类
2.6 GRU/Bi-GRU/CNN-GRU/CNN-BiGRU门控神经网络时序、回归预测和分类

2.7 ELMAN递归神经网络时序、回归\预测和分类

2.8 LSTM/BiLSTM/CNN-LSTM/CNN-BiLSTM/长短记忆神经网络系列时序、回归预测和分类

2.9 RBF径向基神经网络时序、回归预测和分类

2.10 DBN深度置信网络时序、回归预测和分类
2.11 FNN模糊神经网络时序、回归预测
2.12 RF随机森林时序、回归预测和分类
2.13 BLS宽度学习时序、回归预测和分类
2.14 PNN脉冲神经网络分类
2.15 模糊小波神经网络预测和分类
2.16 时序、回归预测和分类
2.17 时序、回归预测预测和分类
2.18 XGBOOST集成学习时序、回归预测预测和分类
方向涵盖风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、用电量预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断
2.图像处理方面
图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知
3 路径规划方面
旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、 充电车辆路径规划(EVRP)、 双层车辆路径规划(2E-VRP)、 油电混合车辆路径规划、 船舶航迹规划、 全路径规划规划、 仓储巡逻
4 无人机应用方面
无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配、无人机安全通信轨迹在线优化、车辆协同无人机路径规划
5 无线传感器定位及布局方面
传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化
6 信号处理方面
信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化
7 电力系统方面
微电网优化、无功优化、配电网重构、储能配置、有序充电
8 元胞自动机方面
交通流 人群疏散 病毒扩散 晶体生长 金属腐蚀
9 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值