sjhui1984 发表于 2008-7-12 10:54:51

matlab遗传算法工具箱中x=sol(1);是啥东西?总出错

小弟刚刚学习MATLAB遗传算法,运行下面的程序:
   function=fitness(sol,options)
       x=sol(1);
       eval=x+10*sin(5*x)+7*cos(4*x);
   %把上述函数存储为fitness.m文件并放在工作目录下
   
   initPop=initializega(10,,'fitness');%生成初始种群,大小为10
   =ga(,'fitness',[],initPop,,'maxGenTerm',25,'normGeomSelect',...
   ,['arithXover'],,'nonUnifMutation',) %25次遗传迭代

出错信息如下:
??? Input argument "sol" is undefined.
Error in ==> opt at 2
x=sol(1);

求高人指点,Matlab遗传算法工具箱是不是需要自己下载啊?我用的matlab7,怎么会出错呢?????????

jinzi2006 发表于 2008-7-14 18:51:18

遗传算法源程序:(1)
genetic.mfunction = genetic(f,x0,l,u,Np,Nb,Pc,Pm,eta,kmax)% 基因算法求f(x)最小值 s.t. l <= x <= u%f为待求函数,x0初值,l,u上下限,Np群体大小,Nb每一个变量的基因值(二进制数)%Pc交叉概率,Pm变异概率,eta学习率,kmax最大迭代次数N = length(x0);%%%%%确定各变量缺省值if nargin < 10
kmax = 100; %最大迭代次数缺省为100endif nargin < 9|eta > 1|eta <= 0
eta = 1;
%学习率eta,(0 < eta < 1)endif nargin < 8
Pm = 0.01; %变异概率缺省0.01endif nargin < 7
Pc = 0.5; %交叉概率缺省0.5endif nargin < 6
Nb = 8*ones(1,N);%每一变量的基因值(二进制数)endif nargin < 5
Np = 10; %群体大小(染色体数)end%%%%%生成初始群体NNb = sum(Nb);xo = x0(:)'; l = l(:)'; u = u(:)';fo = feval(f,xo);X(1,:) = xo;for n = 2:Np
X(n,:) = l + rand(size(x0)).*(u - l); %初始群体随机数组endP = gen_encode(X,Nb,l,u);
%编码为2进制字串for k = 1:kmax
X = gen_decode(P,Nb,l,u);
%解码为10进制数
for n = 1:Np
fX(n) = feval(f,X(n,:));
end
= min(fX);
%选择最适合的,函数值最小的
if fxb < fo
fo = fxb;
xo = X(nb,:);
end
fX1 = max(fxb) - fX; %将函数值转化为非负的适合度值
fXm = fX1(nb);
if fXm < eps
%如果所有的染色体值相同,终止程序
return;
end
%%%%%复制下一代
for n = 1:Np
X(n,:) = X(n,:) + eta*(fXm - fX1(n))/fXm*(X(nb,:) - X(n,:));%复制准则
end
P = gen_encode(X,Nb,l,u); %对下一代染色体编码
%%%%%%随机配对/交叉得新的染色体数组
is = shuffle();
for n = 1:2:Np - 1
if rand < Pc
P(is(n:n + 1),:) = crossover(P(is(n:n + 1),:),Nb);
end
end
%%%%%%变异
P = mutation(P,Nb,Pm);end

jinzi2006 发表于 2008-7-14 18:51:43

(1)
gen_encode.mfunction P = gen_encode(X,Nb,l,u)%将群体X的状态编码为二进制数组PNp=size(X,1); %群体大小N = length(Nb); %变量(状态)维数for n = 1:Np
b2 = 0;
for m = 1:N
b1 = b2+1;
b2 = b2 + Nb(m);
Xnm =(2^Nb(m)- 1)*(X(n,m) - l(m))/(u(m) - l(m)); %编码方程
P(n,b1:b2) = dec2bin(Xnm,Nb(m)); %10进制转换为2进制
endend(2)
gen_decode.mfunction X = gen_decode(P,Nb,l,u)% 将二进制数组P解码为群体X的状态矩阵Np = size(P,1); %群体大小N = length(Nb); %变量维数for n = 1:Np
b2 = 0;
for m = 1:N
b1 = b2 + 1;
b2 = b1 + Nb(m) - 1;
X(n,m) = bin2dec(P(n,b1:b2))*(u(m) - l(m))/(2^Nb(m) - 1) + l(m); %解码方程
endend(3)
crossover.mfunction chrms2 = crossover(chrms2,Nb)%两个染色体间的交叉Nbb = length(Nb);b2 = 0;for m = 1:Nbb
b1 = b2 + 1;
bi = b1 + mod(floor(rand*Nb(m)),Nb(m));
b2 = b2 + Nb(m);
tmp = chrms2(1,bi:b2);
chrms2(1,bi:b2) = chrms2(2,bi:b2);
chrms2(2,bi:b2) = tmp;end(4)
mutation.mfunction P = mutation(P,Nb,Pm)%变异Nbb = length(Nb);for n = 1:size(P,1)
b2 = 0;
for m = 1:Nbb
if rand < Pm
b1 = b2 + 1;
bi = b1 + mod(floor(rand*Nb(m)),Nb(m));
b2 = b2 + Nb(m);
P(n,bi) = ~P(n,bi);
end
endend(5)
shuffle.mfunction is = shuffle(is)%打乱染色体次序N = length(is);for n = N:-1:2
in = ceil(rand*(n - 1));
tmp = is(in);is(in) = is(n); is(n) = tmp; %将第n个元素与第in个元素交换end

jinzi2006 发表于 2008-7-14 18:52:02

解:在MATLAB中编写脚本文件:
f = inline('x(1)^4-16*x(1)^2-5*x(1)*x(2)+x(2)^4-16*x(2)^2-5*x(2)','x');
l = [-5 -5]; %下限
u = ; %上限
x0 = ;
Np = 30; %群体大小
Nb = ; %代表每个变量的二进制位数
Pc = 0.5;%交叉概率
Pm = 0.01; %变异概率
eta = 0.8;   %学习率
kmax = 200; %最大迭代次数
=fminsearch(f,x0)
= genetic(f,x0,l,u,Np,Nb,Pc,Pm,eta,kmax)

jinzi2006 发表于 2008-7-14 18:54:00

运行结果:
xos =
3.0453
3.1031fos =
-186.4878xo_gen =
3.0830
2.9365fo_gen =
-185.2958

hgh7735 发表于 2009-5-14 22:14:46

好像不是正面回答吧

identify1100 发表于 2009-6-2 10:11:35

不应该直接运行这个.m文件,是要运行你的GA算法调用你的函数

hgh7735 发表于 2009-6-2 15:22:51

initPop=initializega(10,,'fitness');%生成初始种群,大小为10
   =ga(,'fitness',[],initPop,,'maxGenTerm',25,'normGeomSelect',...
   ,['arithXover'],,'nonUnifMutation',) %25次遗传迭代
这堆东西在工具箱里怎么调用 啊
遗传算法与直接搜索工具箱貌似没那么些啊

cjj5405 发表于 2009-6-3 09:21:59

从网上下一个GATO的工具箱就能了,还有添加nitializega.m文件才能用

hgh7735 发表于 2009-6-3 17:38:08

运行出现错误
??? Maximum recursion limit of 500 reached. Use set(0,'RecursionLimit',N)
to change the limit.Be aware that exceeding your available stack space can
crash MATLAB and/or your computer.

Error in ==> initializega at 6
%    columns equal to the number of rows in bounds plus 1 for
是 initializega文件有问题吗,里面的源代码是我从网上下的

hgh7735 发表于 2009-6-4 16:38:02

是不是版本兼容问题啊
我用的是7.1
和gaot有没有冲突 啊
大虾们有这方面经验吗

messenger 发表于 2009-6-4 19:48:19

11# hgh7735

好象不是,是让你设置'RecursionLimit'参数

hgh7735 发表于 2009-6-4 23:09:00

12# messenger
RecursionLimit'参数是什么东西啊
感觉没有这么复杂吧
我就照eval = x + 10 * sin(5 * x) + 7 * cos(4 * x);这个例子写的,
这是个最普遍的例子,好多论文和书都是拿这个当范例。
我是7.1的版本(里面已经有gads)还装了个gaot。总感觉两者有点问题
版主有的是那个版本的

messenger 发表于 2009-6-4 23:44:08

13# hgh7735

gaot只有for matlab 5版本的,其他版本都有兼容问题,建议用gads

hgh7735 发表于 2009-6-5 18:13:34

那gatbs的兼容问题呢?
貌似gads用的人比较少,除了雷英杰的书之外,其他的资料较少

messenger 发表于 2009-6-5 18:33:49

gads没听说有兼容问题,至少7.0是兼容的

看看help吧
页: [1]
查看完整版本: matlab遗传算法工具箱中x=sol(1);是啥东西?总出错