|
40人工蜂群算法ABC的Pareto多目标函数优化--视频讲解
百度网盘链接:http://pan.baidu.com/s/1nuXLb77
参考链接:http://halcom.cn/forum.php?mod=v ... age=1&extra=#pid429
具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1
具体的代码如下:
- % 人工蜂群算法Pareto多目标函数寻优
- % ABC算法
- clc,clear,close all
- warning off
- format longG
- % web('halcom.cn')
- global nObj
- nObj = 2; % 2个目标
- nVar = 2; % 2个未知量
- addpath( genpath( './code' ) )
- % ABC 参数初始化
- maxiter = 100; % 迭代次数
- sizepop = 100; % 种群数量
- popmin1 = -1; popmax1 = 1; % x1
- popmin2 = -1; popmax2 = 1; % x2
- trail(1:sizepop,1) = 0; % 未找到更优解的迭代次数
- limit = sizepop; % 拖尾最大次数
- % Pareto
- repository = 50; % 非支配解种群数量
- nGrid=7; % 每个目标函数解集域的扩展网格大小,单周期数
- alpha=0.1; % 非支配解的解集的扩展因子
- beta=2; % 非支配解的选择因子
- % 初始化种群
- x.Pos=[]; % 未知量的解
- x.fitness=[]; % 粒子适应度值
- x.IsDominated=[]; % 是否非支配解,支配解=1, 非支配解=0
- x.GridIndex=[]; % 非支配解的网格化参数值-索引总循环数(并排目标函数的序列化内)
- x.GridSubIndex=[]; % 每一个非支配解的网格化索引值(扩展取值范围内)
- pop=repmat(x,sizepop,1); % 初始化的种群
- clear x
- for i=1:sizepop
- pop(i).Pos(1) = unifrnd(popmin1,popmax1,1);
- pop(i).Pos(2) = unifrnd(popmin2,popmax2,1);
- % 适应度函数
- pop(i).fitness = fun(pop(i).Pos);
- end
- % 确定种群之间是否存在支配解
- pop=JudgePopDomination(pop);
- % 然后获取非支配解
- rep=pop(~[pop.IsDominated]);
- % 扩展非支配解的适应度函数取值范围
- Grid=CreateGrids(rep,nGrid,alpha);
- % 计算扩展非支配解的GridIndex
- for i=1:numel(rep)
- rep(i)=FindGridIndex(rep(i),Grid);
- end
- % 迭代寻优
- for i=1:maxiter
- % 采蜜峰开始工作
- for j=1:sizepop
- % 选择采蜜的个体
- x2y = randi(2); % 两个未知数
- % 选择相连的种群
- neighbour = randi(sizepop);
- % neighbour != j
- while( neighbour==j )
- neighbour = randi(sizepop);
- end
-
- % 种群更新(解)
- tempx = pop(j).Pos; % 当前的解
- tempx(x2y) = pop(j).Pos(x2y) + ( pop(j).Pos(x2y)-pop(neighbour).Pos(x2y) )*(rand-0.5)*2;
-
- % 蜜蜂取值范围约束
- tempx(1) = max(tempx(1), popmin1);
- tempx(1) = min(tempx(1), popmax1);
- tempx(2) = max(tempx(2), popmin2);
- tempx(2) = min(tempx(2), popmax2);
-
- % 适应度更新
- temp_fitness = fun( tempx ); % 当前的适应度函数值--目标函数值--最小目标函数值
-
- NewSol.Pos = tempx;
- NewSol.fitness = temp_fitness;
-
- % 是否受支配
- if Domination(NewSol,pop(j))
- pop(j).Pos=NewSol.Pos;
- pop(j).fitness=NewSol.fitness;
- else
- if rand<0.5
- pop(j).Pos=NewSol.Pos;
- pop(j).fitness=NewSol.fitness;
- end
- end
- end
-
- fitnessABC=[];
- fitnessABC= [pop.fitness];
- fitnessABC = [reshape(fitnessABC, nObj,sizepop )]';
- % 观察峰
- % 计算概率
- prob = 0.9*sum(fitnessABC,2)./max(sum(fitnessABC,2)) + 0.1;
- for j=1:sizepop
- if(rand<prob(j))
-
- % 选择采蜜的个体
- x2y = randi(2); % 两个未知数
- % 选择相连的种群
- neighbour = randi(sizepop);
- % neighbour != j
- while( neighbour==j )
- neighbour = randi(sizepop);
- end
- % 种群更新(解)
- tempx = pop(j).Pos; % 当前的解
- tempx(x2y) = pop(j).Pos(x2y) + ( pop(j).Pos(x2y)-pop(neighbour).Pos(x2y) )*(rand-0.5)*2;
- % 蜜蜂取值范围约束
- tempx(1) = max(tempx(1), popmin1);
- tempx(1) = min(tempx(1), popmax1);
- tempx(2) = max(tempx(2), popmin2);
- tempx(2) = min(tempx(2), popmax2);
- % 适应度更新
- temp_fitness = fun( tempx ); % 当前的适应度函数值--目标函数值--最小目标函数值
- NewSol.Pos = tempx;
- NewSol.fitness = temp_fitness;
- % 是否受支配
- if Domination(NewSol,pop(j))
- pop(j).Pos=NewSol.Pos;
- pop(j).fitness=NewSol.fitness;
- else
- if rand<0.5
- pop(j).Pos=NewSol.Pos;
- pop(j).fitness=NewSol.fitness;
- end
- trail(j) = trail(j)+1;
- end
- end
- end
-
- % 侦察峰开始工作
- [maxTrial, index] = max(trail);
- index = index(1);
- if(maxTrial(1)>limit)
- pop(index).Pos(1) = unifrnd(popmin1,popmax1,1);
- pop(index).Pos(2) = unifrnd(popmin2,popmax2,1);
- % 适应度函数
- pop(index).fitness = fun(pop(i).Pos);
- end
-
- figure(1);
- Plotfitness2(pop,rep);
- pause(0.001)
- end
- % 确定种群之间是否存在支配解
- pop=JudgePopDomination(pop);
- % 增加非支配解
- rep =[rep; pop(~[pop.IsDominated])];
- rep = uniqueRep(rep);
- figure(1);
- Plotfitness2(pop,rep);
- % 最优结果
- for i=1:size( rep,1 )
- zbest_sol(i,:) = rep(i).Pos;
- if i==1
- fprintf('\n')
- disp('ABC多目标计算的第一组结果如下:')
- disp(['x1 = ',num2str(zbest_sol(i,1))])
- disp(['x2 = ',num2str(zbest_sol(i,2))])
- disp(['最优适应度值为 ',num2str([rep(i).fitness]')])
- fprintf('\n')
- else
- disp('ABC多目标计算结果有多个Pareto解集')
- end
- end
- rmpath(genpath('./code'))
复制代码
|
|