自定义输出函数的遗传算法
这个例子显示使用一个自定义的输出函数的遗传算法求解器进行求解遗传算法
。自定义输出函数执行以下任务:
情节的范围前两个组件的人口作为一个矩形。左边和低的矩形的最小值
x (1)
和x (2)
分别和右和上双方都在各自的最大值。时停止迭代函数值低于最佳
0.1
(目标函数的最小值0
)。记录整个人口在一个变量命名
gapopulationhistory
在MATLAB®工作区每10代。修改初始交叉部分自定义值
0.2
,然后更新重设为默认值0.8
25代。的初始设置0.2
使前几个迭代搜索主要是通过随机突变。后来的设置0.8
导致下面的迭代搜索主要是通过组合现有人口的成员。
目标函数
目标函数是四维的x
前两个组件的整数值。
函数f = gaintobj f (x) = rastriginsfcn ([x (1) 6 (2) -13]);f = f + rastriginsfcn ([x(3) 3 * *ππx (4) 5));
输出函数
自定义输出函数在初始化期间设置情节,在迭代和维护情节。也暂停迭代的输出函数0.1秒
所以你可以看到的情节发展。
函数[选项,optchanged] = gaoutfun(选项、状态标志)持续的h1 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代。如果快速眼动(state.Generation 10) = = 0党卫军=大小(历史,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。位置= [l1 l2 m1-l1 m2-l2];暂停(0.1)%更新变异和交叉25代之后的分数。如果状态。一代= = 25选项。CrossoverFraction = 0.8;optchanged = true;结束情况下“完成”%包括历史上最后一个人口。党卫军=大小(历史,3);历史(:,:,ss + 1) = state.Population;assignin (“基地”,“gapopulationhistory”、历史);结束
问题设置和解决方案
设置上下界限。
磅= [1 1 -30 -30];乌兰巴托= (20 70 70);
设置整型变量和变量的数量。
intcon = (1 - 2);据nvar = 4;
设置选项来调用自定义输出函数,最初没有交叉。
选择= optimoptions (“遗传算法”,“OutputFcn”@gaoutfun,“CrossoverFraction”,0.2);
再现性,设置随机数发生器。
rng默认的
设置目标函数和调用解算器。
有趣= @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-by-4人口的矩阵(40个人,每个第4单元行向量)。