1 内容介绍
某服装企业决定加工9批本企业品牌服装,因季节变化关系,每批产品都有一个交货期限,如果在此期限之前完成,则产品可以较高的价格出售,超过期限则将面临更激烈的价格竞争而减少生产效益。假设各批次服装的加工时间、交货期限和利润如表1所示,设每批产品的加工过程不允许中断,即一批产品加工过程中不能插入其他批次产品的加工,求总利润最大的加工顺序。
表1 本企业品牌产品加工时间和交货期限表
产品批次 1 2 3 4 5 6 7 8 9
加工时间(天) 3 4 1 2 6 1 4 7 5
交货期限 5 9 3 12 10 24 5 6 6
按期产品利润(百元) 750 1200 800 900 2500 500 3000 5600 4500
逾期产品利润(百元) 500 900 400 750 1800 300 1500 4000 2000
问题:选取适当的决策变量,建立总利润最大化的服装加工顺序模型,计算并列出生产进度表。
2 仿真代码
<span style="color:#333333"><span style="background-color:rgba(0, 0, 0, 0.03)"><code>clear all;</code><code>close all;</code><code>clc;</code><code>N=<span style="color:#0e9ce5">100</span>;%群体粒子个数</code><code>T=<span style="color:#0e9ce5">20</span>;%最大迭代次数</code><code>c1=<span style="color:#0e9ce5">2</span>;%个体最优学习因子</code><code>c2=<span style="color:#0e9ce5">2</span>;%全局最优学习因子</code><code>Vmax=<span style="color:#0e9ce5">4</span>;%速度最大值</code><code>Vmin=-<span style="color:#0e9ce5">4</span>;%速度最小值</code><code>Wmax=<span style="color:#0e9ce5">0</span>.<span style="color:#0e9ce5">9</span>;%惯性权重最大值</code><code>Wmin=<span style="color:#0e9ce5">0</span>.<span style="color:#0e9ce5">4</span>;%惯性权重最小值rrr</code><code>Channel=<span style="color:#0e9ce5">9</span>;%设置空闲信道数目</code><code>Counter=<span style="color:#0e9ce5">0</span>;%更新次数</code><code>Flag=zeros(T,<span style="color:#0e9ce5">1</span>);%标记更新</code><code>overMatrix=zeros(T,N);%逾期时间矩阵</code><code>minTbest=zeros(<span style="color:#0e9ce5">20</span>,<span style="color:#0e9ce5">1</span>);%逾期时间矩阵</code><code>results=zeros(<span style="color:#0e9ce5">20</span>,<span style="color:#0e9ce5">11</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">20</span></code><code> minTbest(i,<span style="color:#0e9ce5">1</span>)=<span style="color:#0e9ce5">1000</span>;</code><code><span style="color:#ca7d37">end</span></code><code>step=<span style="color:#0e9ce5">4</span>;%设置step位二进制表示一个十进制数</code><code>D=step.*Channel;%粒子维数</code><code>rbest=ones(<span style="color:#0e9ce5">20</span>,Channel);</code><code></code><code>% vacant_time=[<span style="color:#0e9ce5">10</span>,<span style="color:#0e9ce5">60</span>, <span style="color:#0e9ce5">25</span>, <span style="color:#0e9ce5">170</span>,<span style="color:#0e9ce5">83</span>, <span style="color:#0e9ce5">5</span>, <span style="color:#0e9ce5">54</span>, <span style="color:#0e9ce5">155</span>];%设置各个信道的平均空闲时间(求均值)</code><code></code><code> time=[<span style="color:#0e9ce5">3</span> <span style="color:#0e9ce5">4</span> <span style="color:#0e9ce5">1</span> <span style="color:#0e9ce5">2</span> <span style="color:#0e9ce5">6</span> <span style="color:#0e9ce5">1</span> <span style="color:#0e9ce5">4</span> <span style="color:#0e9ce5">7</span> <span style="color:#0e9ce5">5</span>];%时间矩阵</code><code> deadline=[<span style="color:#0e9ce5">5</span> <span style="color:#0e9ce5">9</span> <span style="color:#0e9ce5">3</span> <span style="color:#0e9ce5">12</span> <span style="color:#0e9ce5">10</span> <span style="color:#0e9ce5">24</span> <span style="color:#0e9ce5">5</span> <span style="color:#0e9ce5">6</span> <span style="color:#0e9ce5">6</span>];</code><code> profilein=[<span style="color:#0e9ce5">750</span> <span style="color:#0e9ce5">1200</span> <span style="color:#0e9ce5">800</span> <span style="color:#0e9ce5">900</span> <span style="color:#0e9ce5">2500</span> <span style="color:#0e9ce5">500</span> <span style="color:#0e9ce5">3000</span> <span style="color:#0e9ce5">5600</span> <span style="color:#0e9ce5">4500</span>];</code><code> profileout=[<span style="color:#0e9ce5">500</span> <span style="color:#0e9ce5">900</span> <span style="color:#0e9ce5">400</span> <span style="color:#0e9ce5">750</span> <span style="color:#0e9ce5">1800</span> <span style="color:#0e9ce5">300</span> <span style="color:#0e9ce5">1500</span> <span style="color:#0e9ce5">4000</span> <span style="color:#0e9ce5">2000</span>];</code><code> %time=[<span style="color:#0e9ce5">0</span> <span style="color:#0e9ce5">3</span> <span style="color:#0e9ce5">6</span> <span style="color:#0e9ce5">5</span> <span style="color:#0e9ce5">1</span> <span style="color:#0e9ce5">3</span> <span style="color:#0e9ce5">1</span> <span style="color:#0e9ce5">5</span> <span style="color:#0e9ce5">6</span> <span style="color:#0e9ce5">3</span> <span style="color:#0e9ce5">2</span>];%时间矩阵</code><code> %deadline=[<span style="color:#0e9ce5">2</span> <span style="color:#0e9ce5">4</span> <span style="color:#0e9ce5">5</span> <span style="color:#0e9ce5">5</span> <span style="color:#0e9ce5">5</span> <span style="color:#0e9ce5">15</span> <span style="color:#0e9ce5">15</span> <span style="color:#0e9ce5">20</span> <span style="color:#0e9ce5">24</span> <span style="color:#0e9ce5">35</span> <span style="color:#0e9ce5">35</span>];</code><code> %profilein=[<span style="color:#0e9ce5">1250</span> <span style="color:#0e9ce5">1600</span> <span style="color:#0e9ce5">1800</span> <span style="color:#0e9ce5">2500</span> <span style="color:#0e9ce5">500</span> <span style="color:#0e9ce5">1700</span> <span style="color:#0e9ce5">650</span> <span style="color:#0e9ce5">1500</span> <span style="color:#0e9ce5">1800</span> <span style="color:#0e9ce5">1200</span> <span style="color:#0e9ce5">800</span>];</code><code> %profileout=[<span style="color:#0e9ce5">1000</span> <span style="color:#0e9ce5">1280</span> <span style="color:#0e9ce5">1440</span> <span style="color:#0e9ce5">200</span> <span style="color:#0e9ce5">0</span> <span style="color:#0e9ce5">1190</span> <span style="color:#0e9ce5">450</span> <span style="color:#0e9ce5">1050</span> <span style="color:#0e9ce5">1260</span> <span style="color:#0e9ce5">660</span> <span style="color:#0e9ce5">500</span> ];</code><code><span style="color:#dd1144">%%%</span><span style="color:#dd1144">%%%</span><span style="color:#dd1144">%%%</span><span style="color:#dd1144">%%%</span><span style="color:#dd1144">%%%</span>初始化种群个体(限定速度和位置)<span style="color:#dd1144">%%%</span><span style="color:#dd1144">%%%</span><span style="color:#dd1144">%%%</span><span style="color:#dd1144">%%%</span><span style="color:#dd1144">%%%</span><span style="color:#dd1144">%%%</span><span style="color:#dd1144">%%%</span><span style="color:#dd1144">%%</span></code><code>x=randint(N,D); %随机获得二进制编码的初始种群</code><code>v=rand(N,D)*(Vmax-Vmin)+Vmin;%初始化速度</code><code></code><code><span style="color:#ca7d37">end</span></code><code>disp([<span style="color:#dd1144">'20次全局最优值(前9列为加工顺序,第10列为本次加工总逾期时间(其中1000表示没有更新,结果同上一次更新,第11列为总利润)):'</span>]);</code><code>sortrows(results,<span style="color:#0e9ce5">11</span>)</code><code>g; %最优个体</code><code>g1=bin2decStep(g,step,Channel);</code><code>gb(T);</code><code>disp([<span style="color:#dd1144">'利润最大化的服装加工顺序为:'</span>,num2str(g1+<span style="color:#0e9ce5">1</span>)]);</code><code>disp([<span style="color:#dd1144">'最大总利润为:'</span>,num2str(gb(T))]);</code><code><span style="color:#ca7d37">for</span> i=<span style="color:#0e9ce5">1</span><span style="color:#dd1144">:</span><span style="color:#0e9ce5">20</span></code><code> <span style="color:#ca7d37">if</span> Flag(i,<span style="color:#0e9ce5">1</span>)==<span style="color:#0e9ce5">1</span></code><code> overdueTime=minTbest(i);</code><code> <span style="color:#ca7d37">end</span></code><code><span style="color:#ca7d37">end</span></code><code>disp([<span style="color:#dd1144">'本次加工总逾期利润:'</span>,num2str(overdueTime)]);</code><code>plot(gb,<span style="color:#dd1144">'-*b'</span>);</code><code>xlabel(<span style="color:#dd1144">'迭代次数'</span>);</code><code>ylabel(<span style="color:#dd1144">'总利润(元)'</span>);</code><code>title(<span style="color:#dd1144">'适应度进化曲线'</span>);</code><code> </code></span></span>
3 运行结果
4 参考文献
[1]陈智慧. 基于JADE平台的粒子群算法在经济调度中的应用[J]. 电气技术, 2015, 16(001):32-35.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。