ycr2008 发表于 2008-7-5 16:09

【求助】关于遗传算法

大家帮忙看看这个程序,调试了很久找不到问题在哪里:(。这是我把遗传算法原有的M程序改写了一下用S函数来实现,原有程序是可以运行的,改成S函数就出错了


function =yichuan(t,x,u,flag);
Size=80;
G=100;
CodeL=10;
umax=2.048;
umin=-2.048;
switch flag,
       case 0,    %初始化
                =mdlInitializeSizes;
       case 2,   %更新模块离散状态
                sys=mdlUpdate(t,x,u);         
       case 3,   %计算输出向量
                sys=mdlOutputs(t,x,u);
       case 9,   %结束仿真
                sys=mdlTerminate(t,x,u);
    case {1,4}
      sys=[];
    otherwise   %无效输入处理
      error(['Unhandled flag=',num2str(flag)]);
end   
%**********************************************************************
function=mdlInitializeSizes()
sizes=simsizes;
sizes.NumContStates=0;
sizes.NumDiscStates=0;
sizes.NumOutputs=2;
sizes.NumInputs=1;
sizes.DirFeedthrough=0;
sizes.NumSampleTimes=1;
sys=simsizes(sizes);
x0=[];      %无状态量
str=[];   %str为空矩阵
ts=;
%**********************************************************************
function sys=mdlUpdate(t,x,u);
sys=[];
E=round(rand(Size,2*CodeL));
%****** Step 1 : Evaluate BestJ ******
BestJ(k)=min(u);          % 计算本代中的,某个体达到的最小目标值
fi=1/u;                        %Fitness Function    适应度
=sort(fi);   %Arranging fi small to bigger 从小到大排序,
                               % 排序结果:Oderfi 原有下标;Indexfi
Bestfi=Oderfi(Size);         %Let Bestfi=max(fi)   最大适应度在最后一个位置
BestS=E(Indexfi(Size),:);      %Let BestS=E(m), m is the Indexfi belong to max(fi)
                               % 通过序号,取出最优个体
bfi(k)=Bestfi;               % 记录本代的最大适应度
%****** Step 2 : Select and Reproduct Operation******复制
   fi_sum=sum(u);               % 本代各个体适应度代数和
   fi_Size=(Oderfi/fi_sum)*Size;   % 适应度比例=个体适应度/平均适应度
   
   fi_S=floor(fi_Size);      %Selecting Bigger fi value选较大的个体个数
   
   kk=1;
   for i=1:1:Size
      for j=1:1:fi_S(i)      %Select and Reproduce 选择复制适应度大的个体
       TempE(kk,:)=E(Indexfi(i),:);                   % 复制
         kk=kk+1;            %kk is used to reproduce
      end
   end
   
%************ Step 3 : Crossover Operation ************ 交叉
pc=0.60;                        % 交叉概率
n=ceil(20*rand);                  % 随机数0-20, 要交叉的BIT数随机发生
for i=1:2:(Size-1)               
    temp=rand;                  % 产生一个随机数来决定是否发生交叉
    if pc>temp                  % Crossover Condition 交叉条件:给定交叉概率>随机数
    for j=n:1:20
      TempE(i,j)=E(i+1,j);      % 第i与第i+1个体交叉,交叉位数从 n--20,只变后面部分
      TempE(i+1,j)=E(i,j);
    end
    end
end
TempE(Size,:)=BestS;
E=TempE;
   
%************ Step 4: Mutation Operation **************变异
%pm=0.001;
%pm=0.001-*(0.001)/Size; %Bigger fi, smaller Pm
%pm=0.0;    %No mutation
pm=0.1;   %Big mutation         % 变异概率
   for i=1:1:Size
      for j=1:1:2*CodeL
         temp=rand;               % 产生一个随机数来决定是否发生变异
         if pm>temp               %Mutation Condition 变异条件:给定变异概率>随机数
            if TempE(i,j)==0      
               TempE(i,j)=1;      % 0变1
            else
               TempE(i,j)=0;      % 1变0
            end
      end
      end
   end
   
%Guarantee TempPop(30,:) is the code belong to the best individual(max(fi))
TempE(Size,:)=BestS;
E=TempE;
end
%**********************************************************************
function sys=mdlOutputs(t,x,u);
sys=;%(有疑问)
for k=1:1:G
time(k)=k;                  % 记录优化代顺序数
for s=1:1:Size
m=E(s,:);                     % 取1个个体,有20比特
y1=0;y2=0;
%Uncoding
m1=m(1:1:CodeL);            % 取个体前10比特
for i=1:1:CodeL
   y1=y1+m1(i)*2^(i-1);       % 计算16进制值,2进制-->16进制
end
x1=(umax-umin)*y1/1023+umin;% 将码转换成实际值X1
m2=m(CodeL+1:1:2*CodeL);      % 取个体后10比特
for i=1:1:CodeL
   y2=y2+m2(i)*2^(i-1);       % 计算16进制值,2进制-->16进制
end
x2=(umax-umin)*y2/1023+umin;    % 将码转换成实际值X2
%**********************************************************************
function sys=mdlTerminate(t,x,u);
sys=[];


[ 本帖最后由 sigma665 于 2008-7-5 16:58 编辑 ]

sigma665 发表于 2008-7-5 16:58

回复 楼主 的帖子

什么错误

ycr2008 发表于 2008-7-5 20:40

老师刚刚叫开会,才看到。等下,我把错误报告发上来

[ 本帖最后由 ycr2008 于 2008-7-5 21:22 编辑 ]

ycr2008 发表于 2008-7-5 20:43

截图怎么贴不上来呢....:'(

ycr2008 发表于 2008-7-5 21:10

运行中出现的错误报告

“Error evaluating parameter 'Size' in 'xin/S-Function2': Undefined function or variable 'Size'.”这是在运行仿真时出现的错误报告。S-Function2是这个遗传算法对应的S-函数模块,“xin”是搭建的系统的名字。错误报告说得比较笼统,或者我没有真正领会其中的意思,调试了几次都不行,谢谢你了。看到回帖是个意外的惊喜

ycr2008 发表于 2008-7-5 21:22

我搭建的模型

这是我搭建的模型,通过三个S-函数来实现仿真,中间一个是待优化的系统的S函数:

[ 本帖最后由 ycr2008 于 2008-7-5 21:28 编辑 ]

sigma665 发表于 2008-7-5 22:31

建议不要用Size做为变量名

ycr2008 发表于 2008-7-6 10:52

好的,我把Size改为别的参数试一下。bythe way ,小西,为什么Size不适合作变量名?

ycr2008 发表于 2008-7-6 11:31

嗯,明白了。如果变量名是Size容易跟S函数里的Size混淆,是这个原因么?我把变量名修改了,还是不对。跟同学讨论了下,没有结果:@( 。我是把遗传算法拆成了两部分,用两个S函数来表示。第三个S函数是遗传算法的目标函数部分,第一个S函数是遗传算法余下的部分(复制 交叉 变异等),可以帮我看看么?

sigma665 发表于 2008-7-6 13:36

回复 9楼 的帖子

对遗传算法不了解

还是那个错误吗

ycr2008 发表于 2008-7-6 14:39

是的啊,还是一样的错误提示,呜呜呜

feynmand 发表于 2008-7-6 23:23

了解遗传算法,但是不知道s函数:@L

ycr2008 发表于 2008-7-7 15:37

我了解遗传算法,也研究了一下S函数,但把两者结合起来就出现问题了:@(

ycr2008 发表于 2008-7-8 12:24

大家帮忙看看,期待中...:handshake
页: [1]
查看完整版本: 【求助】关于遗传算法