找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2488|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

PSO求解最大崩潰路徑 MATLAB源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:815638 發(fā)表于 2020-8-24 10:33 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
這是我個人的程序庫中的程序,是本人在大二時為求解電網(wǎng)崩潰節(jié)點概率所寫。根據(jù)每個節(jié)點的崩潰概率,求解最大崩潰路徑,據(jù)此在設(shè)計方案時盡可能避免路徑的產(chǎn)生。


隨即結(jié)果與最優(yōu)結(jié)果對比,同時給出相應(yīng)崩潰概率

MATLAB源程序:
  1. %% 該函數(shù)演示多目標perota優(yōu)化問題
  2. %清空環(huán)境
  3. %close all
  4. %clear,clc

  5. load qzjz            %權(quán)值矩陣

  6. %% 初始參數(shù)

  7. %初始化程序
  8. Dim=20;               %粒子維數(shù)
  9. PopSize=100;           %種群個數(shù)
  10. MaxIt=500;            %迭代次數(shù)
  11. c1=0.5;               %算法參數(shù)
  12. c2=0.7;               %算法參數(shù)
  13. wmax=1.2;             %慣性因子
  14. wmin=0.1;             %慣性因子
  15. NumToNext=1;                %記錄最優(yōu)適應(yīng)值個數(shù)
  16. NumToQuit=1;                %記錄最優(yōu)適應(yīng)度重復(fù)出現(xiàn)的個數(shù)
  17. w=0;

  18. for i=1:PopSize            %粒子初始化
  19.     Group(i,:)=randperm(20);
  20. end
  21. v=zeros(1,Dim);              %速度初始化

  22. %定義位置
  23. x=[10 10 5 20 30 20 10 20 25 5 20 5 10 10 0 30 15 15 0 5 10];
  24. 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];

  25. % 粒子適應(yīng)度值
  26. IndivdualFitness=ones(1,PopSize);   %單個粒子適應(yīng)度

  27. %計算初始目標向量
  28. for i=1:PopSize
  29.     for j=1:Dim-1   
  30.         IndivdualFitness(i) = IndivdualFitness(i)*qzjz(Group(i,j),Group(i,j+1));  %粒子概率
  31.     end
  32. end

  33. % 最優(yōu)值初始化
  34. IndivdualBestFitness=IndivdualFitness; %粒子最大適應(yīng)度
  35. IndivdualBestPath=Group;           %個體最佳值

  36. GlobalBestPath=Group(1,:);         %粒子群最佳位置

  37. %記錄上一次各粒子的適應(yīng)值
  38. OldIndivdualFitness=IndivdualFitness;

  39. %記錄初始最優(yōu)適應(yīng)值
  40. OldGlobalBestFitness=max(IndivdualBestFitness);

  41. %隨機解
  42. sign={'1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20'};
  43. figure;
  44. subplot(2,2,1);
  45. plot(x,y,'r*');
  46. for i=1:Dim
  47.     text(x(i)+0.1,y(i)+0.1,sign{i}) %利用點的坐標添加對應(yīng)標注
  48. end
  49. line(x,y);
  50. title('隨機解')
  51. grid on;

  52. %% 循環(huán)迭代
  53. for iter=1:MaxIt
  54.    
  55.     % 權(quán)值更新
  56.     w=wmax-(wmax-wmin)*iter/MaxIt;

  57.     %% 群體更新
  58.     for i=1:PopSize
  59.         %速度更新
  60.         v=w*v+c1*rand(1,1)*(IndivdualBestPath(i,:)-Group(i,:))+c2*rand(1,1)*(GlobalBestPath-Group(i,:));
  61.      
  62.         %位置更新
  63.         Group(i,:)=Group(i,:)+v;
  64.         Group(i,:)=ceil(Group(i,:));  
  65.        index0=[];
  66.         for j=1:Dim
  67.             flag=0;                        %沒有不符合條件的值
  68.             if ((Group(i,j)<=0)||(Group(i,j)>Dim))
  69.                 flag=1;
  70.             end
  71.             for k=j+1:Dim
  72.                 if Group(i,j)==Group(i,k)
  73.                     flag=1;
  74.                     break;
  75.                 end
  76.             end
  77.             if flag==1
  78.                 index0=[index0,j];
  79.             end
  80.         end
  81.         
  82.         t=1;
  83.         m=randperm(Dim);
  84.         NumOfSize=size(index0,2);
  85.         for j=1:Dim
  86.             flag=0;                    %新產(chǎn)生的隨機數(shù)與原矩陣中不相同
  87.             for k=1:Dim
  88.                 flag0=0;
  89.                 for q=1:NumOfSize
  90.                     if k==index0(q)
  91.                         flag0=1;
  92.                     end
  93.                 end
  94.                 if flag0==1
  95.                     continue;
  96.                 end
  97.                 if m(1,j)==Group(i,k)
  98.                     flag=1;
  99.                     break;
  100.                 end
  101.             end
  102.             
  103.             if flag==0
  104.                 Group(i,index0(t))=m(1,j);
  105.                 t=t+1;
  106.             end
  107.             if t>length(index0)
  108.                 break;
  109.             end
  110.         end
  111.     end
  112.     %% 計算更新后個體適應(yīng)度
  113.     IndivdualFitness(:)=1;
  114.     for i=1:PopSize
  115.         for j=1:Dim-1 %控制類別
  116.             IndivdualFitness(i) = IndivdualFitness(i)*qzjz(Group(i,j),Group(i,j+1));  %計算粒子i 概率
  117.         end
  118.     end
  119.    
  120.     IsChange=IndivdualFitness>=OldIndivdualFitness;  %判斷新粒子路徑的適應(yīng)值是否大于原來的
  121.     IndivdualBestPath(find(IsChange),:) = Group(find(IsChange),:);%更新個體最佳路徑
  122.     OldIndivdualFitness = OldIndivdualFitness.*( ~IsChange) + IndivdualFitness.*IsChange;%更新個體最佳路徑距離
  123.    
  124.     [GlobalBestFitness,Index]=max(IndivdualFitness);
  125.     GlobalBestPath=Group(Index,:);
  126.     if GlobalBestFitness>OldGlobalBestFitness
  127.         NumToNext=NumToNext+1;
  128.         OldGlobalBestFitness(1,NumToNext)=GlobalBestFitness;
  129.     else
  130.         NumToQuit=NumToQuit+1;
  131.     end
  132.     if NumToQuit>=20                    %重復(fù)20次種群最優(yōu)適應(yīng)度為改變就退出迭代
  133.         break;
  134.     end
  135. end

  136. %最優(yōu)解
  137. for i=1:Dim
  138.     x1(i)=x(GlobalBestPath(i));
  139.     y1(i)=y(GlobalBestPath(i));
  140. end
  141. subplot(2,2,2);
  142. plot(x,y,'r*');
  143. for i=1:Dim
  144.     text(x(i)+0.1,y(i)+0.1,sign{i}) %利用點的坐標添加對應(yīng)標注
  145. end
  146. line(x1,y1);
  147. title('最優(yōu)解');
  148. grid on;


  149. %適應(yīng)值曲線
  150. subplot(2,2,3:4);
  151. s=size(OldGlobalBestFitness,2);
  152. plot(1:s,OldGlobalBestFitness,'p');
  153. line(1:s,OldGlobalBestFitness);


  154. %%給出計算結(jié)果
  155. disp('最優(yōu)路徑為:');
  156. for i=1:Dim
  157.         fprintf('%d',GlobalBestPath(i));
  158.     if i~=Dim
  159.         fprintf('%s','-');
  160.     end
  161. end
  162. fprintf('\n');
復(fù)制代碼

下載:
PSO求解最大崩潰路徑.zip (2.25 KB, 下載次數(shù): 8)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表