✅作者简介:热爱科研的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径向基神经网络时序、回归预测和分类