fengjohnheqiang 发表于 2009-3-25 16:43:42

m函数simulink以及遗传算法混用的问题

下面一例是matlab帮助文档中关于遗传算法的一个例子那个运算
%函数
function y = simple_fitness(x)
y = 100 * (x(1)^2 - x(2)) ^2 + (1 - x(1))^2;
%函数
%脚本
FitnessFunction = @simple_fitness;
numberOfVariables = 2;
= ga(FitnessFunction,numberOfVariables)
%脚本
我用函数在simulink中建立模型

存储为my_sim_2名称
编写函数如下
function y=my_sim_m(x)
global x1 ;
global x2;
assignin('base','x1',x(1));
assignin('base','x2',x(2));
sim('my_sim_2');
assignin('base','zz',zz);
y=zz;
再编写脚本调用该函数用遗传算法进行相关计算如下:
FitnessFunction = @my_sim_m;
numberOfVariables = 2;
= ga(FitnessFunction,numberOfVariables);
结果运算出错!
错如下:
??? Error using ==> gads\private\makeState
GA cannot continue because user supplied fitness function failed with the following error:
Error using ==> sim
--> Invalid matrix-format variable specified as workspace input in 'my_sim_2/From Workspace'. The matrix must have two dimensions and at least two columns. Complex signals of any data type and non-double real signals must be in structure format. The first column must contain time values and the remaining columns the data values.
--> Invalid matrix-format variable specified as workspace input in 'my_sim_2/From Workspace1'. The matrix must have two dimensions and at least two columns. Complex signals of any data type and non-double real signals must be in structure format. The first column must contain time values and the remaining columns the data values.
Error in ==> gads\private\gaunc at 44
state = makeState(GenomeLength,FitnessFcn,Iterate,output.problemtype,options);
Error in ==> ga at 384
       = gaunc(FitnessFcn,GenomeLength, ...



请高手给与指点,不知道是错在哪个地方,我认真检查了,原本以为x1,x2两个变量在m文件与simulink间不能顺利传递值,这一疑问我通过一个更简单的例子已经得到解决,由于接触遗传算法不久,并且我是想通过遗传算法对我simulink中的的相关参数进行优化求解,但遗传算法又必须有适应度函数,所以我就想到这样做!请高手给与指点哈!期待!!!!!

kokyo52 发表于 2009-3-25 19:56:41

我觉得这个和遗传算法可能没有什么关系吧,“The matrix must have two dimensions and at least two columns. Complex signals of any data type and non-double real signals must be in structure format. The first column must contain time values and the remaining columns the data values.”是说你的矩阵维数、数据类型不对,楼主不妨不用遗传算法,直接拿一个函数这样调用simulink看能不能通过。
如果还不行,拿模型和程序来~~
ps:我看你的simulink模型似乎也并不复杂,应该可以写函数计算而不必要仿真,这样ga起来也会快很多

fengjohnheqiang 发表于 2009-3-26 09:24:56


谢谢kokyo52的提醒,问题出在fromworkspace要求的数据必须是2维,且至少两列的数据,由于要保证x1,x2须为标量,所以,我用constant模块,然后设置其值分别为x1,x2,这样能够保证simulink模型能够运行,但simulink输出的变量,zz 现在为一个向量,然而ga()算法要求的函数值,需为标量,模型和相关函数已经上传。请各位大侠指点

下面是应用遗传算法求解的代码
FitnessFunction = @my_sim_m;
numberOfVariables = 2;
= ga(FitnessFunction,numberOfVariables);

kokyo52 发表于 2009-3-26 23:33:26

整个仿真已无问题
楼主的意思是要仿真zz的最后一个值么?

fengjohnheqiang 发表于 2009-3-27 08:47:52

谢谢kokyo52版主的关心,我的仿真也已经几乎没有问题,要让zz在每次通过ga()调用仿真后返回一个值,确实有问题,我怎么设置,它至少都带了两个值,所以在写function时,让函数返回zz(2)的值,所以也基本上解决!再次感谢
顺便再请教个问题,如果要让每次仿真完之后,workspace中zz只有一个数,该怎么设置呢?

kokyo52 发表于 2009-3-27 13:31:24

zz是随着你的仿真时间不断变化的一串数字,它显示了你整个仿真过程中zz(t)的变化。因此,整个仿真过程中zz(t)被计算了多少次,就会有多少个zz(t)被保存下来而成为一个向量zz。
由于你现在的模型只是一些+-*/运算,不涉及时间t,因此zz是一串不变的数字,既每一步仿真都计算出同一个zz(t)来,你调用任何一个zz都是一样的。
所以建议楼主最好拿m文件编写求zz的函数,而没有必要仿真~~

hitshuang 发表于 2009-3-27 17:15:36

学习了

yangzhihust 发表于 2009-9-28 04:21:44

zz是向量,先用=size(zz)确定zz的大小,然后取出你想要的最后一个值

john152 发表于 2010-3-9 11:31:38

好帖子!很有帮助

zhuchao1234 发表于 2011-6-5 21:26:15

真是好帖子,我有好多问题
页: [1]
查看完整版本: m函数simulink以及遗传算法混用的问题