基于PSO的运输优化算法的MATLAB仿真
???????假設有一個收集軌道,上面有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
%根據這個假設,我們設計的思路為當每次運動到一堆的時候,首先在這一堆物品上進行采集,由于
%每堆物品之間的間距遠大于每堆內部的各個模塊之間的間隔,所以在實際中也不可能在兩個不同的
%堆之間來回切換的抓取模塊,這也符合我們上面的假設。
%根據上面的假設,我們抓取的順序為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_pso
? ? x = 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_pso
? ? ? ? ? ? i = i + 1;
? ? ? ? ? ? if i> 1
? ? ? ? ? ? ? ? for j = 1:50;
? ? ? ? ? ? ? ? ? ? index(IS(j),ind(1)) = 9999;
? ? ? ? ? ? ? ? end
? ? ? ? ? ? end
? ? ? ? ? ? for j = 1:50;
? ? ? ? ? ? ? ? [VS,IS(j)] = min(index(:,j));
? ? ? ? ? ? ? ? tmps(1,j) ?= index(IS(j),j);
? ? ? ? ? ? end
? ? ? ? ? ? ind ?= randperm(40);
? ? ? ? ? ? a(i) = tmps(ind(1));
? ? ? ? ? ? if a(i) == 9999
? ? ? ? ? ? ? ?i = i-1;
? ? ? ? ? ? end
? ? ? ? end
? ? ? ? x(jj,:) = a;?
? ? end
? ??
? ??
? ? n ? ? ? ? ? ? = Num_pso; ?
? ? F ? ? ? ? ? ? = fitness_mass(x,maxs_sets,Mass_all);
? ? Fitness_tmps1 = F(1);
? ? Fitness_tmps2 = 1;
? ??
? ? for i=1:Num_x
? ? ? ? if Fitness_tmps1 >= F(i)
? ? ? ? ? ?Fitness_tmps1 = ?F(i);
? ? ? ? ? ?Fitness_tmps2 = ?i;
? ? ? ? end
? ? end
? ? xuhao ? ? ?= 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_x
? ? ? ? ? ? if F(i)<Pb(i)
? ? ? ? ? ? ? ?%將當前值賦給新的最佳值
? ? ? ? ? ? ? ?Pb(i)=F(i); ? ? ?
? ? ? ? ? ? ? ?Tour_pbest(i,:)=x(i,:);
? ? ? ? ? ? end
? ? ? ? ? ??
? ? ? ? ? ? if F(i)<Gb
? ? ? ? ? ? ? ?Gb=F(i);
? ? ? ? ? ? ? ?Tour_gbest=x(i,:);
? ? ? ? ? ? end
? ? ? ? end
? ? ? ? Fitness_tmps1 = Pb(1);
? ? ? ? Fitness_tmps2 = 1;
? ? ? ??
? ? ? ? for i=1:Num_x
? ? ? ? ? ? if Fitness_tmps1>=Pb(i)
? ? ? ? ? ? ? ?Fitness_tmps1=Pb(i);
? ? ? ? ? ? ? ?Fitness_tmps2=i;
? ? ? ? ? ? end
? ? ? ? end
? ? ? ??
? ? ? ? nummin = 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==c2
? ? ? ? ? ? ? ? ? c1 = 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:ncros
? ? ? ? ? ? ? ? for k=1:n
? ? ? ? ? ? ? ? ? ? if xnew1(i,k)==cros(j)
? ? ? ? ? ? ? ? ? ? ? ?xnew1(i,k)=0;
? ? ? ? ? ? ? ? ? ? ? ?for t=1:n-k
? ? ? ? ? ? ? ? ? ? ? ? ? ?temp=xnew1(i,k+t-1);
? ? ? ? ? ? ? ? ? ? ? ? ? ?xnew1(i,k+t-1)=xnew1(i,k+t);
? ? ? ? ? ? ? ? ? ? ? ? ? ?xnew1(i,k+t)=temp;
? ? ? ? ? ? ? ? ? ? ? ?end
? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? end
? ? ? ? ? ? end
? ? ? ? ? ? xnew = xnew1;
? ? ? ? ? ? %插入交叉區域
? ? ? ? ? ? for j=1:ncros
? ? ? ? ? ? ? ? xnew1(i,n-ncros+j) = cros(j);
? ? ? ? ? ? end
? ? ? ? ? ? %判斷產生需求量差是否變小
? ? ? ? ? ? masses=0;
? ? ? ? ? ? masses = sum(maxs_sets(xnew1(i,:)));
? ? ? ? ? ? if F(i)>masses
? ? ? ? ? ? ? ?x(i,:) = xnew1(i,:);
? ? ? ? ? ? end
?
? ? ? ? ? ? %與全體最優進行交叉
? ? ? ? ? ? c1 = round(rand*(n-2))+1; ?
? ? ? ? ? ? c2 = round(rand*(n-2))+1;
? ? ? ? ? ? while c1==c2
? ? ? ? ? ? ? ? ? c1=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:ncros
? ? ? ? ? ? ? ? for k=1:n
? ? ? ? ? ? ? ? ? ? if xnew1(i,k)==cros(j)
? ? ? ? ? ? ? ? ? ? ? ?xnew1(i,k)=0;
? ? ? ? ? ? ? ? ? ? ? ?for t=1:n-k
? ? ? ? ? ? ? ? ? ? ? ? ? ?temp=xnew1(i,k+t-1);
? ? ? ? ? ? ? ? ? ? ? ? ? ?xnew1(i,k+t-1)=xnew1(i,k+t);
? ? ? ? ? ? ? ? ? ? ? ? ? ?xnew1(i,k+t)=temp;
? ? ? ? ? ? ? ? ? ? ? ?end ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? end
? ? ? ? ? ? end
? ? ? ? ? ? xnew = xnew1;
? ? ? ? ? ? %插入交叉區域
? ? ? ? ? ? for j=1:ncros
? ? ? ? ? ? ? ? xnew1(i,n-ncros+j) = cros(j);
? ? ? ? ? ? end
? ? ? ? ? ? %判斷產生需求量差是否變小
? ? ? ? ? ? masses=0;
? ? ? ? ? ? masses = sum(maxs_sets(xnew1(i,:)));
? ? ? ? ? ? if F(i)>masses
? ? ? ? ? ? ? x(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)>masses
? ? ? ? ? ? ? ?x(i,:)=xnew1(i,:);
? ? ? ? ? ? end
? ? ? ? end
? ? ? ? Fitness_tmps1=F(1);
? ? ? ? Fitness_tmps2=1;
? ? ? ? for i=1:Num_x
? ? ? ? ? ?if Fitness_tmps1>=F(i)
? ? ? ? ? ? ? Fitness_tmps1=F(i);
? ? ? ? ? ? ? Fitness_tmps2=i;
? ? ? ? ? ?end
? ? ? ? end
? ? ? ? xuhao ? ? ?= Fitness_tmps2;
? ? ? ? L_best(N) ?= min(F);
? ? ? ? %當前全局最優需求量
? ? ? ? Tour_gbest = x(xuhao,:); ? ??
? ? ? ? N ? ? ? ? ?= N + 1;
? ? ? ??
? ? end
? ? %判斷含量是否滿足要求
? ? for ii = 1:5
? ? ? ? Fac_tmps(ii) = sum(FAC_sets(Tour_gbest,ii)'.*maxs_sets(Tour_gbest))/sum(maxs_sets(Tour_gbest));
? ? end
? ??
? ? if (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;
? ? else
? ? ? ?flag(Num_pso-3) = 0;?
? ? end
? ? Mass_fig(Num_pso-3) ?= min(L_best);
? ? Mass_Index{Num_pso-3}= Tour_gbest ;
end
figure;
plot(Mass_fig,'b-o');
xlabel('采集模塊個數');
ylabel('需求量計算值和標準需求量的差值關系圖');
save temp\result1.mat Mass_fig Mass_Index flag
最后得到的優化記過,即滿足條件下的最短軌跡長度
A-06-10
?
總結
以上是生活随笔為你收集整理的基于PSO的运输优化算法的MATLAB仿真的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4.MATLAB基础编程操作——变量、常
- 下一篇: 2.Vivado软件基础操作