資源簡介
我用matlab自己寫的一個三維粒子群算法的程序,不是很精簡,有簡化的空間,但是功能還是很全面的,注釋略多,看不慣可以自己刪哈哈
代碼片段和文件信息
?SR=1000;%搜索范圍Searching?range
?RNS=1;%群體規模與搜索范圍之比The?ratio?of?the?number?of?particles?to?the?searching?range
?M=RNS*SR;%群體規模Members
?W=0.5;%慣性權重Inertia?weight
?C1=5;%加速常數Accelerated?constant
?C2=5;%加速常數Accelerated?constant
?RVR=0.02;%最大速度與搜索范圍之比The?ratio?of?the?maximum?velocity?to?the?searching?range
?RCS=0.01;%收斂區間與搜索范圍之比The?ratio?of?the?convergent?interval?to??the?searching?range
?CI=RCS*SR;%收斂區間Convergent?interval?
?PT=0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001;%暫停時間Pause?time
?RNPA=0.5;%正負半軸標度之比The?ratio?of?the?negative?half?axis?to?the?positive?half?axis
?x=SR*rand(1M);
?y=SR*rand(1M);
?z=SR*rand(1M);
?px=x;
?py=y;
?pz=z;%初始化個體歷史最優解數據
?vx=RVR*SR*rand(1M);
?vxmax=RVR*SR*(zeros(1M)+1);
?vy=RVR*SR*rand(1M);
?vymax=RVR*SR*(zeros(1M)+1);
?vz=RVR*SR*rand(1M);
?vzmax=RVR*SR*(zeros(1M)+1);
?ox=SR*rand*(zeros(1M)+1);
?oy=SR*rand*(zeros(1M)+1);
?oz=SR*rand*(zeros(1M)+1);%隨機生成谷地位置?以上為初始化過程
?sx=abs(x-ox);
?sy=abs(x-oy);
?sz=abs(x-oz);%評估每個微粒的適應度
?[rc]=find(sx==min(min(sx)));
?gx=x(rc)*(zeros(1M)+1);
?[rc]=find(sy==min(min(sy)));
?gy=y(rc)*(zeros(1M)+1);
?[rc]=find(sz==min(min(sz)));
?gz=z(rc)*(zeros(1M)+1);
while?(max(max(sx))>CI)||(max(max(sy))>CI)||(max(max(sz))>CI)%確定結果收斂區間
??????ox=0.1*SR*rand*(zeros(1M)+1);
??????oy=0.1*SR*rand*(zeros(1M)+1);
??????oz=0.1*SR*rand*(zeros(1M)+1);
??????plot3(oxoyoz‘r*‘);
??????title(‘三維粒子群算法收斂演示‘);
??????text(oxoyoz‘隨機目標點‘);
??????xlabel(‘X‘)
??????ylabel(‘Y‘)
??????zlabel(‘Z‘);
??????axis([-RNPA*SR?SR?-RNPA*SR?SR?-RNPA*SR?SR]);
??????grid?on;
??????hold?on;
??????plot3(xyz‘b*‘);
??????hold?off;
??????pause(PT);
??????if?max(max(sx))>CI
?????????vx=W*vx+C1*rand*(px-x)+C2*rand*(gx-x);%根據算法方程給v一個改變量。因為區間長度較小,所以弱化微粒的自身慣性和自我認知能力,強化社會能力以盡快得到最優解
?????????while??max(max(vx))>RVR*SR||min(min(vx))<-RVR*SR
????????????????if?max(max(vx))>RVR*SR
???????????????????[rc]=find(vx==max(max(vx
評論
共有 條評論