解决办法:Google了一下解决办法,就是说Matlab自带的Toolbox里面的是GA(另一个),所以我们用的gadst没用balabala…然后呢,当然就是去下载Sheffield的GATBX工具箱咯。然而,下好再配置好后测试一下,又报错:
打开文件夹看看:
纳尼 ????WTF!!!
虽然Matlab给出了解决办法(要更改文件扩展名,请将目录改变为文件的文件夹,键入:
movefile crtbp.M crtbp.m_bad; movefile crtbp.m_bad crtbp.m,然后改变目录返回。),但是这么多文件怎么改呢??好吧,我直接给改好后的文件吧。重新添加一下路径,然后让我们来测试一下吧!
目标是求 y = x.cos(5pi*x) + 3.5 在[-1,2.5]区间上的最大值。
目标函数文件: fun_sigv.m
% filename: fun_sigv.m
function y = fun_sigv(x)
y = x.*cos(5*pi*x) + 3.5;
end
算法实现脚本文件:yichuan.m
% filename: yichuan.m
% 遗传算法的测试
opt_minmax = 1; %目标优化类型:1 最大化, -1最小化
num_ppu = 50; %种群规模:个体个数
num_gen = 60; %最大遗传代数
len_ch = 20; %基因长度
gap = 0.9; % 代沟
sub = -1; %变量取值下限
up = 2.5; %变量取值上限
cd_gray = 1; % 是否选择格雷编码方式: 1 是; 0 否
sc_log = 0; % 是否选择对数标度: 1 是; 0 否
trace = zeros(num_gen, 2); % 遗传迭代性能跟踪器
fieldd = [len_ch; sub; up; 1-cd_gray; sc_log; 1; 1]; %区域描述器
chrom = crtbp(num_ppu, len_ch); % 初始化生成种群
k_gen = 0;
x = bs2rv(chrom, fieldd); % 翻译初始化种群为十进制
fun_v = fun_sigv(x); % 计算目标函数值
tx = sub:.01:up;
plot(tx, fun_sigv(tx)), xlabel('x'), ylabel('y'), title('一元函数优化结果'), hold on;
while k_gen < num_gen
fit_v = ranking(-opt_minmax*fun_v); % 计算目标函数的适应度(基于秩的适应度计算)
selchrom = select('rws', chrom, fit_v, gap); % 使用轮盘赌方式选择
selchrom = recombin('xovsp', selchrom); % 交叉(单点交叉)
selchrom = mut(selchrom); % 变异(离散变异)
x = bs2rv(selchrom, fieldd); % 子代个体翻译
fun_v_sel = fun_sigv(x); % 计算子代个体对应目标函数值
[chrom, fun_v] = reins(chrom, selchrom, 1, 1, opt_minmax*fun_v,...
opt_minmax*fun_v_sel); % 根据目标函数值将子代个体插入新群种
[f, id] = max(fun_v); % 寻找当前种群最优解
x = bs2rv(chrom, fieldd); %二进制串到实值的转换
f = f* opt_minmax;
fun_v = fun_v * opt_minmax;
k_gen = k_gen + 1;
trace(k_gen, 1) = f; % 矩阵的秩,即对角元素之和
trace(k_gen, 2) = mean(fun_v);
end
plot(x(id), f, 'r*'), figure, plot(trace(:, 1), 'r-*'), hold on;
plot(trace(:, 2), 'b-o'), legend('各子代种群最优解', '各子代种群平均值'),...
xlabel('迭代次数'), ylabel('目标函数优化情况'), title('一元函数优化过程');
在命令行里面输入yichuan.m
,就会出现结果:
问题终于解决了!