声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1631|回复: 13

[综合讨论] 【求助】关于遗传算法

[复制链接]
发表于 2008-7-5 16:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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


  1. function [sys,x0,str,ts]=yichuan(t,x,u,flag);
  2. Size=80;
  3. G=100;
  4. CodeL=10;
  5. umax=2.048;
  6. umin=-2.048;
  7. switch flag,
  8.        case 0,    %初始化
  9.                 [sys,x0,str,ts]=mdlInitializeSizes;
  10.        case 2,   %更新模块离散状态
  11.                 sys=mdlUpdate(t,x,u);         
  12.        case 3,   %计算输出向量
  13.                 sys=mdlOutputs(t,x,u);
  14.        case 9,   %结束仿真
  15.                 sys=mdlTerminate(t,x,u);
  16.     case {1,4}
  17.         sys=[];
  18.     otherwise   %无效输入处理
  19.         error(['Unhandled flag=',num2str(flag)]);
  20. end   
  21. %**********************************************************************
  22. function[sys,x0,str,ts]=mdlInitializeSizes()
  23. sizes=simsizes;
  24. sizes.NumContStates=0;
  25. sizes.NumDiscStates=0;
  26. sizes.NumOutputs=2;
  27. sizes.NumInputs=1;
  28. sizes.DirFeedthrough=0;
  29. sizes.NumSampleTimes=1;
  30. sys=simsizes(sizes);
  31. x0=[];      %无状态量
  32. str=[];     %str为空矩阵
  33. ts=[0 0];
  34. %**********************************************************************
  35. function sys=mdlUpdate(t,x,u);
  36. sys=[];
  37. E=round(rand(Size,2*CodeL));
  38. %****** Step 1 : Evaluate BestJ ******
  39. BestJ(k)=min(u);          % 计算本代中的,某个体达到的最小目标值
  40. fi=1/u;                          %Fitness Function    适应度
  41. [Oderfi,Indexfi]=sort(fi);     %Arranging fi small to bigger 从小到大排序,
  42.                                % 排序结果:Oderfi 原有下标;Indexfi
  43. Bestfi=Oderfi(Size);           %Let Bestfi=max(fi)   最大适应度在最后一个位置
  44. BestS=E(Indexfi(Size),:);      %Let BestS=E(m), m is the Indexfi belong to max(fi)
  45.                                % 通过序号,取出最优个体
  46. bfi(k)=Bestfi;                 % 记录本代的最大适应度
  47. %****** Step 2 : Select and Reproduct Operation******  复制
  48.    fi_sum=sum(u);                 % 本代各个体适应度代数和
  49.    fi_Size=(Oderfi/fi_sum)*Size;   % 适应度比例=个体适应度/平均适应度
  50.    
  51.    fi_S=floor(fi_Size);        %Selecting Bigger fi value  选较大的个体个数
  52.    
  53.    kk=1;
  54.    for i=1:1:Size
  55.       for j=1:1:fi_S(i)        %Select and Reproduce 选择复制适应度大的个体
  56.        TempE(kk,:)=E(Indexfi(i),:);                   % 复制
  57.          kk=kk+1;              %kk is used to reproduce
  58.       end
  59.    end
  60.    
  61. %************ Step 3 : Crossover Operation ************ 交叉
  62. pc=0.60;                          % 交叉概率
  63. n=ceil(20*rand);                  % 随机数0-20, 要交叉的BIT数随机发生
  64. for i=1:2:(Size-1)               
  65.     temp=rand;                  % 产生一个随机数来决定是否发生交叉
  66.     if pc>temp                  % Crossover Condition 交叉条件:给定交叉概率>随机数
  67.     for j=n:1:20
  68.         TempE(i,j)=E(i+1,j);      % 第i与第i+1个体交叉,交叉位数从 n--20,只变后面部分
  69.         TempE(i+1,j)=E(i,j);
  70.     end
  71.     end
  72. end
  73. TempE(Size,:)=BestS;
  74. E=TempE;
  75.    
  76. %************ Step 4: Mutation Operation **************变异
  77. %pm=0.001;
  78. %pm=0.001-[1:1:Size]*(0.001)/Size; %Bigger fi, smaller Pm
  79. %pm=0.0;    %No mutation
  80. pm=0.1;     %Big mutation         % 变异概率
  81.    for i=1:1:Size
  82.       for j=1:1:2*CodeL
  83.          temp=rand;               % 产生一个随机数来决定是否发生变异
  84.          if pm>temp               %Mutation Condition 变异条件:给定变异概率>随机数
  85.             if TempE(i,j)==0      
  86.                TempE(i,j)=1;      % 0变1
  87.             else
  88.                TempE(i,j)=0;      % 1变0
  89.             end
  90.         end
  91.       end
  92.    end
  93.    
  94. %Guarantee TempPop(30,:) is the code belong to the best individual(max(fi))
  95. TempE(Size,:)=BestS;
  96. E=TempE;
  97. end
  98. %**********************************************************************
  99. function sys=mdlOutputs(t,x,u);
  100. sys=[x(1),x(2)];  %(有疑问)
  101. for k=1:1:G
  102. time(k)=k;                    % 记录优化代顺序数
  103. for s=1:1:Size
  104. m=E(s,:);                     % 取1个个体,有20比特
  105. y1=0;y2=0;
  106. %Uncoding
  107. m1=m(1:1:CodeL);              % 取个体前10比特
  108. for i=1:1:CodeL
  109.    y1=y1+m1(i)*2^(i-1);       % 计算16进制值,2进制-->16进制
  110. end
  111. x1=(umax-umin)*y1/1023+umin;  % 将码转换成实际值X1
  112. m2=m(CodeL+1:1:2*CodeL);      % 取个体后10比特
  113. for i=1:1:CodeL
  114.    y2=y2+m2(i)*2^(i-1);       % 计算16进制值,2进制-->16进制
  115. end
  116. x2=(umax-umin)*y2/1023+umin;    % 将码转换成实际值X2
  117. %**********************************************************************
  118. function sys=mdlTerminate(t,x,u);
  119. sys=[];
复制代码

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

yichuan.m

4.13 KB, 下载次数: 11

回复
分享到:

使用道具 举报

发表于 2008-7-5 16:58 | 显示全部楼层

回复 楼主 的帖子

什么错误
 楼主| 发表于 2008-7-5 20:40 | 显示全部楼层
老师刚刚叫开会,才看到。等下,我把错误报告发上来

[ 本帖最后由 ycr2008 于 2008-7-5 21:22 编辑 ]
 楼主| 发表于 2008-7-5 20:43 | 显示全部楼层
截图怎么贴不上来呢....:'(
 楼主| 发表于 2008-7-5 21:10 | 显示全部楼层

运行中出现的错误报告

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

我搭建的模型

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

[ 本帖最后由 ycr2008 于 2008-7-5 21:28 编辑 ]
未命名.jpg
发表于 2008-7-5 22:31 | 显示全部楼层
建议不要用Size做为变量名
 楼主| 发表于 2008-7-6 10:52 | 显示全部楼层
好的,我把Size改为别的参数试一下。by  the way ,小西,为什么Size不适合作变量名?
 楼主| 发表于 2008-7-6 11:31 | 显示全部楼层
嗯,明白了。如果变量名是Size容易跟S函数里的Size混淆,是这个原因么?我把变量名修改了,还是不对。跟同学讨论了下,没有结果:@( 。我是把遗传算法拆成了两部分,用两个S函数来表示。第三个S函数是遗传算法的目标函数部分,第一个S函数是遗传算法余下的部分(复制 交叉 变异等),可以帮我看看么?
发表于 2008-7-6 13:36 | 显示全部楼层

回复 9楼 的帖子

对遗传算法不了解

还是那个错误吗
 楼主| 发表于 2008-7-6 14:39 | 显示全部楼层
是的啊,还是一样的错误提示,呜呜呜
发表于 2008-7-6 23:23 | 显示全部楼层
了解遗传算法,但是不知道s函数:@L
 楼主| 发表于 2008-7-7 15:37 | 显示全部楼层
我了解遗传算法,也研究了一下S函数,但把两者结合起来就出现问题了:@(
 楼主| 发表于 2008-7-8 12:24 | 显示全部楼层
大家帮忙看看,期待中...:handshake
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-18 03:03 , Processed in 0.066746 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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