找回密码
 注册
Simdroid-非首页
查看: 209|回复: 15

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

[复制链接]
发表于 2008-7-12 10:54:51 | 显示全部楼层 |阅读模式 来自 广西桂林
小弟刚刚学习MATLAB遗传算法,运行下面的程序:
     function[sol,eval]=fitness(sol,options)
       x=sol(1);
       eval=x+10*sin(5*x)+7*cos(4*x);
   %把上述函数存储为fitness.m文件并放在工作目录下
   
   initPop=initializega(10,[0 9],'fitness');%生成初始种群,大小为10
   [x endPop,bPop,trace]=ga([0 9],'fitness',[],initPop,[1e-6 1 1],'maxGenTerm',25,'normGeomSelect',...
     [0.08],['arithXover'],[2],'nonUnifMutation',[2 25 3]) %25次遗传迭代

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


求高人指点,Matlab遗传算法工具箱是不是需要自己下载啊?我用的matlab7,怎么会出错呢?????????
发表于 2008-7-14 18:51:18 | 显示全部楼层 来自 黑龙江大庆
Simdroid开发平台
遗传算法
源程序:
(1)
genetic.m
function [xo,fo] = genetic(f,x0,l,u,Np,Nb,Pc,Pm,eta,kmax)
% 基因算法求f(x)最小值 s.t. l <= x <= u
%f为待求函数,x0初值,lu上下限,Np群体大小,Nb每一个变量的基因值(二进制数)
%Pc交叉概率,Pm变异概率,eta学习率,kmax最大迭代次数
N = length(x0);
%%%%%确定各变量缺省值
if nargin < 10

kmax = 100; %最大迭代次数缺省为100
end
if nargin < 9|eta > 1|eta <= 0

eta = 1;
%学习率eta,(0 < eta < 1)
end
if nargin < 8

Pm = 0.01; %变异概率缺省0.01
end
if nargin < 7

Pc = 0.5; %交叉概率缺省0.5
end
if nargin < 6

Nb = 8*ones(1,N);%每一变量的基因值(二进制数)
end
if 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); %初始群体随机数组
end
P = 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

[fxb,nb] = 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([1:Np]);

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
回复 不支持

使用道具 举报

发表于 2008-7-14 18:51:43 | 显示全部楼层 来自 黑龙江大庆
(1)
gen_encode.m
function P = gen_encode(X,Nb,l,u)
%将群体X的状态编码为二进制数组P
Np=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进制

end
end
(2)
gen_decode.m
function 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); %解码方程

end
end
(3)
crossover.m
function 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.m
function 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

end
end
(5)
shuffle.m
function 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
回复 不支持

使用道具 举报

发表于 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 = [5 5]; %上限
x0 = [0 0];
Np = 30; %群体大小
Nb = [12 12]; %代表每个变量的二进制位数
Pc = 0.5;  %交叉概率
Pm = 0.01; %变异概率
eta = 0.8;   %学习率
kmax = 200; %最大迭代次数
[xos,fos]=fminsearch(f,x0)
[xo_gen,fo_gen] = genetic(f,x0,l,u,Np,Nb,Pc,Pm,eta,kmax)
回复 不支持

使用道具 举报

发表于 2008-7-14 18:54:00 | 显示全部楼层 来自 黑龙江大庆
运行结果:
xos =

3.0453
3.1031
fos =

-186.4878
xo_gen =

3.0830
2.9365
fo_gen =

-185.2958
回复 不支持

使用道具 举报

发表于 2009-5-14 22:14:46 | 显示全部楼层 来自 河北石家庄
好像不是正面回答吧
回复 不支持

使用道具 举报

发表于 2009-6-2 10:11:35 | 显示全部楼层 来自 上海
不应该直接运行这个.m文件,是要运行你的GA算法调用你的函数

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2009-6-2 15:22:51 | 显示全部楼层 来自 河北石家庄
initPop=initializega(10,[0 9],'fitness');%生成初始种群,大小为10
   [x endPop,bPop,trace]=ga([0 9],'fitness',[],initPop,[1e-6 1 1],'maxGenTerm',25,'normGeomSelect',...
     [0.08],['arithXover'],[2],'nonUnifMutation',[2 25 3]) %25次遗传迭代
这堆东西在工具箱里怎么调用 啊
遗传算法与直接搜索工具箱貌似没那么些啊
回复 不支持

使用道具 举报

发表于 2009-6-3 09:21:59 | 显示全部楼层 来自 陕西西安
从网上下一个GATO的工具箱就能了,还有添加nitializega.m文件才能用
回复 不支持

使用道具 举报

发表于 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文件有问题吗,里面的源代码是我从网上下的
回复 不支持

使用道具 举报

发表于 2009-6-4 16:38:02 | 显示全部楼层 来自 河北石家庄
是不是版本兼容问题啊
我用的是7.1
和gaot有没有冲突 啊
大虾们有这方面经验吗
回复 不支持

使用道具 举报

发表于 2009-6-4 19:48:19 | 显示全部楼层 来自 浙江杭州
11# hgh7735

好象不是,是让你设置'RecursionLimit'参数
回复 不支持

使用道具 举报

发表于 2009-6-4 23:09:00 | 显示全部楼层 来自 河北石家庄
12# messenger
RecursionLimit'参数是什么东西啊
感觉没有这么复杂吧
我就照eval = x + 10 * sin(5 * x) + 7 * cos(4 * x);这个例子写的,
这是个最普遍的例子,好多论文和书都是拿这个当范例。
我是7.1的版本(里面已经有gads)还装了个gaot。总感觉两者有点问题
版主有的是那个版本的
回复 不支持

使用道具 举报

发表于 2009-6-4 23:44:08 | 显示全部楼层 来自 浙江杭州
13# hgh7735

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

使用道具 举报

发表于 2009-6-5 18:13:34 | 显示全部楼层 来自 河北石家庄
那gatbs的兼容问题呢?
貌似gads用的人比较少,除了雷英杰的书之外,其他的资料较少
回复 不支持

使用道具 举报

发表于 2009-6-5 18:33:49 | 显示全部楼层 来自 浙江杭州
gads没听说有兼容问题,至少7.0是兼容的

看看help吧
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-9-28 07:20 , Processed in 0.059319 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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