主要内容

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

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

  • 将群体的前两个组成部分的范围绘制为矩形。矩形的左侧和下侧是最小的x(1)x(2)分别,右侧和上侧处于相应的最大值。

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

  • 记录命名的变量中的整个人口GapopulationHistory.每10代Matlab®工作区中。

  • 将初始交叉分数修改为自定义值0.2,然后将其更新回默认值0.825代后。初始设置0.2使得第一个迭代主要通过突变进行随机搜索。后来的设置0.8导致以下迭代主要通过现有人口成员的组合搜索。

目标函数

目标函数用于四维X谁的前两个组件是整数值。

功能f = gaintobj(x)f = restriginsfcn([x(1)-6 x(2)-13]);f = f + restriginsfcn([x(3)-3 * pi x(4)-5 * pi]);

输出功能

自定义输出函数在初始化期间设置绘图,并在迭代期间维护绘图。输出功能也暂停了迭代0.1s.所以你可以看到它的剧情。

功能[状态,选项,OptChanged] = Gaoutfun(选项,状态,标志)执着的H1历史R OPTCHANGED = FALSE;转变旗帜案件'在里面'H1 =数字;斧头= GCA;ax.xlim = [021];ax.ylim = [021];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]);历史(:,:,1)= state.population;Assivein('根据''gapopulationhistory',历史);案件'iter'%每10代更新历史记录。如果REM(state.generation,10)== 0 ss =大小(历史,3);历史(:,:,ss + 1)= state.population;Assivein('根据''gapopulationhistory',历史);结尾%找到最佳的客观函数,如果它很低,则停止。ibest = state.best(结束);ibest = find(state.score == ibest,1,'最后的');bestx = state.population(ibest,:);bestf = gaintobj(bestx);如果bestf <= 0.1 state.stopflag ='是';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选项.CrossoverFraction = 0.8;OptChanged = True;结尾案件'完毕'%包括历史上的最终群体。SS =大小(历史,3);历史(:,:,ss + 1)= state.population;Assivein('根据''gapopulationhistory',历史);结尾

问题设置和解决方案

设置较低和上限。

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

设置整数变量和变量数。

Intcon = [1 2];nvar = 4;

设置选项以调用自定义输出函数,最初有很少的交叉。

选项= Optimoptions('Ga''outputfcn',@ gaoutfun,'Crossoprofaction',0.2);

为了再现性,请设置随机数发生器。

RNG(10)

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

有趣= @gaintobj;[,fval] = ga(fun,nvar,[],[],[],[],LB,UB,[],INTCON,选项)
得到0.1优化终止:Y X = 6.0000 13.0000 9.4217 15.7016 FVAL = 0.0098

输出函数停止了求解器。

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

DISP(尺寸(差距))
40 4 7.

40×4种群矩阵有七个记录(40个个人,每个4元素行向量)。

相关话题