這是我個人的程序庫中的程序,是本人在大二時為求解電網崩潰節點概率所寫。根據每個節點的崩潰概率,求解最大崩潰路徑,據此在設計方案時盡可能避免路徑的產生。
輸出結果.jpg (49.09 KB, 下載次數: 67)
下載附件
2020-8-24 10:28 上傳
隨即結果與最優結果對比,同時給出相應崩潰概率
MATLAB源程序:
- %% 該函數演示多目標perota優化問題
- %清空環境
- %close all
- %clear,clc
- load qzjz %權值矩陣
- %% 初始參數
- %初始化程序
- Dim=20; %粒子維數
- PopSize=100; %種群個數
- MaxIt=500; %迭代次數
- c1=0.5; %算法參數
- c2=0.7; %算法參數
- wmax=1.2; %慣性因子
- wmin=0.1; %慣性因子
- NumToNext=1; %記錄最優適應值個數
- NumToQuit=1; %記錄最優適應度重復出現的個數
- 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];
- % 粒子適應度值
- IndivdualFitness=ones(1,PopSize); %單個粒子適應度
- %計算初始目標向量
- for i=1:PopSize
- for j=1:Dim-1
- IndivdualFitness(i) = IndivdualFitness(i)*qzjz(Group(i,j),Group(i,j+1)); %粒子概率
- end
- end
- % 最優值初始化
- IndivdualBestFitness=IndivdualFitness; %粒子最大適應度
- IndivdualBestPath=Group; %個體最佳值
- GlobalBestPath=Group(1,:); %粒子群最佳位置
- %記錄上一次各粒子的適應值
- OldIndivdualFitness=IndivdualFitness;
- %記錄初始最優適應值
- 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}) %利用點的坐標添加對應標注
- end
- line(x,y);
- title('隨機解')
- grid on;
- %% 循環迭代
- for iter=1:MaxIt
-
- % 權值更新
- 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; %新產生的隨機數與原矩陣中不相同
- 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
- %% 計算更新后個體適應度
- 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; %判斷新粒子路徑的適應值是否大于原來的
- 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 %重復20次種群最優適應度為改變就退出迭代
- break;
- end
- end
- %最優解
- 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}) %利用點的坐標添加對應標注
- end
- line(x1,y1);
- title('最優解');
- grid on;
- %適應值曲線
- subplot(2,2,3:4);
- s=size(OldGlobalBestFitness,2);
- plot(1:s,OldGlobalBestFitness,'p');
- line(1:s,OldGlobalBestFitness);
- %%給出計算結果
- disp('最優路徑為:');
- for i=1:Dim
- fprintf('%d',GlobalBestPath(i));
- if i~=Dim
- fprintf('%s','-');
- end
- end
- fprintf('\n');
復制代碼
下載:
PSO求解最大崩潰路徑.zip
(2.25 KB, 下載次數: 8)
2020-8-24 10:32 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|