永不漠灭的轨迹- 发表于 2014-8-14 09:21

PSO网络的一个算法,不知道是哪出错了,求指点

>> function main()
clc;clear all;close all;
tic;                 %程序运行计时
E0=0.001;            %允许误差
MaxNum=100;           %粒子最大迭代次数
narvs=1;            %目标函数自变量个数
particlesize=30;    %粒子群规模
c1=2;               %每个粒子个体学习因子,也称加速常数
c2=2;               %每个粒子的社会学习因子,也称加速常数
w=0.6;              %惯性因子
vmax=0.8;           %粒子最大飞翔速度
x=-5+10*rand(particlesize,narvs); %粒子所在位置
v=2*rand(particlesize,navrs);        %粒子的飞翔速度
%用inline定义适应度函数以便于将子函数与主程序文件放在一起,
%目标函数是:y=1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2))
%inline命令定义实应度函数如下
fitness=inline('1/(1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2)))','x');
%inline定义的实验度函数会使程序运行速度大大降低
for i=1:particlesize
    for j=1:narvs
        f(i)=fitness(x(i,j));
    end
end
personalbest_x=x;
personalbest_faval=f;
=min(personalbest_faval);
globalbest_x=personalbest_x(i,:);
k=1;
while k<=MaxNum
    for i=1:particlesize
        for j=1:narvs;
        f(i)=fitness(x(i,j));
        end
    if f(i)<personalbest_faval(i)   %判断当前位置是否历史上最佳位置
        personalbest_faval(i)=f(i);
        personalbest_x(i,:)=x(i,:);
    end
    end
    =min(personalbest_faval);
    globalbest_x=personalbest_x(i,:);
    for i=1:particlesize           %更新粒子群里每个个体的最新位置
        v(i,:)=w*v(i,:)+c1*rand*(personalbest_x(i,:)-x(i,:))...
            +c2*rand*(globalbest_x-x(i,:));
         for j=1:narvs             %判断粒子的飞翔速度是否超过了最大飞行速度
             if v(i.j)>vmax;   
                 v(i,j)=vmax;
             else if v(i,j)<-vmax;
                     v(i,j)=-vmax;
                 end
             end
             x(i,:)=x(i,:)+v(i,:);
         end
         if abs(globalbest_faval)<E0,break,end
         k=k+1;
    end
    Valuel=1/globalbest_faval-1;Valuel=num2str(Valuel);
    %strcat指令可以实现字符的组合输出
    disp(strcat('the maximun valuel','=',Valuel));
  %输出最大值所在的横坐标位置
    Value2=globalbest_x; Value2=num2str(Value2);
     disp(strcat('the corresponding coordinate','=',Value2));
     x=-5:0.01:5;
     y=2.1*(1-x+2*x.^2).*exp(-x.^2/2);
     plot(x,y,'m-','linewidth',3);
     hold on;
     plot(globalbest_x,1/globalbest_faval-1,'kp','linewidth',4);
     legend('目标函数','搜索到的最大值');
     xlabel('x');ylabel('y');grid on;toc;


错误提示 ??? function main()    |
Error: Function definitions are not permitted in this context.

去掉function main()后 提示??? Undefined function or variable 'navrs'.错误。求指点!

平凡之不凡 发表于 2014-8-14 09:37

代码重新发一下,格式出问题了,你可以调整一下

永不漠灭的轨迹- 发表于 2014-8-14 10:20

格式是对的  是不是那个自定义函数的问题,我刚刚查了一下,说是要先定义M文件。

永不漠灭的轨迹- 发表于 2014-8-14 10:21

平凡之不凡 发表于 2014-8-14 09:37 static/image/common/back.gif
代码重新发一下,格式出问题了,你可以调整一下


格式是对的  是不是那个自定义函数的问题,我刚刚查了一下,说是要先定义M文件。

永不漠灭的轨迹- 发表于 2014-8-15 10:00

function main() clc;clear all;close all; tic;                 %程序运行计时 E0=0.001;            %允许误差 MaxNum=100;           %粒子最大迭代次数 narvs=1;            %目标函数自变量个数 particlesize=30;    %粒子群规模 c1=2;               %每个粒子个体学习因子,也称加速常数 c2=2;               %每个粒子的社会学习因子,也称加速常数 w=0.6;              %惯性因子 vmax=0.8;           %粒子最大飞翔速度 x=-5+10*rand(particlesize,narvs); %粒子所在位置 v=2*rand(particlesize,navrs);        %粒子的飞翔速度 %用inline定义适应度函数以便于将子函数与主程序文件放在一起, %目标函数是:y=1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2)) %inline命令定义实应度函数如下 fitness=inline('1/(1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2)))','x'); %inline定义的实验度函数会使程序运行速度大大降低 for i=1:particlesize     for j=1:narvs         f(i)=fitness(x(i,j));     end end personalbest_x=x; personalbest_faval=f; =min(personalbest_faval); globalbest_x=personalbest_x(i,:); k=1; while k<=MaxNum     for i=1:particlesize         for j=1:narvs;         f(i)=fitness(x(i,j));         end     if f(i)<personalbest_faval(i)   %判断当前位置是否历史上最佳位置         personalbest_faval(i)=f(i);         personalbest_x(i,:)=x(i,:);     end     end     =min(personalbest_faval);     globalbest_x=personalbest_x(i,:);     for i=1:particlesize           %更新粒子群里每个个体的最新位置         v(i,:)=w*v(i,:)+c1*rand*(personalbest_x(i,:)-x(i,:))...             +c2*rand*(globalbest_x-x(i,:));          for j=1:narvs             %判断粒子的飞翔速度是否超过了最大飞行速度              if v(i.j)>vmax;                      v(i,j)=vmax;              else if v(i,j)<-vmax;                      v(i,j)=-vmax;                  end              end              x(i,:)=x(i,:)+v(i,:);          end          if abs(globalbest_faval)<E0,break,end          k=k+1;     end     Valuel=1/globalbest_faval-1;Valuel=num2str(Valuel);     %strcat指令可以实现字符的组合输出     disp(strcat('the maximun valuel','=',Valuel));   %输出最大值所在的横坐标位置     Value2=globalbest_x; Value2=num2str(Value2);      disp(strcat('the corresponding coordinate','=',Value2));      x=-5:0.01:5;      y=2.1*(1-x+2*x.^2).*exp(-x.^2/2);      plot(x,y,'m-','linewidth',3);      hold on;      plot(globalbest_x,1/globalbest_faval-1,'kp','linewidth',4);      legend('目标函数','搜索到的最大值');      xlabel('x');ylabel('y');grid on;toc;

平凡之不凡 发表于 2014-8-17 08:58

function main()
clc;clear all;close all;
tic;                              %程序运行计时
E0=0.001;                        %允许误差
MaxNum=100;                    %粒子最大迭代次数
narvs=1;                         %目标函数的自变量个数
particlesize=30;                    %粒子群规模
c1=2;                            %每个粒子的个体学习因子,也称为加速常数
c2=2;                            %每个粒子的社会学习因子,也称为加速常数
w=0.6;                           %惯性因子
vmax=0.8;                        %粒子的最大飞翔速度
x=-5+10*rand(particlesize,narvs);     %粒子所在的位置
v=2*rand(particlesize,narvs);         %粒子的飞翔速度
%用inline定义适应度函数以便将子函数文件与主程序文件放在一起,
%目标函数是:y=1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2))
%inline命令定义适应度函数如下:
fitness=inline('1/(1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2)))','x');
%inline定义的适应度函数会使程序运行速度大大降低
for i=1:particlesize
    for j=1:narvs
        f(i)=fitness(x(i,j));
    end
end
personalbest_x=x;
personalbest_faval=f;
=min(personalbest_faval);
globalbest_x=personalbest_x(i,:);
k=1;
while k<=MaxNum
    for i=1:particlesize
        for j=1:narvs
            f(i)=fitness(x(i,j));
        end
        if f(i)<personalbest_faval(i) %判断当前位置是否是历史上最佳位置
            personalbest_faval(i)=f(i);
            personalbest_x(i,:)=x(i,:);
        end
    end
    =min(personalbest_faval);
    globalbest_x=personalbest_x(i,:);
    for i=1:particlesize %更新粒子群里每个个体的最新位置
        v(i,:)=w*v(i,:)+c1*rand*(personalbest_x(i,:)-x(i,:))...
            +c2*rand*(globalbest_x-x(i,:));
        for j=1:narvs    %判断粒子的飞翔速度是否超过了最大飞翔速度
            if v(i,j)>vmax;
                v(i,j)=vmax;
            elseif v(i,j)<-vmax;
                v(i,j)=-vmax;
            end
        end
        x(i,:)=x(i,:)+v(i,:);
    end
    if abs(globalbest_faval)<E0,break,end
    k=k+1;
end
Value1=1/globalbest_faval-1; Value1=num2str(Value1);
% strcat指令可以实现字符的组合输出
disp(strcat('the maximum value','=',Value1));
%输出最大值所在的横坐标位置
Value2=globalbest_x; Value2=num2str(Value2);
disp(strcat('the corresponding coordinate','=',Value2));
x=-5:0.01:5;
y=2.1*(1-x+2*x.^2).*exp(-x.^2/2);
plot(x,y,'m-','linewidth',3);
hold on;
plot(globalbest_x,1/globalbest_faval-1,'kp','linewidth',4);
legend('目标函数','搜索到的最大值');xlabel('x');ylabel('y');grid on;toc;

平凡之不凡 发表于 2014-8-17 08:59

这个是调好的

永不漠灭的轨迹- 发表于 2014-8-17 13:24

平凡之不凡 发表于 2014-8-17 08:58 static/image/common/back.gif


谢谢老师!:)
页: [1]
查看完整版本: PSO网络的一个算法,不知道是哪出错了,求指点