|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
大家帮忙看看这个程序,调试了很久找不到问题在哪里:( 。这是我把遗传算法原有的M程序改写了一下用S函数来实现,原有程序是可以运行的,改成S函数就出错了
-
- function [sys,x0,str,ts]=yichuan(t,x,u,flag);
- Size=80;
- G=100;
- CodeL=10;
- umax=2.048;
- umin=-2.048;
- switch flag,
- case 0, %初始化
- [sys,x0,str,ts]=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[sys,x0,str,ts]=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=[0 0];
- %**********************************************************************
- 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 适应度
- [Oderfi,Indexfi]=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-[1:1:Size]*(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=[x(1),x(2)]; %(有疑问)
- 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 编辑 ] |
|