找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1937|回复: 0
打印 上一主题 下一主题
收起左侧

PSO求解最大崩溃路径 MATLAB源程序

[复制链接]
跳转到指定楼层
楼主
这是我个人的程序库中的程序,是本人在大二时为求解电网崩溃节点概率所写。根据每个节点的崩溃概率,求解最大崩溃路径,据此在设计方案时尽可能避免路径的产生。


随即结果与最优结果对比,同时给出相应崩溃概率

MATLAB源程序:
  1. %% 该函数演示多目标perota优化问题
  2. %清空环境
  3. %close all
  4. %clear,clc

  5. load qzjz            %权值矩阵

  6. %% 初始参数

  7. %初始化程序
  8. Dim=20;               %粒子维数
  9. PopSize=100;           %种群个数
  10. MaxIt=500;            %迭代次数
  11. c1=0.5;               %算法参数
  12. c2=0.7;               %算法参数
  13. wmax=1.2;             %惯性因子
  14. wmin=0.1;             %惯性因子
  15. NumToNext=1;                %记录最优适应值个数
  16. NumToQuit=1;                %记录最优适应度重复出现的个数
  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. % 粒子适应度值
  26. IndivdualFitness=ones(1,PopSize);   %单个粒子适应度

  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. % 最优值初始化
  34. IndivdualBestFitness=IndivdualFitness; %粒子最大适应度
  35. IndivdualBestPath=Group;           %个体最佳值

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

  37. %记录上一次各粒子的适应值
  38. OldIndivdualFitness=IndivdualFitness;

  39. %记录初始最优适应值
  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}) %利用点的坐标添加对应标注
  48. end
  49. line(x,y);
  50. title('随机解')
  51. grid on;

  52. %% 循环迭代
  53. for iter=1:MaxIt
  54.    
  55.     % 权值更新
  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;                    %新产生的随机数与原矩阵中不相同
  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.     %% 计算更新后个体适应度
  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;  %判断新粒子路径的适应值是否大于原来的
  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                    %重复20次种群最优适应度为改变就退出迭代
  133.         break;
  134.     end
  135. end

  136. %最优解
  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}) %利用点的坐标添加对应标注
  145. end
  146. line(x1,y1);
  147. title('最优解');
  148. grid on;


  149. %适应值曲线
  150. subplot(2,2,3:4);
  151. s=size(OldGlobalBestFitness,2);
  152. plot(1:s,OldGlobalBestFitness,'p');
  153. line(1:s,OldGlobalBestFitness);


  154. %%给出计算结果
  155. disp('最优路径为:');
  156. for i=1:Dim
  157.         fprintf('%d',GlobalBestPath(i));
  158.     if i~=Dim
  159.         fprintf('%s','-');
  160.     end
  161. end
  162. fprintf('\n');
复制代码

下载:
PSO求解最大崩溃路径.zip (2.25 KB, 下载次数: 8)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表