【優化演算法】粒子群優化多目標搜尋演算法【含Matlab原始碼 1124期】
阿新 • • 發佈:2021-07-10
一、簡介
粒子群優化多目標搜尋演算法
二、原始碼
%% 該函式演示多目標perota優化問題 %清空環境 clc clear load data %% 初始引數 objnum=size(P,1); %類中物品個數 weight=92; %總重量限制 %初始化程式 Dim=5; %粒子維數 xSize=50; %種群個數 MaxIt=200; %迭代次數 c1=0.8; %演算法引數 c2=0.8; %演算法引數 wmax=1.2; %慣性因子 wmin=0.1; %慣性因子 x=unidrnd(4,xSize,Dim); %粒子初始化 v=zeros(xSize,Dim); %速度初始化 xbest=x; %個體最佳值 gbest=x(1,:); %粒子群最佳位置 % 粒子適應度值 px=zeros(1,xSize); %粒子價值目標 rx=zeros(1,xSize); %粒子體積目標 cx=zeros(1,xSize); %重量約束 % 最優值初始化 pxbest=zeros(1,xSize); %粒子最優價值目標 rxbest=zeros(1,xSize); %粒子最優體積目標 cxbest=zeros(1,xSize); %記錄重量,以求約束 % 上一次的值 pxPrior=zeros(1,xSize);%粒子價值目標 rxPrior=zeros(1,xSize);%粒子體積目標 cxPrior=zeros(1,xSize);%記錄重量,以求約束 %計算初始目標向量 for i=1:xSize for j=1:Dim %控制類別 px(i) = px(i)+P(x(i,j),j); %粒子價值 rx(i) = rx(i)+R(x(i,j),j); %粒子體積 cx(i) = cx(i)+C(x(i,j),j); %粒子重量 end end % 粒子最優位置 pxbest=px;rxbest=rx;cxbest=cx; %% 初始篩選非劣解 flj=[]; fljx=[]; fljNum=0; %兩個實數相等精度 tol=1e-7; for i=1:xSize flag=0; %支配標誌 for j=1:xSize if j~=i if ((px(i)<px(j)) && (rx(i)>rx(j))) ||((abs(px(i)-px(j))<tol)... && (rx(i)>rx(j)))||((px(i)<px(j)) && (abs(rx(i)-rx(j))<tol)) || (cx(i)>weight) flag=1; break; end end end %判斷有無被支配 if flag==0 fljNum=fljNum+1; % 記錄非劣解 flj(fljNum,1)=px(i);flj(fljNum,2)=rx(i);flj(fljNum,3)=cx(i); % 非劣解位置 fljx(fljNum,:)=x(i,:); end end %% 迴圈迭代 for iter=1:MaxIt % 權值更新 w=wmax-(wmax-wmin)*iter/MaxIt; %從非劣解中選擇粒子作為全域性最優解 s=size(fljx,1); index=randi(s,1,1); gbest=fljx(index,:); %% 群體更新 for i=1:xSize %速度更新 v(i,:)=w*v(i,:)+c1*rand(1,1)*(xbest(i,:)-x(i,:))+c2*rand(1,1)*(gbest-x(i,:)); %位置更新 x(i,:)=x(i,:)+v(i,:); x(i,:) = rem(x(i,:),objnum)/double(objnum); index1=find(x(i,:)<=0); if ~isempty(index1) x(i,index1)=rand(size(index1)); end x(i,:)=ceil(4*x(i,:)); end %% 計算個體適應度 pxPrior(:)=0; rxPrior(:)=0; cxPrior(:)=0; for i=1:xSize for j=1:Dim %控制類別 pxPrior(i) = pxPrior(i)+P(x(i,j),j); %計算粒子i 價值 rxPrior(i) = rxPrior(i)+R(x(i,j),j); %計算粒子i 體積 cxPrior(i) = cxPrior(i)+C(x(i,j),j); %計算粒子i 重量 end end %% 更新粒子歷史最佳 for i=1:xSize %現在的支配原有的,替代原有的 if ((px(i)<pxPrior(i)) && (rx(i)>rxPrior(i))) ||((abs(px(i)-pxPrior(i))<tol)... && (rx(i)>rxPrior(i)))||((px(i)<pxPrior(i)) && (abs(rx(i)-rxPrior(i))<tol)) || (cx(i)>weight) xbest(i,:)=x(i,:);%沒有記錄目標值 pxbest(i)=pxPrior(i);rxbest(i)=rxPrior(i);cxbest(i)=cxPrior(i); end %彼此不受支配,隨機決定 if ~( ((px(i)<pxPrior(i)) && (rx(i)>rxPrior(i))) ||((abs(px(i)-pxPrior(i))<tol)... && (rx(i)>rxPrior(i)))||((px(i)<pxPrior(i)) && (abs(rx(i)-rxPrior(i))<tol)) || (cx(i)>weight) )... && ~( ((pxPrior(i)<px(i)) && (rxPrior(i)>rx(i))) ||((abs(pxPrior(i)-px(i))<tol) && (rxPrior(i)>rx(i)))... ||((pxPrior(i)<px(i)) && (abs(rxPrior(i)-rx(i))<tol)) || (cxPrior(i)>weight) ) if rand(1,1)<0.5 xbest(i,:)=x(i,:); pxbest(i)=pxPrior(i);rxbest(i)=rxPrior(i);cxbest(i)=cxPrior(i); end end end %% 更新非劣解集合 px=pxPrior; rx=rxPrior; cx=cxPrior; %更新升級非劣解集合 s=size(flj,1);%目前非劣解集合中元素個數
三、執行結果
四、備註
版本:2014a
完整程式碼或代寫加QQ1564658423