這是我個人的程序庫中的程序,是本人在大二時為求解電網(wǎng)崩潰節(jié)點概率所寫。根據(jù)每個節(jié)點的崩潰概率,求解最大崩潰路徑,據(jù)此在設(shè)計方案時盡可能避免路徑的產(chǎn)生。
輸出結(jié)果.jpg (49.09 KB, 下載次數(shù): 67)
下載附件
2020-8-24 10:28 上傳
隨即結(jié)果與最優(yōu)結(jié)果對比,同時給出相應(yīng)崩潰概率
MATLAB源程序:
- %% 該函數(shù)演示多目標perota優(yōu)化問題
- %清空環(huán)境
- %close all
- %clear,clc
- load qzjz %權(quán)值矩陣
- %% 初始參數(shù)
- %初始化程序
- Dim=20; %粒子維數(shù)
- PopSize=100; %種群個數(shù)
- MaxIt=500; %迭代次數(shù)
- c1=0.5; %算法參數(shù)
- c2=0.7; %算法參數(shù)
- wmax=1.2; %慣性因子
- wmin=0.1; %慣性因子
- NumToNext=1; %記錄最優(yōu)適應(yīng)值個數(shù)
- NumToQuit=1; %記錄最優(yōu)適應(yīng)度重復(fù)出現(xiàn)的個數(shù)
- w=0;
- for i=1:PopSize %粒子初始化
- Group(i,:)=randperm(20);
- end
- v=zeros(1,Dim); %速度初始化
- %定義位置
- x=[10 10 5 20 30 20 10 20 25 5 20 5 10 10 0 30 15 15 0 5 10];
- y=[2.5 3 2 2 0 1.5 1 0.5 1 0.5 0 0 0.5 0 1.5 0.5 1.5 2 2 1.5 2.5];
- % 粒子適應(yīng)度值
- IndivdualFitness=ones(1,PopSize); %單個粒子適應(yīng)度
- %計算初始目標向量
- for i=1:PopSize
- for j=1:Dim-1
- IndivdualFitness(i) = IndivdualFitness(i)*qzjz(Group(i,j),Group(i,j+1)); %粒子概率
- end
- end
- % 最優(yōu)值初始化
- IndivdualBestFitness=IndivdualFitness; %粒子最大適應(yīng)度
- IndivdualBestPath=Group; %個體最佳值
- GlobalBestPath=Group(1,:); %粒子群最佳位置
- %記錄上一次各粒子的適應(yīng)值
- OldIndivdualFitness=IndivdualFitness;
- %記錄初始最優(yōu)適應(yīng)值
- OldGlobalBestFitness=max(IndivdualBestFitness);
- %隨機解
- sign={'1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20'};
- figure;
- subplot(2,2,1);
- plot(x,y,'r*');
- for i=1:Dim
- text(x(i)+0.1,y(i)+0.1,sign{i}) %利用點的坐標添加對應(yīng)標注
- end
- line(x,y);
- title('隨機解')
- grid on;
- %% 循環(huán)迭代
- for iter=1:MaxIt
-
- % 權(quán)值更新
- w=wmax-(wmax-wmin)*iter/MaxIt;
- %% 群體更新
- for i=1:PopSize
- %速度更新
- v=w*v+c1*rand(1,1)*(IndivdualBestPath(i,:)-Group(i,:))+c2*rand(1,1)*(GlobalBestPath-Group(i,:));
-
- %位置更新
- Group(i,:)=Group(i,:)+v;
- Group(i,:)=ceil(Group(i,:));
- index0=[];
- for j=1:Dim
- flag=0; %沒有不符合條件的值
- if ((Group(i,j)<=0)||(Group(i,j)>Dim))
- flag=1;
- end
- for k=j+1:Dim
- if Group(i,j)==Group(i,k)
- flag=1;
- break;
- end
- end
- if flag==1
- index0=[index0,j];
- end
- end
-
- t=1;
- m=randperm(Dim);
- NumOfSize=size(index0,2);
- for j=1:Dim
- flag=0; %新產(chǎn)生的隨機數(shù)與原矩陣中不相同
- for k=1:Dim
- flag0=0;
- for q=1:NumOfSize
- if k==index0(q)
- flag0=1;
- end
- end
- if flag0==1
- continue;
- end
- if m(1,j)==Group(i,k)
- flag=1;
- break;
- end
- end
-
- if flag==0
- Group(i,index0(t))=m(1,j);
- t=t+1;
- end
- if t>length(index0)
- break;
- end
- end
- end
- %% 計算更新后個體適應(yīng)度
- IndivdualFitness(:)=1;
- for i=1:PopSize
- for j=1:Dim-1 %控制類別
- IndivdualFitness(i) = IndivdualFitness(i)*qzjz(Group(i,j),Group(i,j+1)); %計算粒子i 概率
- end
- end
-
- IsChange=IndivdualFitness>=OldIndivdualFitness; %判斷新粒子路徑的適應(yīng)值是否大于原來的
- IndivdualBestPath(find(IsChange),:) = Group(find(IsChange),:);%更新個體最佳路徑
- OldIndivdualFitness = OldIndivdualFitness.*( ~IsChange) + IndivdualFitness.*IsChange;%更新個體最佳路徑距離
-
- [GlobalBestFitness,Index]=max(IndivdualFitness);
- GlobalBestPath=Group(Index,:);
- if GlobalBestFitness>OldGlobalBestFitness
- NumToNext=NumToNext+1;
- OldGlobalBestFitness(1,NumToNext)=GlobalBestFitness;
- else
- NumToQuit=NumToQuit+1;
- end
- if NumToQuit>=20 %重復(fù)20次種群最優(yōu)適應(yīng)度為改變就退出迭代
- break;
- end
- end
- %最優(yōu)解
- for i=1:Dim
- x1(i)=x(GlobalBestPath(i));
- y1(i)=y(GlobalBestPath(i));
- end
- subplot(2,2,2);
- plot(x,y,'r*');
- for i=1:Dim
- text(x(i)+0.1,y(i)+0.1,sign{i}) %利用點的坐標添加對應(yīng)標注
- end
- line(x1,y1);
- title('最優(yōu)解');
- grid on;
- %適應(yīng)值曲線
- subplot(2,2,3:4);
- s=size(OldGlobalBestFitness,2);
- plot(1:s,OldGlobalBestFitness,'p');
- line(1:s,OldGlobalBestFitness);
- %%給出計算結(jié)果
- disp('最優(yōu)路徑為:');
- for i=1:Dim
- fprintf('%d',GlobalBestPath(i));
- if i~=Dim
- fprintf('%s','-');
- end
- end
- fprintf('\n');
復(fù)制代碼
下載:
PSO求解最大崩潰路徑.zip
(2.25 KB, 下載次數(shù): 8)
2020-8-24 10:32 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|