这是一本书上所给的MATLAB源代码,目的是利用标准遗传算法求函数极值,程序如下NP = 50;L = 20 ;Pc = 0.8 ;Pm = 0.1;G = 100 ;Xs = 10;Xx = 0;f = randi(NP,L);%%%%%%%%%%%%%%%循环%%%%%%%%%%for k = 1:Gfor i = 1 : NPU = f(i,:);m = 0;for j = 1:Lm = U(j)*2^(j-1)+m;endx(i) = Xx + m *(Xs - Xx)/(2^L - 1);Fit(i) = func1(x(i));endmaxFit = max(Fit);minFit = min(Fit);rr = find(Fit == maxFit);fBest = f(rr(1,1),:);xBest = x(rr(1,1));Fit = (Fit - minFit)/(maxFit - minFit);%%%%%%%%Copy%%%%%sum_Fit = sum(Fit);fitvalue = Fit./sum_Fit;fitvalue = cumsum(fitvalue);ms = sort(rand(NP,1));fiti = 1;newi = 1;while newi <= NPif (ms(newi)) < fitvalue(fiti)nf(newi,:) = f(fiti,:);newi = newi + 1;elsefiti = fiti + 1;endend%%%%%%%%%%交叉%%%%%%%for i = 1 : 2 : NPp = rand;if p < Pcq = randin(1,L);for j = 1 : Lif q(j) == 1temp = nf(i+1,j);nf(i+1,j)=nf(i,j);nf(i,j) = temp;endendendend%%%%%%%%%变异%%%%%%i = 1;while i <= round(NP*Pc)h = randi(1,1,[1,NP]);for j = 1 : round(L*Pc)g = randi(1,1,[1,L]);nf(h,g) =~ nf(h,g);endi = i + 1;endf = nf;f(1,:) = fBest;trace(k) = maxFit;endxBEst;figureplot(trace)xlabel('迭代次数')ylabel('目标函数值')title('适应度进化曲线')%%%%%%适应度函数%%%function result = func1(x)fit = x + 10*sin(5*x) + 7 * cos(4*x);result = fit;end问题:func1并没有定义 ,为什么可以在后面直接使用这个代码是要直接写在Command window里 还是建立.m文件写在里面,如何运行?程序源代码就是上面这些 ,应该如何更改才能运行 ,希望大牛们能给初学者一点指导,谢谢~
3 回答

慕沐林林
TA贡献2016条经验 获得超9个赞
这个问题我也遇到,这本书我也有,解决如下,看代码的最后部分,是一个适应度函数,这个函数需要自己定义下,采用能,报错就是这个问题,
1、首先把
function result =func1(x)
fit=x+10*sin(5*x)+7*cos(4*x);
result=fit;
end
这段代码写入M文件,然后放在你运行代码的工作目录中,注意名字不要改,还用func1
2、再运行代码全部代码,就可以了,还可能存在警告randint函数的问题,不用改成randi,randi是不能产生你需要的二进制染色体编码的。
- 3 回答
- 0 关注
- 701 浏览
添加回答
举报
0/150
提交
取消