【求助】关于遗传算法
大家帮忙看看这个程序,调试了很久找不到问题在哪里:(。这是我把遗传算法原有的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 编辑 ]
回复 楼主 的帖子
什么错误 老师刚刚叫开会,才看到。等下,我把错误报告发上来[ 本帖最后由 ycr2008 于 2008-7-5 21:22 编辑 ] 截图怎么贴不上来呢....:'(
运行中出现的错误报告
“Error evaluating parameter 'Size' in 'xin/S-Function2': Undefined function or variable 'Size'.”这是在运行仿真时出现的错误报告。S-Function2是这个遗传算法对应的S-函数模块,“xin”是搭建的系统的名字。错误报告说得比较笼统,或者我没有真正领会其中的意思,调试了几次都不行,谢谢你了。看到回帖是个意外的惊喜我搭建的模型
这是我搭建的模型,通过三个S-函数来实现仿真,中间一个是待优化的系统的S函数:[ 本帖最后由 ycr2008 于 2008-7-5 21:28 编辑 ] 建议不要用Size做为变量名 好的,我把Size改为别的参数试一下。bythe way ,小西,为什么Size不适合作变量名? 嗯,明白了。如果变量名是Size容易跟S函数里的Size混淆,是这个原因么?我把变量名修改了,还是不对。跟同学讨论了下,没有结果:@( 。我是把遗传算法拆成了两部分,用两个S函数来表示。第三个S函数是遗传算法的目标函数部分,第一个S函数是遗传算法余下的部分(复制 交叉 变异等),可以帮我看看么?
回复 9楼 的帖子
对遗传算法不了解还是那个错误吗 是的啊,还是一样的错误提示,呜呜呜 了解遗传算法,但是不知道s函数:@L 我了解遗传算法,也研究了一下S函数,但把两者结合起来就出现问题了:@( 大家帮忙看看,期待中...:handshake
页:
[1]