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