这个例子展示了遗传算法求解器中自定义输出函数的使用遗传算法
.自定义输出函数执行以下任务:
将人口的前两个组成部分的范围绘制为一个矩形。矩形的左边和下边的最小值为x (1)
和x (2)
的最大值,其右边和上边分别在最大值处。
当最佳函数值落在下面时停止迭代0.1
(目标函数的最小值为0
).
将整个填充记录在一个名为gapopulationhistory
在您的MATLAB®工作空间每10代。
将初始交叉部分修改为自定义值0.2
,然后将其更新为默认值0.8
25代。初始设置0.2
导致前几个迭代主要通过突变随机搜索。后期设置0.8
导致以下迭代主要通过现有人口成员的组合进行搜索。
目标函数是四维的x
它的前两个分量是整数值的。
函数[x(1)-6 x(2)-13];F = F + rastriginscn ([x(3)-3* x(4)-5*pi]);
自定义输出函数在初始化期间设置情节,并在迭代期间维护情节。的输出函数还暂停迭代0.1秒
所以你可以看到情节的发展。
函数[选项,optchanged] = gaoutfun(选项、状态标志)持续的H1 history r optchanged = false;开关国旗情况下“init”h1 =图;甘氨胆酸ax =;斧子。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];历史(::1)= state.Population;assignin (“基地”,“gapopulationhistory”、历史);情况下“通路”%每10代更新历史。如果rem(state.Generation,10) == 0 ss = size(history,3);历史(:,:,ss + 1) = state.Population;assignin (“基地”,“gapopulationhistory”、历史);结束找到最好的目标函数,如果低就停止。ib = state.Best(结束);ib =找到(状态。分数= = ib, 1“最后一次”);: bestx = state.Population (ib);bestf = gaintobj (bestx);如果Bestf <= 0.1状态。StopFlag =“y”;disp (“有低于0.1”)结束%更新图表。图(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个选项。CrossoverFraction = 0.8;optchanged = true;结束情况下“完成”%将最终人口纳入历史。党卫军=大小(历史,3);历史(:,:,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默认的
设定目标函数并调用求解器。
有趣= @gaintobj;[x, fval] = ga(有趣,据nvar ,[],[],[],[], 磅,乌兰巴托,[],intcon选项)
优化终止:y x = 6.0000 13.0000 9.4201 15.7052 fval = 0.0059
输出函数停止求解程序。
查看历史记录的大小。
disp(大小(gapopulationhistory))
40 4 6
有6条40 × 4种群矩阵记录(40个个体,每个4元素行向量)。