此示例显示在遗传算法求解器中使用自定义输出功能GA.
。自定义输出函数执行以下任务:
将群体的前两个组成部分的范围绘制为矩形。矩形的左侧和下侧位于最小值x(1)
和x(2)
分别,右侧和上侧位于相应的最大值。
当最佳函数值下降下降时停止迭代0.1
(目标函数的最小值是0.
)。
记录名为的变量中的整个人口盖亚人口历史
每10代Matlab®工作区中。
将初始交叉分数修改为自定义值0.2
,然后将其更新回默认值0.8
经过25代之后。初始设置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=错误;转换旗帜案件“初始化”H1 =数字;AX = GCA;ax.xlim = [021];ax.ylim = [021];l1 = min(state.population(:,1));m1 = max(state.population(:,1));l2 = min(state.pulation(:,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(end);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.pulation(:,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)=状态。人口;分配(“基地”那'gapopulationhistory',历史);结尾
设置下限和上限。
lb = [1 1 -30 -30];UB = [20 20 70 70];
设置整数变量和变量数。
Intcon = [1 2];nvar = 4;
设置选项以调用自定义输出函数,并在开始时几乎没有交叉。
选项=最佳选项('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元素排矢量)有七个记录。