(MATLAB代码分享,可运行)基于改进遗传算法的柔性作业车间调度优化研究
问题描述
柔性加工车间,一个工件的单个工序的加工机床可以由多台机床完成,一个机床可以加工多种工件。
多目标优化的时候,加权系数暂定a=1,b=1;
a+b=1,a=0.6或0.7或,0.8
单目标的时候
a=0,b=1;(只考虑能耗最小,不在乎时间的长短。)
a=1,b=0; (只考虑加工时间最短,不在乎加工能耗多少)
变量定义与注解
(定值,取值范围确定的,可由案例中看到具体的,工件种类,每种工件的加工工序即加工步骤,每个工件的单个加工工序可由多台候选中的1台来完成,机床的空载与待机功率确定不变。工件的单步加工能耗,加工时间,对刀时间,空闲等待时间的不同,具体取值受限于可选用的机床不同而不同)
i,j,mi,j,mi,j,m 分别表示工件种类序号,工件工序序号,机床序号,是中间过程值。I,J,MI,J,MI,J,M表示所有的工件,工序机床的所有集合。i定值,取值范围确定,m定值,取值范围确定,j的取值范围受限于i的变化
ni{{n}_{i}}ni 表示工件iii的加工个数的序号 中间过程值,取值范围受限于Ni{{N}_{i}}Ni,
Ni{{N}_{i}}Ni 表示工件iii的加工总量,定值,取值范围受限于i的变化
nijij{{n}_{ij}}ijnijij 中间值,Nijij{{N}_{ij}}ijNijij 定值,受限于i
Nim{{N}_{im}}Nim 机床Mm{{M}_{m}}Mm上被加工的第i种工件加工总量
Oij{{O}_{ij}}Oij 工件i的工序的第j道加工工序,可由符合条件的多台机床完成。定值受限于i,j的变化。
Nm{{N}_{m}}Nm 表示机床m可执行的所有工件的所有工序总集合{Oij{{O}_{ij}}Oij} ,定值,受限于i,j,m
Mij{{M}_{ij}}Mij 工件工序oij{{o}_{ij}}oij可选的机器集合,定值,受限于i,j,
tcijm{{t}^{c}}_{ijm}tcijm 是机床m单个工序Oij{{O}_{ij}}Oij的总加工时间,定值,取值范围受限于i,j,m的个体差异,
Tcijm{{T}^{c}}_{ijm}Tcijm 工件工序oij{{o}_{ij}}oij在机床Mm{{M}_{m}}Mm上整体加工时间. 受限于tcijm{{t}^{c}}_{ijm}tcijm与数量的差异
Eijm{{E}_{ijm}}Eijm 工件工序oij{{o}_{ij}}oij在机床Mm{{M}_{m}}Mm上加工阶段能耗,定值,取值范围受限于i,j,m的差异,
Ecm{{E}^{c}}_{m}Ecm 机床Mm{{M}_{m}}Mm所有工件的阶段总能耗, 受限于Eijm{{E}_{ijm}}Eijm与数量的限制
tuijm{{t}^{u}}_{ijm}tuijm 单个工件的单个工序oij{{o}_{ij}}oij在机床Mm{{M}_{m}}Mm上加工之前需要对刀时间,定值,取值范围受限于i,j,m
Tuijm{{T}^{u}}_{ijm}Tuijm 所有工件工序oij{{o}_{ij}}oij在机床Mm{{M}_{m}}Mm上加工之前需要对刀时间,受限于tuijm{{t}^{u}}_{ijm}tuijm
与数量
PmuP_{m}^{\text{u}}Pmu机床Mm{{M}_{m}}Mm的空载功率 定值,取值范围受限于m的取值范围
Ewm{{E}^{w}}_{m}Ewm机床Mm{{M}_{m}}Mm的空载能耗 定值,取值范围受限于m的变化
PmwP_{m}^{w}Pmw机床Mm{{M}_{m}}Mm的待机功率 定值,取值范围受限于m的取值范围
Twijm{{T}^{w}}_{ijm}Twijm 单个工件单工序oij{{o}_{ij}}oij在机床Mm{{M}_{m}}Mm上的空闲待机时间,受限于开始装夹时刻,结束拆家时刻,加工时间,与对刀时间。
Ewm{{E}^{w}}_{m}Ewm机床Mm{{M}_{m}}Mm的待机能耗, 受限于待机功率与待机时间。
STmkS_{{{T}_{m}}}^{k}STmk 在机床Mm{{M}_{m}}Mm加工第k件工件的开始装夹时刻
CTmkC_{{{T}_{m}}}^{k}CTmk在机床Mm{{M}_{m}}Mm加工第k件工件的结束拆夹时刻
gmkg_{m}^{k}gmk 在机床Mm{{M}_{m}}Mm加工第k件工序之前需要对刀•
CijmkC_{ijm}^{k}Cijmk 用来判断 在机床Mm{{M}_{m}}Mm上加工的工件工序j是否是工件i的工序Oij{{O}_{ij}}Oij Mij∈{Oij}{{M}_{ij}}\in \{{{O}_{ij}}\}Mij∈{Oij}
xijm{{x}_{ijm}}xijm 用来判断 Nm{{N}_{m}}Nm表示机床m可执行的所有工件的所有工序总集合{Oij{{O}_{ij}}Oij} Oij∈Nm={Oij}{{O}_{ij}}\in {{N}_{m}}=\{{{O}_{ij}}\}Oij∈Nm={Oij}
yijmhmk∈{0,1}{{y}_{ijm}}h_{m}^{k}\in \left\{ 0,1 \right\}yijmhmk∈{0,1} 中间变量
gmkg_{m}^{k}gmk 用来判断,是否需要换刀,受限于中间变量yijmhmk{{y}_{ijm}}h_{m}^{k}yijmhmk
xijm,gmk,Gijmk∈{0,1}{{x}_{ijm}},g_{m}^{k},G_{ijm}^{k}\in \left\{ \left. 0,1 \right\} \right.xijm,gmk,Gijmk∈{0,1}
调度过程中的机床能耗由工序加工能耗 、对刀能耗 、机床空闲等待能耗三部分构成。
柔性车削加工车间分批调度总能耗 E 是车间机床消耗电能之和,计算公式如下
E=∑m=1MEm=∑m=1M(Emc+Emt+Emi)E=\sum\limits_{m=1}^{M}{{{E}_{m}}}=\sum\limits_{m=1}^{M}{(E_{m}^{c}}+E_{m}^{t}+E_{m}^{i})E=m=1∑MEm=m=1∑M(Emc+Emt+Emi) (1)
总完工时间 TC=max∀mCTmKm{{T}_{C}}=\underset{\forall m}{\mathop{\max }}\,C_{{{T}_{m}}}^{{{K}_{m}}}TC=∀mmaxCTmKm m∈[1,M]m\in [1,M]m∈[1,M] (2)
单台机床能耗与时间具体分析如下
工序加工阶段
加工能耗:在第m台机床上加工第i种工件的第j到工序。
Emc=∑i=1I∑j=1Li∑ni=1Ninij×Eijm×xijmE_{m}^{c}=\sum\limits_{i=1}^{I}{\sum\limits_{j=1}^{{{L}_{i}}}{\sum\limits_{{{n}_{i}}=1}^{{{N}_{i}}}{{{n}_{ij}}\times {{E}_{ijm}}}}}\times {{x}_{ijm}}Emc=i=1∑Ij=1∑Lini=1∑Ninij×Eijm×xijm (3)
注意: xijm=1,if,Oij∈Nm{x}_{ijm}=1 ,if , {O}_{ij} \in {N}_{m}xijm=1,if,Oij∈Nm
是给定值。Nij{{N}_{ij}}Nij为给定值
单位加工时间tcijm{{t}^{c}}_{ijm}tcijm 为给定值
总加工时间 Tijmc=∑i=1I∑j=1Li∑niNinij×tcijm×xijmT_{ijm}^{c}=\sum\limits_{i=1}^{I}{\sum\limits_{j=1}^{{{L}_{i}}}{\sum\limits_{{{n}_{i}}}^{{{N}_{i}}}{{{n}_{ij}}\times {{t}^{c}}_{ijm}}}}\times {{x}_{ijm}}Tijmc=i=1∑Ij=1∑Lini∑Ninij×tcijm×xijm (4)
对刀阶段
能耗。此此时刻机床处于空载状态,运用空载功率与空载时间。
Emu=Pmu(∑iI∑jLiGijmk×xijm×gmk×tuijm)E_{m}^{u}=P_{m}^{u}\left( \sum\limits_{i}^{I}{\sum\limits_{j}^{{{L}_{i}}}{G_{ijm}^{k}\times {{x}_{ijm}}\times }}g_{m}^{k}\times {{t}^{\text{u}}}_{ijm} \right)Emu=Pmu(i∑Ij∑LiGijmk×xijm×gmk×tuijm) (5)
注意: tijmut_{ijm}^{u}tijmu 为给定值。
当机床Mm{{M}_{m}}Mm上加工,由于同一种工件毛坯料尺寸的相似性,当工件的代加工工序属于机床m的加工序列集合即Oij∈Nm{{O}_{ij}}\in {{N}_{m}}Oij∈Nm,并且是该批工件的第1个工件即$$ni=1{{n}_{i}}=1ni=1,两个条件都满足的时候,机床才会产生对刀能耗。其余条件下,本机床不会产生这种能耗
对刀时间总时间
Tijmu=∑i=1I∑j=1Lixijm×gmk×tijmuT_{ijm}^{u}=\sum\limits_{i=1}^{I}{\sum\limits_{j=1}^{{{L}_{i}}}{{{x}_{ijm}}\times g_{m}^{k}}}\times t_{ijm}^{u}Tijmu=i=1∑Ij=1∑Lixijm×gmk×tijmu (6)
机床空闲等待阶段(此时机床属于待机状态。具体能耗值为待机功率与待机时间)
机床空闲等待时间为
Tijmw=CTmNi−STm1−Tijmc−TijmuT_{ijm}^{w}=C_{{{T}_{m}}}^{{{N}_{i}}}-S_{{{T}_{m}}}^{1}-T_{ijm}^{c}-T_{ijm}^{u}Tijmw=CTmNi−STm1−Tijmc−Tijmu (7)
因此机床空闲等待能耗的计算公式为
Emw=pmst×TijmwE_{m}^{w}=p_{m}^{st}\times T_{ijm}^{w}Emw=pmst×Tijmw (8)
约束条件
(1)机床的加工必须满足前一个工件加工完成后,下一个工件方可开始加工。
CTmni≤STmni+1C_{{{T}_{m}}}^{{{n}_{\text{i}}}\text{ }}\le S_{{{T}_{m}}}^{{{n}_{i}}+1}CTmni ≤STmni+1 ni∈[1,Ni]{{n}_{i}}\in \left[ 1,{{N}_{i}} \right]ni∈[1,Ni] m∈[1,M]m\in \left[ 1,M \right]m∈[1,M]
(2)同一个工件的加工必须满足前一道工序加工完成后,下一道才能开始加工。
∑m=1M∑i=1I∑ni=1Ni(CTmnixijm)≤∑m=1M∑i=1I∑ni=1Ni(STmnixi(j+1)m)\sum\limits_{m=1}^{M}{\sum\limits_{i=1}^{I}{\sum\limits_{{{n}_{i}}=1}^{{{N}_{i}}}{\left( C_{{{T}_{m}}}^{{{n}_{i}}}{{x}_{ijm}} \right)\le }}}\sum\limits_{m=1}^{M}{\sum\limits_{i=1}^{I}{\sum\limits_{{{n}_{i}}=1}^{{{N}_{i}}}{{}}\left( S_{{{T}_{m}}}^{{{n}_{i}}}{{x}_{i(j+1)m}} \right)}}m=1∑Mi=1∑Ini=1∑Ni(CTmnixijm)≤m=1∑Mi=1∑Ini=1∑Ni(STmnixi(j+1)m); m∈[1,M]m\in \left[ 1,M \right]m∈[1,M] i∈[1,I]i\in \left[ 1,I \right]i∈[1,I] ni∈[1,Ni]{{n}_{i}}\in \left[ 1,{{N}_{i}} \right]ni∈[1,Ni] j∈[1,Li]j\in [1,{{L}_{i}}]j∈[1,Li]
(3) 同一台机床同一时刻只能加工一种工件的一道工序。
∑i=1I∑j=1LiGijmk=1\sum\limits_{i=1}^{I}{\sum\limits_{j=1}^{{{L}_{i}}}{G_{ijm}^{k}=1}}i=1∑Ij=1∑LiGijmk=1 i∈[1,I]i\in [1,I]i∈[1,I] j∈[1,Li]j\in \left[ 1,{{L}_{i}} \right]j∈[1,Li] m∈[1,M]m\in \left[ 1,M \right]m∈[1,M] k∈[1,Nim]k\in [1,{{N}_{im}}]k∈[1,Nim]
(4)批量的工件的任意工序一旦开始加工,中途不能被打断。
∑m=1M∑ni=1NiGijmk=1\sum\limits_{m=1}^{M}{\sum\limits_{{{n}_{i}}=1}^{{{N}_{i}}}{G_{ijm}^{k}=1}}m=1∑Mni=1∑NiGijmk=1 i∈[1,I]i\in [1,I]i∈[1,I] ni∈[1,Ni]{{n}_{i}}\in \left[ 1,{{N}_{i}} \right]ni∈[1,Ni] m∈[1,M]m\in \left[ 1,M \right]m∈[1,M] k∈[1,Nim]k\in [1,{{N}_{im}}]k∈[1,Nim]
(5)同一种工件的同种加工工序的工序只能选择一台机床加工。
∑m=1Mxijm=1\sum\limits_{m=1}^{M}{{{x}_{ijm}}=1}m=1∑Mxijm=1 i∈[1,I]i\in [1,I]i∈[1,I] j∈[1,Li]j\in \left[ 1,{{L}_{i}} \right]j∈[1,Li] m∈[1,M]m\in \left[ 1,M \right]m∈[1,M]
(6)工件必须在到达之后才能开始加工。
min∀i(∑m=1M∑ni=1Ni(STmni×xijm×Gijmk))≥Ai\underset{\forall i}{\mathop{\text{min}}}\,\left( \sum\limits_{m=1}^{M}{\sum\limits_{{{n}_{i}}=1}^{{{N}_{i}}}{\left( S_{{{T}_{m}}}^{{{n}_{i}}}\times {{x}_{ijm}}\times G_{ijm}^{k} \right)}} \right)\ge {{A}_{i}}∀imin(m=1∑Mni=1∑Ni(STmni×xijm×Gijmk))≥Ai
(7)工件必须在工件交货期之前完工。
max∀i(∑m=1M∑ni=1Ni(CTmni×xijm×Gijmk))≤Bi\underset{\forall i}{\mathop{\text{max}}}\,\left( \sum\limits_{m=1}^{M}{\sum\limits_{{{n}_{i}}=1}^{{{N}_{i}}}{\left( C_{{{T}_{m}}}^{{{n}_{i}}}\times {{x}_{ijm}}\times G_{ijm}^{k} \right)}} \right)\le {{B}_{i}}∀imax(m=1∑Mni=1∑Ni(CTmni×xijm×Gijmk))≤Bi
(8)工件的单工序加工数量之和必须等于该工件的加工批量。
∑i=1I∑ni=1Ninij=∑i=1INi\sum\limits_{i=1}^{I}{\sum\limits_{{{n}_{i}}=1}^{{{N}_{i}}}{{{n}_{ij}}=\sum\limits_{i=1}^{I}{{{N}_{i}}}}}i=1∑Ini=1∑Ninij=i=1∑INi i∈[1,I]i\in [1,I]i∈[1,I] ni∈[1,Ni]{{n}_{i}}\in \left[ 1,{{N}_{i}} \right]ni∈[1,Ni]
(9)0-1 变量约束。
xijm,gmk,Gijmk∈{0,1}{{x}_{ijm}},g_{m}^{k},G_{ijm}^{k}\in \left\{ \left. 0,1 \right\} \right.xijm,gmk,Gijmk∈{0,1} 中间变量yijmhmk∈{0,1}{{y}_{ijm}}h_{m}^{k}\in \left\{ 0,1 \right\}yijmhmk∈{0,1}
编码方式与数据设置
机床序号m=[1,10]
工件种类序号i=[1,5]
i=1时候,j∈L1={1,2,3}j\in {{L}_{1}}=\{1,2,3\}j∈L1={1,2,3}
I=2 j∈L2={1,2,34}j\in {{L}_{2}}=\{1,2,34\}j∈L2={1,2,34}
i=3, j∈L3={1,2,3}j\in {{L}_{3}}=\{1,2,3\}j∈L3={1,2,3}
i=4, j∈L4={1,2,34}j\in {{L}_{4}}=\{1,2,34\}j∈L4={1,2,34}
i=5 j∈L5={1,2,34}j\in {{L}_{5}}=\{1,2,34\}j∈L5={1,2,34}
双层编码结构。基于工件加工工序编码与对应的工序分配的机床编码。
示例:染色体基因段 (工序排列基因段,选用机床排列段)
工序总集 { O11O12O13O21O22O23O24O31O32O33O41O42O43O44O51O52O53O54}\text{ }\!\!\{\!\!\text{ }{{O}_{11}}{{O}_{12}}{{O}_{13}}{{O}_{21}}{{O}_{22}}{{O}_{23}}{{O}_{24}}{{O}_{31}}{{O}_{32}}{{O}_{33}}{{O}_{41}}{{O}_{42}}{{O}_{43}}{{O}_{44}}{{O}_{51}}{{O}_{52}}{{O}_{53}}{{O}_{54}}\} { O11O12O13O21O22O23O24O31O32O33O41O42O43O44O51O52O53O54}
工序染色体基因段1 1 1 2 2 2 2 3 3 3 4 4 4 4 5 5 5 5
对应加工工序的选用机床分配染色体基因段1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 注解:每种加工工序的可选机床机床集合中的排位,比如 O21{{O}_{21}}O21可选用机床集合{M01M02M03M04{{M}_{01}}{{M}_{02}}{{M}_{03}}{{M}_{04}}M01M02M03M04}, 对应的1就是可选机床集合中的第1台即M01{{M}_{01}}M01
表2机床信息
1.车床
机床Mm{{M}_{m}}Mm | 机床类别 | 机床型号 | 待机功率/W | 空载功率/W |
---|---|---|---|---|
M01{{M}_{01}}M01 | 数控车床 | CHK560 | 1626 | 2102 |
M02{{M}_{02}}M02 | 数控车床 | CHK460 | 1072 | 1556 |
M03{{M}_{03}}M03 | 数控车床 | C2-6150K | 241 | 2836 |
M04{{M}_{04}}M04 | 数控车床 | C2-6150HK/1 | 284 | 1253 |
2.铣床
M05{{M}_{05}}M05 | 数控铣床 | XK5032 | 85 | 961 |
---|---|---|---|---|
M06{{M}_{06}}M06 | 数控铣床 | 134 | 1048 | |
M07{{M}_{07}}M07 | 数控铣床 | X5032 | 85 | 850 |
- 钻床
M08{{M}_{08}}M08 | 数控钻床 | ZXK50 | 421 | 653 |
---|---|---|---|---|
M09{{M}_{09}}M09 | 数控钻床 | ZHL765 | 574 | 826 |
4,磨床
M10{{M}_{10}}M10 | 数控磨床—内磨 | M131W | 81 | 709 |
---|---|---|---|---|
M10{{M}_{10}}M10 | 数控磨床—外磨 | M131W | 81 | 1723 |
表3工件加工信息表
工件种类iii | 加工数量Ni{{N}_{i}}Ni | 到达时间Ai{{A}_{i}}Ai/S | 交货期Di{{D}_{i}}Di/S |
---|---|---|---|
1 | 80 | 0 | 600000 |
2 | 150 | 2800 | 600000 |
3 | 100 | 1740 | 600000 |
4 | 180 | 3750 | 600000 |
5 | 300 | 860 | 600000 |
表4工件加工能耗/时间信息表
工件种类 | 工序编号 | 工序名称 | 加工机床 | 工序加工能耗 | 工序加工时间 | 对刀时间 |
---|---|---|---|---|---|---|
I1{{I}_{1}}I1 | O11{{O}_{11}}O11 | 车削 | M03{{M}_{03}}M03 | 3762132 | 589 | 68 |
M04{{M}_{04}}M04 | 3356324 | 815 | 78 | |||
O12{{O}_{12}}O12 | 铣削 | M05{{M}_{05}}M05 | 185473 | 185 | 81 | |
M06{{M}_{06}}M06 | 208950 | 171 | 77 | |||
O13{{O}_{13}}O13 | 数控钻 | M08{{M}_{08}}M08 | 489007 | 475 | 78 |
I2{{I}_{2}}I2 | O21{{O}_{21}}O21 | 车削 | M01{{M}_{01}}M01 | 4431457 | 1532 | 103 |
---|---|---|---|---|---|---|
M02{{M}_{02}}M02 | 4387694 | 1768 | 64 | |||
M03{{M}_{03}}M03 | 4922201 | 1178 | 78 | |||
M04{{M}_{04}}M04 | 4417923 | 1501 | 91 | |||
O22{{O}_{22}}O22 | 铣削 | M05{{M}_{05}}M05 | 949708 | 261 | 76 | |
M07{{M}_{07}}M07 | 985683 | 234 | 87 | |||
O23{{O}_{23}}O23 | 数控钻 | M08{{M}_{08}}M08 | 786297 | 476 | 99 | |
M09{{M}_{09}}M09 | 972452 | 413 | 114 | |||
O24{{O}_{24}}O24 | 数控磨-外磨 | M10{{M}_{10}}M10 | 326605 | 415 | 37 |
I3{{I}_{3}}I3 | O31{{O}_{31}}O31 | 车削 | M01{{M}_{01}}M01 | 2992184 | 717 | 46 |
---|---|---|---|---|---|---|
M02{{M}_{02}}M02 | 3174087 | 923 | 47 | |||
M03{{M}_{03}}M03 | 3042597 | 745 | 53 | |||
M04{{M}_{04}}M04 | 2975382 | 789 | 45 | |||
O32{{O}_{32}}O32 | 车削 | M01{{M}_{01}}M01 | 452937 | 110 | 22 | |
M02{{M}_{02}}M02 | 440618 | 146 | 17 | |||
M03{{M}_{03}}M03 | 446235 | 121 | 19 | |||
M04{{M}_{04}}M04 | 426837 | 135 | 15 | |||
O33{{O}_{33}}O33 | 铣 | M06{{M}_{06}}M06 | 73826 | 67 | 39 | |
M07{{M}_{07}}M07 | 68819 | 58 | 43 |
I4{{I}_{4}}I4 | O41{{O}_{41}}O41 | 车 | M01{{M}_{01}}M01 | 523763 | 166 | 89 |
---|---|---|---|---|---|---|
M02{{M}_{02}}M02 | 458283 | 193 | 71 | |||
M03{{M}_{03}}M03 | 500921 | 166 | 69 | |||
M04{{M}_{04}}M04 | 473815 | 169 | 63 | |||
O42{{O}_{42}}O42 | 车 | M01{{M}_{01}}M01 | 661014 | 216 | 68 | |
M02{{M}_{02}}M02 | 651601 | 287 | 47 | |||
M03{{M}_{03}}M03 | 656023 | 230 | 53 | |||
M04{{M}_{04}}M04 | 614314 | 245 | 46 | |||
O43{{O}_{43}}O43 | 外磨 | M10{{M}_{10}}M10 | 326605 | 415 | 33 | |
O44{{O}_{44}}O44 | 内磨 | M10{{M}_{10}}M10 | 401115 | 187 | 17 |
I5{{I}_{5}}I5 | O51{{O}_{51}}O51 | 车 | M01{{M}_{01}}M01 | 4431457 | 1532 | 49 |
---|---|---|---|---|---|---|
M02{{M}_{02}}M02 | 4387694 | 1768 | 56 | |||
M03{{M}_{03}}M03 | 4922201 | 1178 | 51 | |||
O52{{O}_{52}}O52 | 铣 | M05{{M}_{05}}M05 | 73826 | 43 | 43 | |
M07{{M}_{07}}M07 | 68819 | 59 | 57 | |||
O52{{O}_{52}}O52 | 钻 | M09{{M}_{09}}M09 | 786297 | 476 | 97 | |
O54{{O}_{54}}O54 | 外磨 | M10{{M}_{10}}M10 | 204288 | 168 | 46 |
改进遗传算法(代码以及参考资料可以私信评论邮箱获取)
在这个问题中涉及到的变量种类较多,较为复杂,这里介绍一种比较新颖的数据传递方式。在matlab中将所有的常量打包放进一个global变量中,在函数调用时,直接申请使用全局变量。这样可以避免函数定义写的非常长非常乱。对开发过程具有较好效果。缺点是,使用全局变量会导致速度变慢。
优化过程示意图
结果展示
// 函数的主程序入口
%% 清空环境
clc
clear
close all%% 模型参数
load data
global Global info
Global.M = 11;
Global.I = 5;
Global.m_power = M_power;% Ai=zeros(5,1);
% Ni=ones(5,1);Global.Ni = Ni;
Global.Ai = Ai;
Global.Di = Di;
% Global.fault = [4 50000]; %第一个是机器编号,第二个是故障时间Global.Ni(5)=130;
Global.xishu=[0,1];
Global.fun = @(x) fun(x);%改成fun1就是有故障的。
init_data();nVar = 0;
for i=1:Global.InVar = nVar+info(i).num_gongxu;
end%% 遗传算法参数
maxgen=300; %进化代数
sizepop=50; %种群规模
k1=7e+8; %交叉概率
k2=4e+8; %变异概率%% 个体初始化
individuals=struct('fitness',zeros(1,sizepop), 'chrom',[]); %种群结构体
avgfitness=[]; %种群平均适应度
bestfitness=[]; %种群最佳适应度
bestchrom=[]; %适应度最好染色体
% 初始化种群
for i=1:sizepopindividuals.chrom(i,:)=Code(); %随机产生个体x=individuals.chrom(i,:);individuals.fitness(i)=Global.fun(x); %个体适应度
end%找最好的染色体
[bestfitness bestindex]=min(individuals.fitness);
bestchrom=individuals.chrom(bestindex,:); %最好的染色体
avgfitness=sum(individuals.fitness)/sizepop; %染色体的平均适应度
% 记录每一代进化中最好的适应度和平均适应度
trace=[];%% 进化开始
h = waitbar(0,'正在优化中。。。');
for i=1:maxgenwaitbar(i/maxgen,h);%自适应修改交叉变异概率pcross=k1/(avgfitness-bestfitness); %交叉概率pmutation=k2/(avgfitness-bestfitness); %变异概率% 选择操作individuals=Select(individuals,sizepop);avgfitness=sum(individuals.fitness)/sizepop;% 交叉操作individuals.chrom=Cross(pcross,individuals.chrom,sizepop);% 变异操作individuals.chrom=Mutation(pmutation,individuals.chrom,sizepop);% 计算适应度for j=1:sizepopx=individuals.chrom(j,:);individuals.fitness(j)=Global.fun(x);end%找到最小和最大适应度的染色体及它们在种群中的位置[newbestfitness,newbestindex]=min(individuals.fitness);[worestfitness,worestindex]=max(individuals.fitness);% 代替上一次进化中最好的染色体if bestfitness>newbestfitnessbestfitness=newbestfitness;bestchrom=individuals.chrom(newbestindex,:);figure(1)hold offplot(1,1)drawpause(0.01)endindividuals.chrom(worestindex,:)=bestchrom;individuals.fitness(worestindex)=bestfitness;avgfitness=sum(individuals.fitness)/sizepop;trace=[trace;avgfitness bestfitness]; %记录每一代进化中最好的适应度和平均适应度
end
close(h);
%进化结束%% 结果显示
[r c]=size(trace);
figure
plot([1:r]',trace(:,2),'r-','LineWidth',2);
title(['函数值曲线 ' '终止代数=' num2str(maxgen)],'fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('函数值','fontsize',12);
legend('迭代优化曲线')
disp(['函数值:' num2str(bestfitness)]);
// 这里是计算目标函数值的程序代码
function [y,release_time,T_start,T_need,T_end,T_total,T_jiagong,T_duidao,T_kongxian,P_total,P_jiagong,P_duidao,P_kongxian] = fun(x)
nVar = numel(x);
global Global info%% 从头到尾安排工件进行加工
T_jiagong = 0;
T_duidao = 0;
T_kongxian = 0;
T_start = zeros(Global.I,4); %开工时间
T_need = zeros(Global.I,4); %加工时间
T_end = zeros(Global.I,4); %完工时间
release_time = zeros(1,Global.M); %下一次的可用时间P_jiagong = 0;
P_duidao = 0;
P_kongxian = 0;count_gongxu=ones(1,Global.I);
count_gongjian=zeros(1,Global.M); %记录机器使用次数
for i=1:nVar/2cur_gongjian = x(i);cur_gongxu = count_gongxu(cur_gongjian);count_gongxu(cur_gongjian) = count_gongxu(cur_gongjian)+1;cur_machine = x(nVar/2+i);cur_machine_code = info(cur_gongjian).gongxu(cur_gongxu).bianhao(cur_machine);count_gongjian(cur_machine_code) = count_gongjian(cur_machine_code) + 1;if cur_gongxu==1 %当前工件的首个工序if release_time(cur_machine_code)>Global.Ai(cur_gongjian) %当前几床被占用T_start(cur_gongjian,cur_gongxu) = release_time(cur_machine_code);T_need(cur_gongjian,cur_gongxu) = Global.Ni(cur_gongjian)*sum(info(cur_gongjian).gongxu(cur_gongxu).data(cur_machine,2)) ...+ info(cur_gongjian).gongxu(cur_gongxu).data(cur_machine,3);release_time(cur_machine_code) = release_time(cur_machine_code) + T_need(cur_gongjian,cur_gongxu);else %当前机床没有被占用T_start(cur_gongjian,cur_gongxu) = Global.Ai(cur_gongjian);T_need(cur_gongjian,cur_gongxu) = Global.Ni(cur_gongjian)*sum(info(cur_gongjian).gongxu(cur_gongxu).data(cur_machine,2)) ...+ info(cur_gongjian).gongxu(cur_gongxu).data(cur_machine,3);P_kongxian = P_kongxian + (T_start(cur_gongjian,cur_gongxu)-release_time(cur_machine_code))*Global.m_power(cur_machine,1);T_kongxian = T_kongxian+(T_start(cur_gongjian,cur_gongxu)-release_time(cur_machine_code));release_time(cur_machine_code) = T_start(cur_gongjian,cur_gongxu) + T_need(cur_gongjian,cur_gongxu);endT_jiagong = T_jiagong+Global.Ni(cur_gongjian)*sum(info(cur_gongjian).gongxu(cur_gongxu).data(cur_machine,2));T_duidao = T_duidao+Global.Ni(cur_gongjian)*sum(info(cur_gongjian).gongxu(cur_gongxu).data(cur_machine,3));P_jiagong = P_jiagong + info(cur_gongjian).gongxu(cur_gongxu).data(cur_machine,1)*Global.Ni(cur_gongjian);P_duidao = P_duidao + info(cur_gongjian).gongxu(cur_gongxu).data(cur_machine,3)* ...Global.m_power(cur_machine_code,2)*Global.Ni(cur_gongjian);T_end(cur_gongjian,cur_gongxu) = T_start(cur_gongjian,cur_gongxu) + T_need(cur_gongjian,cur_gongxu);else %不是首个工序if release_time(cur_machine_code)>T_end(cur_gongjian,cur_gongxu-1) %当前几床被占用T_start(cur_gongjian,cur_gongxu) = release_time(cur_machine_code);T_need(cur_gongjian,cur_gongxu) = Global.Ni(cur_gongjian)*sum(info(cur_gongjian).gongxu(cur_gongxu).data(cur_machine,2)) ...+ info(cur_gongjian).gongxu(cur_gongxu).data(cur_machine,3);release_time(cur_machine_code) = release_time(cur_machine_code) + T_need(cur_gongjian,cur_gongxu);elseT_start(cur_gongjian,cur_gongxu) = T_end(cur_gongjian,cur_gongxu-1);T_need(cur_gongjian,cur_gongxu) = Global.Ni(cur_gongjian)*sum(info(cur_gongjian).gongxu(cur_gongxu).data(cur_machine,2)) ...+ info(cur_gongjian).gongxu(cur_gongxu).data(cur_machine,3);P_kongxian = P_kongxian + (T_start(cur_gongjian,cur_gongxu)-release_time(cur_machine_code))*Global.m_power(cur_machine,1);T_kongxian = T_kongxian+(T_start(cur_gongjian,cur_gongxu)-release_time(cur_machine_code));release_time(cur_machine_code) = T_start(cur_gongjian,cur_gongxu) + T_need(cur_gongjian,cur_gongxu);endT_jiagong = T_jiagong+T_need(cur_gongjian,cur_gongxu);P_jiagong = P_jiagong + info(cur_gongjian).gongxu(cur_gongxu).data(cur_machine,1)*Global.Ni(cur_gongjian);T_end(cur_gongjian,cur_gongxu) = T_start(cur_gongjian,cur_gongxu) + T_need(cur_gongjian,cur_gongxu);end
endnon_use = Global.M-numel(find(count_gongjian)==0);T_total = max(release_time);
P_total = P_jiagong + P_duidao + P_kongxian;
xishu = Global.xishu;
y = sum([T_total P_total].*xishu) + non_use*1000000000;
最后,博主专注于论文的复现工作,有兴趣的同学可以私信共同探讨。相关代码已经上传到资源共享,点击我的空间查看分享代码。
(MATLAB代码分享,可运行)基于改进遗传算法的柔性作业车间调度优化研究相关推荐
- 【车间调度】变邻域遗传算法求解柔性作业车间调度问题
本系列为自己学习调度相关知识的记录,如有误请指出,也欢迎调度方向的小伙伴加我好友共同交流. 混合优化算法优化策略 变邻域搜索算法是一种快速和有效的求解复杂组合优化问题的局部搜索算法,通过邻域结构的系统 ...
- 基于深度强化学习的智能车间调度方法研究
摘要: 工业物联网的空前繁荣为传统的工业生产制造模式开辟了一条新的道路.智能车间调度是整个生产过程实现全面控制和柔性生产的关键技术之一,要求以最大完工时间最小化分派多道工序和多台机器的生产调度.首先, ...
- 基于候鸟优化算法(MBO)的柔性车间调度优化研究(Matlab代码实现)
- 【车间调度】灰狼优化算法求解柔性作业车间问题【含Matlab源码 661期】
⛄一.车间调度简介 1 车间调度定义 车间调度是指根据产品制造的合理需求分配加工车间顺序,从而达到合理利用产品制造资源.提高企业经济效益的目的.车间调度问题从数学上可以描述为有n个待加工的零件要在m台 ...
- 【车间调度】基于灰狼优化算法求解柔性作业车间问题matlab源码
一.简介 Grey Wolf Optimizer是Seyedali Mirjalili受大灰狼捕食策略的启发,于2014年提出的一种元启发式算法,主要模拟了搜索猎物.包围猎物和攻击猎物,源代码关注公众 ...
- matlab遗传算法无人机问题,基于改进遗传算法的无人机路径规划
[1] 杨陆强, 果霖, 朱加繁, 等. 我国农用无人机发展概况与展望[J]. 农机化研究,2017,39(8):6-11.(YANG L Q,GUO L, ZHU J F, et al. The d ...
- python 遗传算法 agv_基于改进遗传算法的AGV路径规划
基于改进遗传算法的 AGV 路径规划 苑光明,翟云飞,丁承君,张 鹏 [摘 要] [摘 要] 针对 AGV 在自动化生产线中原有路径规划算法存在路径拐 弯次数多,不利于 AGV 自动控制的问题,提出了 ...
- arima模型matlab代码_PSTR面板平滑转换模型简介(附Matlab代码分享)
写论文的时候用到的~相关的资料太少了,做一些简单内容和资料的分享.(PSTR模型的Matlab代码分享在最后)本文主要为简单理论和粗暴实操~ 有用的话可以点个赞哟(知乎小白卑微求赞) 嘻嘻下面进入正题 ...
- 【车间调度】基于改进蛙跳算法求解车间调度问题
作业车间调度问题描述 作业车间调度问题(Job Shop Scheduling, JSP)是最经典的几个NP-hard问题之一.其应用领域极其广泛,涉及航母调度,机场飞机调度,港口码头货船调度,汽车加 ...
最新文章
- 《构建之法》阅读笔记07
- 科大讯飞语音助手Lite智能鼠标电脑版安装不成功为什么?怎么办?
- 敏捷软件开发学习笔记(四)之结构型设计模式
- unionall mysql_5分钟了解MySQL5.7union all用法的黑科技
- django基础入门(1)django基本配置
- python去除视频中的logo_Python音视频开发:消除抖音短视频Logo和去电视台标的实现详解...
- SpringMVC框架----请求参数的绑定
- Python组合数据类型:容器类型总览,(不)可变数据类型immutable、(不)可迭代对象iterable、迭代器iterator、生成器generator、语法糖
- 【Android】Listview返回顶部,快速返回顶部的功能实现,详解代码。
- 在CentOS7上实现NFS共享
- 实战HTML:模拟Mac界面静态实现
- VINS-Mono 代码详细解读——视觉跟踪 feature_trackers
- 怎样改计算机密码忘了怎么办,电脑设置的密码忘了怎么办
- Windows10家庭版 Windows defender 安全中心显示 页面不可用
- 干货!小样本分子性质预测新方法——性质感知的关系网络
- Windows XP 上网提示:您的时钟快了/慢了
- elementUI checkbox选中回显操作注意事项
- 读淘宝页面字节流提取宝贝图片地址宝贝标题宝贝价格
- 神经网络的类型分类和结构理解
- RTX 2060 12GB 参数