• 回答数

    2

  • 浏览数

    2644

  • 收藏数

    0

作者:余生一人走 发表于 2018-11-20 10:31:37
跳转到指定楼层
我根据论坛里找到的粒子群程序代码,试着修改了一下来求解一个六维函数最小值在程序位置更新过程中,我也把各个粒子位置的约束条件写了上去,可是运行出来后发现粒子位置的取值一直会超出约束条件,导致结果一直错误,我是个菜鸟,写程序的基本功不行,琢磨了好久也没琢磨出程序的错误在什么地方,不知道有没有大神能帮我看一看?麻烦了!


适应度是F=50*x(1)+14.5*x(2)+0.03*x(2)^2+4.2*x(3)+0.03*x(3)^2+0.031*x(2)*x(3)+36*x(4)    +0.0435*x(4)^2+0.6*x(5)+0.02*x(5)^2+0.011*x(4)*x(5)+23.4*x(6)+4000,


约束条件是:0≤x(1)≤150,
                       81≤x(2)≤247,
                        0≤x(3)≤180,
                       40≤x(4)≤128.5,
                       0≤x(5)≤136.6,
                       0≤x(6)≤2695.2
                        x(2)+x(1)+x(4)=200
                       x(3)+x(5)+x(6)=115
然后根据条件写的粒子初始位置为,X(1)=150*rand,X(2)=166*rand+81,X(3)=180*rand,,X(4)=200-X(1)-X(2)X(5)=136.6*randX(6)=115-X(3)-X(5)

程序:
  • %清空運行環境
  • clc;
  • clear;
  • %參數初始化
  • %速度更新參數
  • c1=2;
  • c2=2;
  • maxgen=100; %迭代次數(進化次數)
  • sizepop=100; %種群規模
  • popmax1=150;
  • popmin1=0;
  • popmax2=247;
  • popmin2=82;
  • popmax3=180;
  • popmin3=0;
  • popmax4=119;
  • popmin4=40;
  • popmax5=136.6;
  • popmin5=0;
  • popmax6=115;
  • popmin6=0;
  • %產生初始粒子
  • pop = zeros(sizepop,6);
  • V = zeros(sizepop,6);
  • fitness = zeros(sizepop,1);
  • for i=1:sizepop
  •     %隨機產生一個種群
  •     pop(i,1)=150*rand; %初始化粒子
  •     pop(i,2)=166*rand+81;
  •     pop(i,3)=180*rand;
  •     pop(i,4)=200-pop(i,1)-pop(i,2);
  •     pop(i,5)=136.6*rand;
  •     pop(i,6)=115-pop(i,3)-pop(i,5);
  •     V(i,=1*rand(1,6); %初始化速度
  •     %計算粒子適應度
  •     fitness(i)=fun(pop(i,);%粒子的適應度
  • end
  • %找出最好的粒子
  • [bestfitness, bestindex]=min(fitness);
  • gbest = pop; %個體最佳解
  • fitnessgbest=fitness; %個體最佳適應度值
  • zbest = pop(bestindex,; %全局最佳解
  • fitnesszbest=bestfitness;%全局最佳適應度
  • %迭代尋優
  • yy = zeros(maxgen,1);
  • for i=1:maxgen
  •     for j=1:sizepop
  •         %速度更新
  •         V(j, = V(j,+c1*rand*(gbest(j,-pop(j,)+c2*rand*(zbest-pop(j,);
  •         %種群更新
  •         pop(j,=pop(j,+V(j,:);
  •         pop(j,pop(j,1)>popmax1)=popmax1;
  •         pop(j,pop(j,2)>popmax2)=popmax2;
  •         pop(j,pop(j,3)>popmax3)=popmax3;
  •         pop(j,pop(j,4)>popmax4)=popmax4;
  •         pop(j,pop(j,5)>popmax5)=popmax5;
  •         pop(j,pop(j,6)>popmax6)=popmax6;
  •         pop(j,pop(j,1)<popmin1)=popmin1;
  •         pop(j,pop(j,2)<popmin2)=popmin2;
  •         pop(j,pop(j,3)<popmin3)=popmin3;
  •         pop(j,pop(j,4)<popmin4)=popmin4;
  •         pop(j,pop(j,5)<popmin5)=popmin5;
  •         pop(j,pop(j,6)<popmin6)=popmin6;
  •         %新適應度值
  •         fitness(j)=fun(pop(j,:));
  •     end
  •     for j=1:sizepop
  •         %個體最佳更新
  •         if fitness(j)<fitnessgbest(j)
  •             gbest(j,:) = pop(j,:);
  •             fitnessgbest(j)=fitness(j);
  •         end
  •         %群體最佳更新
  •         if fitness(j)<fitnesszbest
  •             zbest = pop(j,:);
  •             fitnesszbest = fitness(j)%#ok
  •         end
  •     end
  •     %%結果分析
  •     yy(i)=fitnesszbest;
  • end
  • plot(yy)
  • title(['適應度曲線' '終止代數=' num2str(maxgen)]);
  • xlabel('進化次數');
  • ylabel('適應度');
  • zbest%#ok

复制代码



  • function y=fun(x)
  • y=50*x(1)+15.5*x(2)+0.03*x(2)^2+4.2*x(3)+0.03*x(3)^2+0.031*x(2)*x(3)+36*x(4)+0.0435*x(4)^2+0.6*x(5)+0.02*x(5)^2+0.011*x(4)*x(5)+23.4*x(6)+4000;

复制代码


分享:
回复

使用道具

该用户从未签到

新手上路

Rank: 1

积分
24
极客币
81
主题
24
帖子
38
注册时间
2018-10-22
在线时间
2 小时
性别
保密
发表于 2018-11-20 10:31:52 | 显示全部楼层
你的边界条件赋值语句不对,可以换成if语句,也可以直接修改,例pop(j,pop(j,1)>popmax1)=popmax1改为pop(j,1,pop(j,1)>popmax1)=popmax1;
回复

使用道具 举报

该用户从未签到

新手上路

Rank: 1

积分
22
极客币
75
主题
22
帖子
34
注册时间
2018-10-22
在线时间
2 小时
性别
保密
 楼主| 发表于 2018-11-20 10:33:00 | 显示全部楼层
回复

使用道具 举报

高级模式 评论
您需要登录后才可以回帖 登录 | 立即注册 微信登录