?? main.m
字號(hào):
%-----------------------------------------------
%程序名稱:求解約束優(yōu)化問(wèn)題的改進(jìn)粒子群優(yōu)化算法
%程序功能:求解帶各種約束條件的優(yōu)化問(wèn)題
%輸入條件:各種初始條件,以及設(shè)定參數(shù)
%輸出數(shù)值:最優(yōu)解位置以及函數(shù)極小值
%-----------------------------------------------
%格式設(shè)定
clear all;
clc;
format long;
%參數(shù)設(shè)置
D=10; %搜索空間維數(shù)
N=40; %粒子群規(guī)模
MaxDT=1000; %最大迭代次數(shù)
w=0.7298; %慣性權(quán)重w
c1=1.49618; %學(xué)習(xí)因子c1
c2=1.49618; %學(xué)習(xí)因子c2
%隨機(jī)初始化粒子的位置和速度
for i=1:N
for j=1:D
x(i,j)=1+rand*9; %0到10之間的隨機(jī)數(shù)(不同情況要改變)
v(i,j)=rand;
end
p(i,:)=x(i,:); %初始化時(shí)把粒子位置設(shè)為個(gè)體最優(yōu)位置
end
%根據(jù)兩個(gè)函數(shù)確定最優(yōu)位置適應(yīng)度函數(shù)
Pbest=10^8;
for i=1:D
if fitness(p(i,:),D)<Pbest
Pbest=fitness(p(i,:),D);
Pg=p(i,:);
end
end
%根據(jù)基本粒子群迭代公式進(jìn)行一次進(jìn)化迭代產(chǎn)生中間子代mid
for i=1:N
for j=1:D
v(i,j)=w*v(i,j)+c1*rand*(p(i,j)-x(i,j))+c2*rand*(Pg(j)-x(i,j));
mid(i,j)=x(i,j)+v(i,j); %中間代mid
end
end
%判斷中間代與原父代的優(yōu)劣(進(jìn)化選擇)
for i=1:N
%若都一個(gè)可行,另一個(gè)不可行,則無(wú)條件選擇可行解
if violent(x(i,:),D)==0 && violent(mid(i,:),D)>0
NextGeneration(i,:)=x(i,:);
end
%若都可行,選擇適應(yīng)度小的進(jìn)入下一代
if violent(x(i,:),D)==0 && violent(mid(i,:),D)==0
if fitness(x(i,:),D)<=fitness(mid(i,:),D)
NextGeneration(i,:)=x(i,:);
else
NextGeneration(i,:)=mid(i,:);
end
end
%若都一個(gè)可行,另一個(gè)不可行,則無(wú)條件選擇可行解
if violent(x(i,:),D)>0 && violent(mid(i,:),D)==0
NextGeneration(i,:)=mid(i,:);
end
%若兩個(gè)都不可行,選擇違背約束小的進(jìn)入下一代
if violent(x(i,:),D)>0 && violent(mid(i,:),D)>0
if violent(x(i,:),D)<=violent(mid(i,:),D)
NextGeneration(i,:)=x(i,:);
else
NextGeneration(i,:)=mid(i,:);
end
end
end
%NextGeneration復(fù)制給更新的粒子群x
x=NextGeneration;
%下面進(jìn)入主循環(huán),迭代最大次數(shù)后輸出優(yōu)化結(jié)果
for t=1:MaxDT
%更新個(gè)體和全局最優(yōu)位置
for i=1:N
if fitness(x(i,:),D)<fitness(p(i,:),D)
p(i,:)=x(i,:);
end
if fitness(p(i,:),D)<Pbest && violent(p(i,:),D)==0
Pg=p(i,:);
end
end
%根據(jù)基本粒子群迭代公式進(jìn)行一次進(jìn)化迭代產(chǎn)生中間子代mid
for i=1:N
for j=1:D
v(i,j)=w*v(i,j)+c1*rand*(p(i,j)-x(i,j))+c2*rand*(Pg(j)-x(i,j));
mid(i,j)=x(i,j)+v(i,j); %中間代mid
end
end
%判斷中間代與原父代的優(yōu)劣(進(jìn)化選擇)
for i=1:N
%若都一個(gè)可行,另一個(gè)不可行,則無(wú)條件選擇可行解
if violent(x(i,:),D)==0 && violent(mid(i,:),D)>0
NextGeneration(i,:)=x(i,:);
end
%若都可行,選擇適應(yīng)度小的進(jìn)入下一代
if violent(x(i,:),D)==0 && violent(mid(i,:),D)==0
if fitness(x(i,:),D)<=fitness(mid(i,:),D)
NextGeneration(i,:)=x(i,:);
else
NextGeneration(i,:)=mid(i,:);
end
end
%若都一個(gè)可行,另一個(gè)不可行,則無(wú)條件選擇可行解
if violent(x(i,:),D)>0 && violent(mid(i,:),D)==0
NextGeneration(i,:)=mid(i,:);
end
%若兩個(gè)都不可行,選擇違背約束小的進(jìn)入下一代
if violent(x(i,:),D)>0 && violent(mid(i,:),D)>0
if violent(x(i,:),D)<=violent(mid(i,:),D)
NextGeneration(i,:)=x(i,:);
else
NextGeneration(i,:)=mid(i,:);
end
end
end
%NextGeneration復(fù)制給更新的粒子群x
x=NextGeneration;
end
disp('函數(shù)的最大值為')
-Pbest
%----算法結(jié)束-------------------------------------
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -