非支配排序遗传算法

原文链接:https://blog.csdn.net/haha0332/article/details/88672634

1. 非支配排序遗传算法(NSGA)

1995年,Srinivas和Deb提出了非支配排序遗传算法(Non-dominated Sorting Genetic Algorithms,NSGA)。这是一种基于Pareto最优概念的遗传算法。

(1) 基本原理

NSGA与简单的遗传算法的主要区别在于:该算法在选择算子执行之前根据个体之间的支配关系进行了分层。其选择算子、交叉算子和变异算子与简单遗传算法没有区别。

在选择操作执行之前,种群根据个体之间的支配与非支配关系进行排序:

首先,找出该种群中的所有非支配个体,并赋予他们一个共享的虚拟适应度值。得到第一个非支配最优层;

然后,忽略这组己分层的个体,对种群中的其它个体继续按照支配与非支配关系进行分层,并赋予它们一个新的虚拟适应度值,该值要小于上一层的值,对剩下的个体继续上述操作,直到种群中的所有个体都被分层。

算法根据适应度共享对虚拟适应值重新指定:

比如指定第一层个体的虚拟适应值为1,第二层个体的虚拟适应值应该相应减少,可取为0.9,依此类推。这样,可使虚拟适应值规范化。保持优良个体适应度的优势,以获得更多的复制机会,同时也维持了种群的多样性。

(2) 算法流程

NSGA采用的非支配分层方法,可以使好的个体有更大的机会遗传到下一代;适应度共享策略则使得准Pamto面上的个体均匀分布,保持了群体多样性,克服了超级个体的过度繁殖,防止了早熟收敛。算法流程如图所示:
在这里插入图片描述

(3) 算法缺陷

非支配排序遗传算法(NSGA)在许多问题上得到了应用。但NSGA仍存在一些问题:

a) 计算复杂度较高,为O(mN3)(m为目标函数个数,N为种群大小),所以当种群较大时,计算相当耗时。

b) 没有精英策略;精英策略可以加速算法的执行速度,而且也能在一定程度上确保已经找到的满意解不被丢失。

c) 需要指定共享半径在这里插入图片描述

2. 带精英策略的非支配排序的遗传算法(NSGA-II)

2000年,Deb又提出NSGA的改进算法一带精英策略的非支配排序遗传算法(NSGA-II),针对以上的缺陷通过以下三个方面进行了改进:

a) 提出了快速非支配排序法,降低了算法的计算复杂度。由原来的O(mN3)降到O(mN2),其中,m为目标函数个数,N为种群大小。

b) 提出了拥挤度和拥挤度比较算子,代替了需要指定共享半径的适应度共享策略,并在快速排序后的同级比较中作为胜出标准,使准Pareto域中的个体能扩展到整个Pareto域,并均匀分布,保持了种群的多样性。

c) 引入精英策略,扩大采样空间。将父代种群与其产生的子代种群组合,共同竞争产生下一代种群,有利于保持父代中的优良个体进入下一代,并通过对种群中所有个体的分层存放,使得最佳个体不会丢失,迅速提高种群水平。

(1) 基本原理

快速非支配排序法:

NSGA-II对第一代算法中非支配排序方法进行了改进:对于每个个体 i 都设有以下两个参数 n(i) 和 S(i),

n(i) 为在种群中支配个体 i 的解个体的数量。(别的解支配个体 i 的数量)

S(i) 为被个体 i 所支配的解个体的集合。(个体 i 支配别的解的集合)

  1. 首先,找到种群中所有 n(i)=0 的个体**(种群中所有不被其他个体至配的个体 i),将它们存入当前集合F(1);(找到种群中所有未被其他解支配的个体)**

  2. 然后对于当前集合 F(1) 中的每个个体 j,考察它所支配的个体集 S(j),将集合 S(j) 中的每个个体 k 的 n(k) 减去1,即支配个体 k 的解个体数减1(因为支配个体 k 的个体 j 已经存入当前集 F(1) );(对其他解除去被第一层支配的数量,即减一)

  3. 如 n(k)-1=0则将个体 k 存入另一个集H。最后,将 F(1) 作为第一级非支配个体集合,并赋予该集合内个体一个相同的非支配序 i(rank),然后继续对 H 作上述分级操作并赋予相应的非支配序,直到所有的个体都被分级。其计算复杂度为O(mN^{2}),m为目标函数个数,N为种群大小。(按照1)、2)的方法完成所有分级)

确定拥挤度:

在原来的NSGA中,我们采用共享函数以确保种群的多样性,但这需要由决策者指定共享半径的值。为了解决这个问题,我们提出了拥挤度概念:在种群中的给定点的周围个体的密度,用 id 表示,它指出了在个体 i 周围包含个体 i 本身但不包含其他个体的最小的长方形,如图所示:
在这里插入图片描述

拥挤度比较算子:

从图中我们可以看出 i_{d} 值较小时表示该个体周围比较拥挤。为了维持种群的多样性,我们需要一个比较拥挤度的算予以确保算法能够收敛到一个均匀分布的Pareto面上。

由于经过了排序和拥挤度的计算,群体中每个个体 i 都得到两个属性:非支配序 i(rank) 和拥挤度 id,则定义偏序关系\prec _{n}:当满足条件 i(rank) <d,或满足 i(rank) =id 且 id> jd。时,定义i\prec _{n}j,。也就是说:如果两个个体的非支配排序不同,取排序号较小的个体(分层排序时,先被分离出来的个体);如果两个个体在同一级,取周围较不拥挤的个体。

(2) 算法流程
在这里插入图片描述

首先,随机初始化一个父代种群P(0),并将所有个体按非支配关系排序且指定一个适应度值,如:可以指定适应度值等于其非支配序 i(rank),则1是最佳适应度值。然后,采用选择、交叉、变异算子产生下一代种群Q(0),大小为N。
在这里插入图片描述

如图,首先将第 t 代产生的新种群Q(t)与父代P(t)合并组成R(t),种群大小为2N。然后R(t)。进行非支配排序,产生一系列非支配集 F(t) 并计算拥挤度。由于子代和父代个体都包含在 R(t) 中,则经过非支配排序以后的非支配集 F(1) 中包含的个体是 R(t) 中最好的,所以先将 F(1) 放入新的父代种群 P(t+1) 中。如果 F(1) 的大小小于N,则继续向 P(t+1) 中填充下一级非支配集 F(2),直到添加 F(3) 时,种群的大小超出N,对 F(3) 中的个体进行拥挤度排序(sort(F(3),\prec _{n})),取前N- | P(t+1)) |个个体,使 P(t+1) 个体数量达到N。然后通过遗传算子(选择、交叉、变异)产生新的子代种群 Q(t+1)。

算法的整体复杂性为O(mN2),由算法的非支配排序部分决定。

通过介绍非支配排序遗传算法(NSGA)及其改进算法NSGA-II的基本原理和流程,我们了解到NSGA-II解决了NSGA中存在的3个问题:降低了计算复杂度;引入精英策略;采用拥挤度及其比较算子代替了共享半径。使得NSGA-Ⅱ在处理多目标优化问题上有更好的性能。

支配排序算法(Non-dominated Sorting Algorithm,NSGA)是一种多目标优化算法,用于解决带有多个目标函数的问题。下面是MATLAB代码示例: ```matlab function [fronts,X,F] = NSGA2(FUN,X0,lb,ub,NP,NGen) % FUN: 目标函数 % X0: 初始种群 % lb: 变量下界 % ub: 变量上界 % NP: 种群大小 % NGen: 迭代次数 nObj = length(FUN); % 目标函数个数 nVar = size(X0,2); % 变量个数 X = zeros(NP,nVar); % 存储种群 F = zeros(NP,nObj); % 存储目标函数值 % 初始化种群 for i = 1:NP X(i,:) = X0(i,:); F(i,:) = FUN(X(i,:)); end % 归一化处理 Fmax = max(F,[],1); Fmin = min(F,[],1); F = (F - repmat(Fmin,NP,1)) ./ repmat(Fmax-Fmin,NP,1); fronts = cell(1,NGen); % 存储每一代的帕累托前沿 for iGen = 1:NGen % 支配排序 [F,rank] = sortrows(F); X = X(rank,:); rank = NonDominatedSorting(F); % 计算拥挤度 dist = CrowdingDistance(F,rank); % 选择新的种群 idx = Selection(rank,dist,NP); X = X(idx,:); F = F(idx,:); % 进行交叉和变异 X = GeneticOperators(X,lb,ub); % 更新目标函数值 for i = 1:NP F(i,:) = FUN(X(i,:)); end % 归一化处理 F = (F - repmat(Fmin,NP,1)) ./ repmat(Fmax-Fmin,NP,1); fronts{iGen} = F; end end % 支配排序 function rank = NonDominatedSorting(F) NP = size(F,1); % 种群大小 rank = zeros(1,NP); nDom = zeros(1,NP); S = cell(1,NP); for i = 1:NP S{i} = []; for j = 1:NP if i ~= j if all(F(i,:) <= F(j,:)) && any(F(i,:) < F(j,:)) S{i} = [S{i},j]; elseif all(F(i,:) >= F(j,:)) && any(F(i,:) > F(j,:)) nDom(i) = nDom(i) + 1; end end end if nDom(i) == 0 rank(i) = 1; end end k = 1; while any(rank==0) Q = find(rank==0 & nDom==0); for i = 1:length(Q) p = Q(i); rank(p) = k; for j = 1:length(S{p}) nDom(S{p}(j)) = nDom(S{p}(j)) - 1; end end k = k + 1; end end % 计算拥挤度 function dist = CrowdingDistance(F,rank) NP = size(F,1); % 种群大小 nObj = size(F,2); % 目标函数个数 dist = zeros(1,NP); for iObj = 1:nObj [~,idx] = sort(F(:,iObj)); dist(idx(1)) = inf; dist(idx(end)) = inf; for i = 2:NP-1 dist(idx(i)) = dist(idx(i)) + (F(idx(i+1),iObj)-F(idx(i-1),iObj)) / (max(F(:,iObj))-min(F(:,iObj))); end end end % 选择新的种群 function idx = Selection(rank,dist,NP) idx = zeros(1,NP); for iRank = 1:max(rank) I = find(rank==iRank); [~,idxI] = sort(dist(I),'descend'); idx(iRank:length(I):NP) = I(idxI); end end % 进行交叉和变异 function X = GeneticOperators(X,lb,ub) [NP,nVar] = size(X); % 种群大小和变量个数 % 交叉 for i = 1:2:NP p1 = X(i,:); p2 = X(i+1,:); r = rand(1,nVar); c1 = r.*p1 + (1-r).*p2; c2 = (1-r).*p1 + r.*p2; X(i,:) = c1; X(i+1,:) = c2; end % 变异 for i = 1:NP if rand < 0.1 X(i,:) = lb + (ub-lb) .* rand(1,nVar); end end end ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值