主要内容

遗传算法的自定义输出功能

此示例显示了在遗传算法求解器中使用自定义输出函数GA。自定义输出功能执行以下任务:

  • 将人口的前两个组成部分的范围绘制为矩形。矩形的左侧和下侧位于x(1)x(2)右侧和上侧分别处于各自的最大值。

  • 当最佳功能值下降下方时,请停止迭代0.1(目标函数的最小值是0)。

  • 将整个人口记录在一个名称的变量中间隙史在您的MATLAB®工作区中每10代。

  • 将初始交叉分数修改为自定义值0.2,然后将其更新回默认值0.825代后。初始设置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.1s因此,您可以看到图的发展。

功能[state,options,optchanged] = gaoutfun(选项,状态,标志)执着的H1历史记录r optchanged = false;转变旗帜案子'在里面'H1 =图;ax = gca;ax.xlim = [0 21];ax.ylim = [0 21];l1 = min(state.Population(:,1));m1 = max(state.population(:,1));l2 = min(state.Population(:,2));m2 = max(state.population(:,2));r =矩形(ax,'位置',[L1 L2 M1-L1 M2-L2]);历史记录(:,:,1)= state.Population;分配('根据',,,,“扩展史”,历史);案子'iTer'%每10代更新历史记录。如果rem(state.generation,10)== 0 ss = size(历史记录,3);历史记录(:,:,ss+1)= state.Population;分配('根据',,,,“扩展史”,历史);结尾%找到最佳的目标函数,如果它很低,请停止。ibest = state.best(end);ibest = find(state.score == ibest,1,'最后的');bestx = state.population(ibest,:);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代后突变和交叉的分数。如果state.generation == 25个选项。杂交= 0.8;optchanged = true;结尾案子'完毕'%包括历史上的最终人口。ss = size(历史记录,3);历史记录(:,:,ss+1)= state.Population;分配('根据',,,,“扩展史”,历史);结尾

问题设置和解决方案

设置下部和上限。

lb = [1 1 -30 -30];ub = [20 20 70 70];

设置整数变量和变量数。

intcon = [1 2];nvar = 4;

设置调用自定义输出功能的选项,最初几乎没有交叉。

选项= optimoptions('ga',,,,'outputfcn',@gaoutfun,“跨界”,0.2);

对于可重复性,请设置随机数生成器。

RNG默认

设置目标函数并调用求解器。

fun = @gaintobj;[x,fval] = ga(fun,nvar,[],[],[],[],[],lb,ub,[],intcon,options)
在0.1优化终止下终止:y x = 6.0000 13.0000 9.4201 15.7052 fval = 0.0059

输出函数停止了求解器。

查看记录的历史记录的大小。

disp(大小(间隙史))
40 4 6

有40 x 4人口矩阵的六个记录(40个个体,每个人是4个元素行矢量)。

相关话题