【PSO运输优化】基于MATLAB的PSO运输优化算法的仿真
1.軟件版本
matlab2013b
2.本算法理論知識(shí)
??????? 問(wèn)題是,假設(shè)我有一個(gè)收集軌道,上面有5個(gè)采集堆,這5個(gè)采集堆分別被看作一個(gè)4*20的矩陣(下面只有4*10),每個(gè)模塊(比如:A31和A32的元素含量不同),為了達(dá)到采集物品數(shù)量和元素含量的要求(比如:需采集5噸和某元素單位質(zhì)量在65與62之間),求出在每個(gè)4*20的矩陣中哪個(gè)模塊被拿出可以達(dá)到要求并找出最優(yōu)化的軌道?
已知數(shù)據(jù):
1.每個(gè)采集堆的元素含量(在excel表格的 sheet 1)
2.每個(gè)采集堆里面模塊的坐標(biāo),長(zhǎng)寬高(米為單位)(在excel表格的 sheet 1)
3.元素含量和采集物品數(shù)量的要求 (在excel 表格的 sheet 2), 分別有五種不同含量的最大值和最小值, 還有采集數(shù)量的要求,以及誤差。
4.在軌道左側(cè)的兩個(gè)采集堆分別是C型號(hào)和A型號(hào)的,兩個(gè)采集堆只見(jiàn)距離30m; 軌道右側(cè)的三個(gè)采集堆按照順序分別是B型號(hào),B型號(hào)和C型號(hào),同樣每個(gè)采集堆之間相距20m。5.采集堆形狀附在附錄1
附錄1 采集對(duì)側(cè)視圖
高: 10m(A.BC)
每一層寬度和長(zhǎng)度不一樣,具體數(shù)據(jù)在excel表格
所以第一行就是三角體體積,剩下的就是梯行體積。
????? ?這里其實(shí)是一個(gè)最優(yōu)化問(wèn)題,即滿足采集物品的需求,需要對(duì)3個(gè)類型的5個(gè)集散地進(jìn)行裝貨,且每次只能取最上面的,如果對(duì)于當(dāng)前位置的物品,如果最少面沒(méi)有取走,那么只能先取最上面的物品,然后統(tǒng)計(jì)裝貨軌跡的距離,通過(guò)優(yōu)化計(jì)算最短距離。
?????? ?那么,這里解題的關(guān)鍵是計(jì)算目標(biāo)函數(shù),然后使用優(yōu)化算法對(duì)目標(biāo)函數(shù)進(jìn)行優(yōu)化處理。本算法的主要目標(biāo)就是目標(biāo)函數(shù)的設(shè)計(jì),這個(gè)也是該課題的難點(diǎn)。
??????? 首先我們根據(jù)上面的需求,建立如下的數(shù)學(xué)模型:
???????
??????? 這里,dj表示每一次從一個(gè)模塊移動(dòng)到另外一個(gè)模塊的距離,如果是從一個(gè)采集堆移動(dòng)到另外一個(gè)采集堆中,那么則在另外一堆中計(jì)算所采集的模塊之間的間距。
??????? 所以上面的公式為:
??????
??????即在不同的采集堆的所有距離之和。這里,需要通過(guò)優(yōu)化考慮不同采集堆之間的移動(dòng),以及在每個(gè)采集上如何進(jìn)行模塊的采集兩個(gè)因素。
我們的目標(biāo)就是使得上面的函數(shù)值最小,從而得到采集路線軌跡。
這里,需要考慮的難點(diǎn)有如下幾點(diǎn):
第一:空間軌跡是三維,這個(gè)比二維的復(fù)雜。
第二:約束條件的建立,我們根據(jù)課題的需求,建立如下的約束條件。
2.1 采集規(guī)則約束。
即每次只能采集最上面的,如果最上面的沒(méi)有被取走,那么不能直接采集下面的。
這里,我們使用是數(shù)學(xué)公式表示如下:
??????? 分別對(duì)四層的模塊進(jìn)行標(biāo)記,最上面的為4,如果取走了則直接賦值0,這樣,而每次我們只能去標(biāo)號(hào)最大的那個(gè)。如果取走了,那么被取走的賦值為0,那么在判斷的時(shí)候,可以取下面的,如果全部被取走了,則為全0,如果為全零,則這列就不能取值了。即全零表示空。
2.2 滿足采集物品數(shù)量和元素含量的約束
?????? 根據(jù)所提供的數(shù)據(jù),物品數(shù)量的最大值為60000t,誤差為1.
而元素含量為得約束條件為:
| 元素1 | 元素2 | 元素3 | 元素4 | 元素5 | |
| 65 | 6 | 4 | 0.077 | 0.1 | 最大值 |
| 62 | 0 | 0 | 0 | 0 | 最小值 |
通過(guò)課題所給出的約束條件可知,我們需要通過(guò)采集模塊,使得最后的總重量為60000,而所采集的物品中的各個(gè)元素的所含比例影響滿足上面的約束條件。
??????? 即上面的約束條件是通過(guò)物品的采集,使得總量滿足要求,且五個(gè)元素的單位質(zhì)量滿足上面的約束,最后使得采集軌跡最短。
?????? 所以,通過(guò)上面的綜合分析,我們所要的數(shù)學(xué)公式為:
? ??????
????? ??為了方便,我們將所需要的數(shù)據(jù),在excel中整理下,將里面一些你用公式編輯的轉(zhuǎn)換為真實(shí)的數(shù)據(jù)。修改的excel文件見(jiàn)新發(fā)你的數(shù)據(jù),而約束條件則直接在程序中進(jìn)行設(shè)置。
??????? 這里,我們假設(shè),設(shè)備從一個(gè)端點(diǎn)移動(dòng)到另外一個(gè)端點(diǎn)的時(shí)候,是逐漸向前移動(dòng)的,而不是來(lái)回移動(dòng)的。即,設(shè)備是一次從軌道的一個(gè)端點(diǎn)移動(dòng)到另外一個(gè)端點(diǎn)的(事實(shí)上,規(guī)定都是依次向運(yùn)動(dòng)的)
?????? 根據(jù)這個(gè)假設(shè),我們?cè)O(shè)計(jì)的思路為當(dāng)每次運(yùn)動(dòng)到一堆的時(shí)候,首先在這一堆物品上進(jìn)行采集,由于每堆物品之間的間距遠(yuǎn)大于每堆內(nèi)部的各個(gè)模塊之間的間隔,所以在實(shí)際中也不可能在兩個(gè)不同的堆之間來(lái)回切換的抓取模塊,這也符合我們上面的假設(shè)。
??????? 根據(jù)上面的假設(shè),我們抓取的順序?yàn)锽堆,C堆,A堆,A堆,B堆。
3.核心代碼
%根據(jù)這個(gè)假設(shè),我們?cè)O(shè)計(jì)的思路為當(dāng)每次運(yùn)動(dòng)到一堆的時(shí)候,首先在這一堆物品上進(jìn)行采集,由于 %每堆物品之間的間距遠(yuǎn)大于每堆內(nèi)部的各個(gè)模塊之間的間隔,所以在實(shí)際中也不可能在兩個(gè)不同的 %堆之間來(lái)回切換的抓取模塊,這也符合我們上面的假設(shè)。 %根據(jù)上面的假設(shè),我們抓取的順序?yàn)锽堆,C堆,A堆,A堆,B堆。 %這里,我們所使用的算法是局部PSO優(yōu)化,然后再整體PSO優(yōu)化的算法,即首先通過(guò)再每一堆的采集 %的時(shí)候進(jìn)行PSO優(yōu)化,并使的各個(gè)元素含量滿足約束的條件下,得到路徑最短的采集軌跡,然后通過(guò) %后面三堆重復(fù)相同的優(yōu)化算法,最后第五堆的時(shí)候,在做相同的優(yōu)化前提下,同時(shí)檢測(cè)總量是否滿足 %條件,如果不滿足進(jìn)入下一次大迭代循環(huán),然后重復(fù)上面的操作,最后得到滿足條件的總的采集軌跡。clc; clear; close all; warning off; pack; addpath 'func\'%********************************************************************************** %步驟一:調(diào)用數(shù)據(jù) %步驟一:調(diào)用數(shù)據(jù) Dat = xlsread('Dat\datas.xlsx');%分成ABC三組 A_set = Dat( 1:40 ,:); B_set = Dat(41:80 ,:); C_set = Dat(81:120,:);%A相關(guān)數(shù)據(jù) %坐標(biāo) A_POS = A_set(:,1:3); %元素含量 A_FAC = A_set(:,4:8); %體積長(zhǎng)寬高 A_VUM = A_set(:,9:11);%B相關(guān)數(shù)據(jù) %坐標(biāo) B_POS = B_set(:,1:3); %元素含量 B_FAC = B_set(:,4:8); %體積長(zhǎng)寬高 B_VUM = B_set(:,9:11);%C相關(guān)數(shù)據(jù) %坐標(biāo) C_POS = C_set(:,1:3); %元素含量 C_FAC = C_set(:,4:8); %體積長(zhǎng)寬高 C_VUM = C_set(:,9:11);%************************************************************************** %**************************************************************************%********************************************************************************** %步驟二:參數(shù)初始化 %步驟二:參數(shù)初始化 %約束參數(shù) %59999 ~ 60001 Mass_all = 60000; Mass_err = 1; %元素1 Mass1_max= 65; Mass1_min= 62; %元素2 Mass2_max= 6; Mass2_min= 0; %元素3 Mass3_max= 4; Mass3_min= 0; %元素4 Mass4_max= 0.077; Mass4_min= 0; %元素5 Mass5_max= 0.1; Mass5_min= 0;%優(yōu)化算法參數(shù) %優(yōu)化算法參數(shù) %迭代次數(shù) Iteration_all = 1; Iteration_sub = 10000; %粒子數(shù)目 Num_x = 200;%密度 P = 2.1; %計(jì)算各個(gè)模塊的質(zhì)量,單位t %注意,本課題一個(gè)堆中有個(gè)四個(gè)形狀的模塊,即三角形,三種梯形,所以我們根據(jù)長(zhǎng)寬高以及對(duì)應(yīng)的形狀計(jì)算體積,從而計(jì)算質(zhì)量 A_Vulome = func_cal_volume(A_VUM); B_Vulome = func_cal_volume(B_VUM); C_Vulome = func_cal_volume(C_VUM); %計(jì)算每個(gè)采集堆的各個(gè)模塊的質(zhì)量 A_mass = P*A_Vulome; B_mass = P*B_Vulome; C_mass = P*C_Vulome;%以下根據(jù)實(shí)際軌跡上的堆的分布來(lái)設(shè)置 maxs_sets = [B_mass;C_mass;A_mass;A_mass;B_mass]; FAC_sets = [B_FAC;C_FAC;A_FAC;A_FAC;B_FAC];%************************************************************************** %**************************************************************************%********************************************************************************** %步驟三:開(kāi)始優(yōu)化運(yùn)算 %步驟三:開(kāi)始優(yōu)化運(yùn)算 X_pos{1} = B_POS(:,1); Y_pos{1} = B_POS(:,2); Z_pos{1} = B_POS(:,3);X_pos{2} = C_POS(:,1); Y_pos{2} = C_POS(:,2); Z_pos{2} = C_POS(:,3);X_pos{3} = A_POS(:,1); Y_pos{3} = A_POS(:,2); Z_pos{3} = A_POS(:,3);X_pos{4} = A_POS(:,1); Y_pos{4} = A_POS(:,2); Z_pos{4} = A_POS(:,3);X_pos{5} = B_POS(:,1); Y_pos{5} = B_POS(:,2); Z_pos{5} = B_POS(:,3);%先通過(guò)PSO優(yōu)化需求模型 for Num_pso = 4:40%這里沒(méi)有必要設(shè)置太大,設(shè)置大了需求量肯定會(huì)超過(guò)60000,因此,這個(gè)值得大小根據(jù)需求量來(lái)確定,大概范圍即可Num_psox = zeros(Num_x,Num_pso);i = 0;%產(chǎn)生能夠滿足采集規(guī)則的隨機(jī)粒子數(shù)據(jù)for jj = 1:Num_x%產(chǎn)生隨機(jī)數(shù)的時(shí)候,必須是先采集第一層,然后才采集第二層,依次類推%第1層index1 = [1:10,41:50,81:90,121:130,161:170];%第2層index2 = [1:10,41:50,81:90,121:130,161:170]+10;%第3層index3 = [1:10,41:50,81:90,121:130,161:170]+20;%第4層index4 = [1:10,41:50,81:90,121:130,161:170]+30;%根據(jù)采集規(guī)則產(chǎn)生隨機(jī)數(shù)%根據(jù)采集規(guī)則產(chǎn)生隨機(jī)數(shù)%根據(jù)采集規(guī)則產(chǎn)生隨機(jī)數(shù)index = [index1;index2;index3;index4];i = 0;while i < Num_psoi = i + 1;if i> 1for j = 1:50;index(IS(j),ind(1)) = 9999;endendfor j = 1:50;[VS,IS(j)] = min(index(:,j));tmps(1,j) = index(IS(j),j);endind = randperm(40);a(i) = tmps(ind(1));if a(i) == 9999i = i-1;endendx(jj,:) = a; endn = Num_pso; F = fitness_mass(x,maxs_sets,Mass_all);Fitness_tmps1 = F(1);Fitness_tmps2 = 1;for i=1:Num_xif Fitness_tmps1 >= F(i)Fitness_tmps1 = F(i);Fitness_tmps2 = i;endendxuhao = Fitness_tmps2;Tour_pbest = x; %當(dāng)前個(gè)體最優(yōu)Tour_gbest = x(xuhao,:) ; %當(dāng)前全局最優(yōu)路徑Pb = inf*ones(1,Num_x); %個(gè)體最優(yōu)記錄Gb = F(Fitness_tmps2); %群體最優(yōu)記錄xnew1 = x;N = 1;while N <= Iteration_sub%計(jì)算適應(yīng)度 F = fitness_mass(x,maxs_sets,Mass_all);for i=1:Num_xif F(i)<Pb(i)%將當(dāng)前值賦給新的最佳值Pb(i)=F(i); Tour_pbest(i,:)=x(i,:);endif F(i)<GbGb=F(i);Tour_gbest=x(i,:);endendFitness_tmps1 = Pb(1);Fitness_tmps2 = 1;for i=1:Num_xif Fitness_tmps1>=Pb(i)Fitness_tmps1=Pb(i);Fitness_tmps2=i;endendnummin = Fitness_tmps2;%當(dāng)前群體最優(yōu)需求量差Gb(N) = Pb(nummin); for i=1:Num_x%與個(gè)體最優(yōu)進(jìn)行交叉c1 = round(rand*(n-2))+1; c2 = round(rand*(n-2))+1;while c1==c2c1 = round(rand*(n-2))+1;c2 = round(rand*(n-2))+1;end chb1 = min(c1,c2);chb2 = max(c1,c2);cros = Tour_pbest(i,chb1:chb2); %交叉區(qū)域元素個(gè)數(shù)ncros= size(cros,2); %刪除與交叉區(qū)域相同元素for j=1:ncrosfor k=1:nif xnew1(i,k)==cros(j)xnew1(i,k)=0;for t=1:n-ktemp=xnew1(i,k+t-1);xnew1(i,k+t-1)=xnew1(i,k+t);xnew1(i,k+t)=temp;endendendendxnew = xnew1;%插入交叉區(qū)域for j=1:ncrosxnew1(i,n-ncros+j) = cros(j);end%判斷產(chǎn)生需求量差是否變小masses=0;masses = sum(maxs_sets(xnew1(i,:)));if F(i)>massesx(i,:) = xnew1(i,:);end%與全體最優(yōu)進(jìn)行交叉c1 = round(rand*(n-2))+1; c2 = round(rand*(n-2))+1;while c1==c2c1=round(rand*(n-2))+1; c2=round(rand*(n-2))+1;end chb1 = min(c1,c2);chb2 = max(c1,c2);%交叉區(qū)域矩陣cros = Tour_gbest(chb1:chb2); %交叉區(qū)域元素個(gè)數(shù)ncros= size(cros,2); %刪除與交叉區(qū)域相同元素for j=1:ncrosfor k=1:nif xnew1(i,k)==cros(j)xnew1(i,k)=0;for t=1:n-ktemp=xnew1(i,k+t-1);xnew1(i,k+t-1)=xnew1(i,k+t);xnew1(i,k+t)=temp;end endendendxnew = xnew1;%插入交叉區(qū)域for j=1:ncrosxnew1(i,n-ncros+j) = cros(j);end%判斷產(chǎn)生需求量差是否變小masses=0;masses = sum(maxs_sets(xnew1(i,:)));if F(i)>massesx(i,:)=xnew1(i,:);end%進(jìn)行變異操作c1 = round(rand*(n-1))+1; c2 = round(rand*(n-1))+1;temp = xnew1(i,c1);xnew1(i,c1) = xnew1(i,c2);xnew1(i,c2) = temp;%判斷產(chǎn)生需求量差是否變小masses=0;masses = sum(maxs_sets(xnew1(i,:)));if F(i)>massesx(i,:)=xnew1(i,:);endendFitness_tmps1=F(1);Fitness_tmps2=1;for i=1:Num_xif Fitness_tmps1>=F(i)Fitness_tmps1=F(i);Fitness_tmps2=i;endendxuhao = Fitness_tmps2;L_best(N) = min(F);%當(dāng)前全局最優(yōu)需求量Tour_gbest = x(xuhao,:); N = N + 1;end%判斷含量是否滿足要求for ii = 1:5Fac_tmps(ii) = sum(FAC_sets(Tour_gbest,ii)'.*maxs_sets(Tour_gbest))/sum(maxs_sets(Tour_gbest));endif (Fac_tmps(1) >= Mass1_min & Fac_tmps(1) <= Mass1_max) &...(Fac_tmps(2) >= Mass2_min & Fac_tmps(2) <= Mass2_max) &...(Fac_tmps(3) >= Mass3_min & Fac_tmps(3) <= Mass3_max) &...(Fac_tmps(4) >= Mass4_min & Fac_tmps(4) <= Mass4_max) &... (Fac_tmps(5) >= Mass5_min & Fac_tmps(5) <= Mass5_max)flag(Num_pso-3) = 1;elseflag(Num_pso-3) = 0; endMass_fig(Num_pso-3) = min(L_best);Mass_Index{Num_pso-3}= Tour_gbest ; endfigure; plot(Mass_fig,'b-o'); xlabel('采集模塊個(gè)數(shù)'); ylabel('需求量計(jì)算值和標(biāo)準(zhǔn)需求量的差值關(guān)系圖');save temp\result1.mat Mass_fig Mass_Index flag4.操作步驟與仿真結(jié)論
??????? 首先,運(yùn)行程序run_first.m,搜索所有采集方法得到的需求量為59999~60001之間的采集組合。并保存仿真結(jié)果。
??????? 這個(gè)步驟仿真結(jié)果如下所示:
????? 通過(guò)這個(gè)步驟將優(yōu)化出符合采集規(guī)則且符合元素含量,并滿足需求量的模塊集合,然后運(yùn)行run_second.m,進(jìn)行軌跡優(yōu)化。
最后得到的優(yōu)化記過(guò),即滿足條件下的最短軌跡長(zhǎng)度
5.參考文獻(xiàn)
A06-10
6.完整源碼獲得方式
方式1:微信或者QQ聯(lián)系博主
方式2:訂閱MATLAB/FPGA教程,免費(fèi)獲得教程案例以及任意2份完整源碼
總結(jié)
以上是生活随笔為你收集整理的【PSO运输优化】基于MATLAB的PSO运输优化算法的仿真的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【OFDM频域同步】基于OFDM数字电视
- 下一篇: 【LSTM】基于LSTM网络的人脸识别算