遗传算法自定义输出函数
这个例子展示了在遗传算法求解器中使用自定义输出函数遗传算法
.自定义输出函数执行以下任务:
将总体的前两个组成部分的范围绘制为矩形。矩形的左边和下边都在的最小值处
x (1)
而且x (2)
分别是,右边和上面都在各自的最大值。当最佳函数值低于以下值时停止迭代
0.1
(目标函数的最小值为0
).在一个名为
gapopulationhistory
在您的MATLAB®工作空间每10代。将初始交叉分数修改为自定义值
0.2
,然后更新回默认值0.8
25代之后。初始设置0.2
使前几次迭代主要通过突变随机搜索。后来的设定0.8
使以下迭代主要通过现有填充成员的组合进行搜索。
目标函数
目标函数是四维的x
它的前两个分量是整数。
函数F = gaintobj(x) F = rastriginsfcn([x(1)-6 x(2)-13]);F = F + rastriginsfcn([x(3)-3*pi x(4)-5*pi]);
输出函数
自定义输出函数在初始化期间设置图,并在迭代期间维护图。输出函数还暂停迭代0.1秒
所以你可以看到情节的发展。
函数[state,options,optchanged] = gaoutfun(options,state,flag)持续的H1历史记录r optchanged = false;开关国旗情况下“init”H1 =图;Ax = gca;斧子。XLim = [0 21];斧子。YLim = [0 21];l1 = min(state.Population(:,1));m1 = max(state.Population(:,1));l2 = min(state.Population(:,2));m2 = max(state.Population(:,2)); r = rectangle(ax,“位置”,[l1 l2 m1-l1 m2-l2]);history(:,:,1) = state.Population;assignin (“基地”,“gapopulationhistory”、历史);情况下“通路”每10代更新一次历史。如果rem(state.Generation,10) == 0 ss = size(history,3);history(:,:,ss+1) = state.Population;assignin (“基地”,“gapopulationhistory”、历史);结束找到最佳目标函数,如果它很低就停止。ibest = state.Best(结束);找到(状态)。分数== ibest,1,“最后一次”);bestx = state.Population(ibest,:);Bestf = gaintobj(bestx);如果Bestf <= 0.1状态。StopFlag =“y”;disp (“低于0.1”)结束%更新情节。figure(h1) l1 = min(state.Population(:,1));m1 = max(state.Population(:,1));l2 = min(state.Population(:,2));m2 = max(state.Population(:,2));r.Position = [l1 l2 m1-l1 m2-l2];暂停(0.1)25代后更新变异和交叉的比例。如果状态。生成== 25个选项。crosverfraction = 0.8;Optchanged = true;结束情况下“完成”在历史中包含最终的人口。Ss = size(历史,3);history(:,:,ss+1) = state.Population;assignin (“基地”,“gapopulationhistory”、历史);结束
问题设置和解决方案
设置下界和上界。
Lb = [1 1 -30 -30];Ub = [20 20 70 70];
设置整型变量和变量个数。
Intcon = [1 2];Nvar = 4;
设置选项来调用自定义输出函数,并在初始时很少交叉。
选项= optimoptions(“遗传算法”,“OutputFcn”@gaoutfun,“CrossoverFraction”, 0.2);
为了重现性,设置随机数发生器。
rng默认的
设置目标函数并调用求解器。
Fun = @gaintobj;[x, fval] = ga(有趣,据nvar ,[],[],[],[], 磅,乌兰巴托,[],intcon选项)
得到低于0.1优化终止:y x = 6.0000 13.0000 9.4201 15.7052 fval = 0.0059
输出函数停止求解器。
查看历史记录的大小。
disp(大小(gapopulationhistory))
40 4 6
40 × 4总体矩阵有6条记录(40个个体,每一个4元素行向量)。