|
布谷鸟算法的Pareto多目标函数优化
https://pan.baidu.com/s/1G_XE4C9kUwYJk3le3L9PiQ
https://pan.baidu.com/s/1H1qHD1u6Bb1awo1-6gIh8w
具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,并提交给我,我来设置视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1
- % 布谷鸟的pareto多目标函数优化分析
- % cuckoo_search -- CS算法
- % web('halcom.cn')
- %% 清空环境
- clc % 清屏
- clear all; % 删除workplace变量
- close all; % 关掉显示图形窗口
- tic
- %% 参数初始化
- global nObj nvar
- nObj = 2; % 2个目标
- nvar = 2; % 2个未知量
- maxiter = 50; % 最大迭代次数
- sizepop = 100; % 种群规模
- popmin1 = -1; popmax1 = 1; % x1
- popmin2 = -1; popmax2 = 1; % x2
- pa=0.25; % 发现新巢的概率Discovery rate of alien eggs/solutions
- repository = 50; % 非支配解种群数量
- nGrid=7; % 每个目标函数解集域的扩展网格大小,单周期数
- alpha=0.1; % 非支配解的解集的扩展因子
- beta=2; % 非支配解的选择因子
- gamma=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
- %% CS算法的多目标函数寻优主程序
- for i=1:maxiter
-
- % 粒子位置更新
- new_nest=[];
- new_nest = get_cuckoos(pop,[popmin1,popmin2],[popmax1,popmax2], rep, beta); % Levy flights 粒子位置更新
- [pop, new_nest]=get_best_nest(pop, new_nest);
- % 增加非支配解
- rep =[rep; pop(~[pop.IsDominated])];
- % 非支配解是否有支配解
- rep=JudgePopDomination(rep);
- % 删除支配解
- rep=rep(~[rep.IsDominated]);
-
- % 寻找新的鸟巢--新的解
- new_nest=[];
- new_nest=empty_nests(pop, [popmin1,popmin2],[popmax1,popmax2], pa) ;
- [pop, new_nest]=get_best_nest(pop, new_nest);
-
- % 增加非支配解
- rep =[rep; pop(~[pop.IsDominated])];
- % 非支配解是否有支配解
- rep=JudgePopDomination(rep);
- % 删除支配解
- rep=rep(~[rep.IsDominated]);
- % 扩展非支配解的适应度函数取值范围
- Grid=CreateGrids(rep,nGrid,alpha);
- for k=1:numel(rep)
- rep(k)=FindGridIndex(rep(k),Grid);
- end
- % 非支配解是否达到最大的非支配解的种群数
- if numel(rep)>repository
- % 将超过的种群删除
- Extra=numel(rep)-repository;
- for k=1:Extra
- rep=DeleteOneRepMemebr(rep,gamma);
- end
- end
-
- figure(1);
- Plotfitness(pop,rep);
- pause(0.01);
- end
- toc
- % % 确定种群之间是否存在支配解
- % pop=JudgePopDomination(pop);
- % % 增加非支配解
- % rep =[rep; pop(~[pop.IsDominated])];
- rep = uniqueRep(rep);
- figure(1);
- Plotfitness(pop,rep);
- % 最优结果
- for i=1:size( rep,1 )
- zbest_sol(i,:) = rep(i).Pos;
- if i==1
- fprintf('\n')
- disp('PSO多目标计算的第一组结果如下:')
- disp(['x1 = ',num2str(zbest_sol(i,1))])
- disp(['x2 = ',num2str(zbest_sol(i,2))])
- disp(['最优适应度值为 ',num2str([rep(i).fitness]')])
- fprintf('\n')
- else
- disp('PSO多目标计算结果有多个Pareto解集')
- end
- end
复制代码 empty_nests函数:
- function new_nest=empty_nests(nest, popmin, popmax, pa)
- global nObj nvar
- nest1 = [nest.Pos];
- nest1 = reshape(nest1, [nvar, size(nest,1)])';
- n=size(nest1,1); % 种群个数
- % 发现新巢的概率Discovery rate of alien eggs/solutions
- K=rand(size(nest1))>pa;
- stepsize = rand*( nest1(randperm(n),:) - nest1(randperm(n),:) );
- new_nest1 = nest1 + stepsize.*K;
- for i=1:n
- for j=1:size( new_nest1, 2 )
- if(new_nest1(i, j)>popmax(j))
- new_nest1(i, j) = popmax(j);
- end
- if(new_nest1(i, j)<popmin(j))
- new_nest1(i, j)=popmin(j);
- end
- end
- new_nest(i).Pos = new_nest1(i,:);
- end
复制代码 get_best_nest函数:
- function [nest, new_nest]=get_best_nest(nest, new_nest)
- % nest 输入 上一代的解
- % fun: 输入 适应度函数
- % new_nest 输入 新产生的解
- for i=1:size(nest,1)
- new_nest(i).fitness = fun( new_nest(i).Pos ); % 适应度值
-
- % 是否受支配
- if Domination(new_nest(i), nest(i))
- nest(i).Pos=new_nest(i).Pos;
- nest(i).fitness=new_nest(i).fitness;
- else
- if rand<0.5
- nest(i).Pos=new_nest(i).Pos;
- nest(i).fitness=new_nest(i).fitness;
- end
- end
-
- end
- % % 找当前最好的个体
- % [bestfitness,bestindex]=min(fitness); % 最优适应度值
- % bestnest = nest(bestindex,:); % 全局最佳种群
复制代码 get_cuckoos函数:
- function new_nest = get_cuckoos(pop, popmin, popmax, rep, betaPareto)
- % Levy flights 粒子位置更新
- global nObj nvar
- nest = [pop.Pos];
- nest = reshape(nest, [nvar, size(pop,1)])';
- new_nest = pop;
- pop = [];
- % Levy flights
- n=size(nest,1); % 种群个数
- % Levy exponent and coefficient
- beta=3/2;
- sigma=(gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta);
- % new_nest = nest;
- for i=1:n % 种群个数
- pop = nest(i,:);
- % Levy flights by Mantegna's algorithm
- u=randn(size(pop))*sigma;
- v=randn( size(pop) );
- step=u./abs(v).^(1/beta);
-
- % 轮盘赌算子随机选择一个非支配解,扰动解,避免陷入局部最优
- zbest=Selectzbest(rep, betaPareto);
- bestnest = zbest.Pos;
-
- stepsize=0.01*step.*(pop-bestnest);
- pop = pop + stepsize.*randn(size(pop));
- % 防止越界
- for k=1:length( pop )
- if pop(k)>popmax(k)
- pop(k)=popmax(k);
- end
- if pop(k)<popmin(k)
- pop(k)=popmin(k);
- end
- end
- % new_nest(i,:) = pop; % 更新种群
- new_nest(i).Pos = pop; % 更新种群
- end
复制代码 参考:
【1】http://halcom.cn/forum.php?mod=viewthread&tid=357&extra=page%3D1
【2】Solving Multiobjective Optimization Problems Using Artificial Bee Colony Algorithm
|
|