其他分享
首页 > 其他分享> > 多目标Pareto最优解集构造方法(伪代码)

多目标Pareto最优解集构造方法(伪代码)

作者:互联网

多目标Pareto最优解集构造方法(伪代码)

构造Pareto最优解集的简单方法

算法的时间复杂度为O(N2)

Deb的非支配排序方法

设进化群体为P,同时设置一个构造集P’。算法开始时将第一个个体放入构造集P’中,依次将进化群体P中的个体p取出并放入构造集P‘中,同时将当前取出的p依次与P’中的所有个体进行比较,删除P’中所有被p支配的个体,若个体p被P‘中任意一个个体所支配,则将p中P‘中删除。

P' = find_nondominated_front(P)
P' = {1}	//把第一个个体放入P‘中
for each (p in P) and (p not in P')
{
	P' = P' + {p}
	for each (q in P') and q != p
	{
		if p dominate q then	//如果p支配q
			P' = P' - {q}
		else if q dominate p then
			P' = p' - {p}
	}
}

在最坏情况下,即P中所有个体均为非支配个体时,总比较次数:
1+2+3+···+(N-1) = N2/2
每次比较时有r个子目标,时间复杂度为O(rN2)

用排除法构造非支配集

将进化群体Pop中的每个个体X依次与非支配集NDSet(开始时为空)中的个体Y比较,如果X支配Y,说明Y是被支配个体,将Y从NDSet中删除。如果X不被NDSet中任何一个个体所支配,则将X并入NDSet中。当NDSet为空/初始时,直接将X并入NDSet。

NDSet = null;	//初始时为空
for each X in Pop
{
	dominated_sign = True
	if(isEmpty(NDSet)) then	//当NDSet为空时
		NDSet = NDSet + {X}
	else
		each Y in NDSet
		{
			if(X dominate Y) then
				NDSet = NDSet - {Y}
			else if (Y dominate X) then
				dominated_sign = False
		}
	if (dominated_sign) then
		NDSet = NDSet + {X}
}

最坏情况下时间复杂度为O(rN2)。
当非支配集|NDSet|比较小时效率比较高。

算法2的执行效率比算法1高
、若当前比较个体p多次被P’中其他个体支配时,算法1将多次重复执行删除操作
、在执行过程中出现空集的情况,这种情况下,算法2只需要将从进化群体中取出的当前个体放入NDSet中即可

将构造集与非支配集分开,初始时设构造集NDSet1为进化群体Pop,非支配集NDSet为空。将构造集NDSet1中不同个体X依次与其他个体Y比较(包括非支配集中个体),若X支配Y,则将Y从构造集NDSet1中清除;在一轮比较后若X不被任何其他个体支配,则X是非支配的,将X并入非支配集NDSet中。无论在任何时候,NDSet中的个体一定是非支配的。

NDSet = null
NDSet1 = Pop
while |NDSet1| > 1 do
{
	sign = True
	X = first(NDSet1)		//X为NDSet中第一个个体
	NDSet1 = NDSet1 - {X}
	for each Y in (NDSet1 or NDSet)
	{
		if (X dominate Y) then
			NDSet1 = NDSet1 - {Y}
		else if (Y dominate X) then
			sign = False
	}
	if (sign) then
		NDSet = NDSet + {X}
}
NDSet = NDSet + NDSet1

最坏情况下,即当|NDSet|= 1 ,且这个唯一的非支配个体是Pop中最后一个个体,且前面(N-1)个个体不存在支配关系,此时比较次数为N2/2。此外当|NDSet| = N时,比较次数也为N2/2。在最坏情况下的时间复杂度为O(rN2)。
算法3的效率与非支配个体的分布也有很大关系,若非支配个体分布在序列的前面,则算法的效率就高一些。

用庄家法则构造Pareto最优解集

设P为一进化群体,Q为构造集,初始时Q=P,NDSet为非支配集,初始时为空。从Q中任取一个个体,依次与所有其他个体比较,将被该个体所支配的个体从Q中删除,如果该个体没有被其他任何一个个体所支配,则它是非支配的,将它并入非支配集NDSet中,否则也从Q中清除该个体。

Q = Pop
while(isNotEmpty(Q)) do		//Q不为空时
{
	x in Q, Q = Q - {x}		//从Q中取一个个体
	x-is-undominated = True
	for each y in Q
	{
		if(x dominate y) then
			Q = Q - {y}
		else if (y dominate x) then 
			x-is-undominated = False
	}
	if(x-is-undominated) then
		NDSet = NDSet + {x}
}
个人感觉算法3和算法4差别不大
算法3是从构造集中取出一个个体与构造集和非支配集中所有个体比较
算法4是从构造集中取出一个个体,只与非支配集中个体进行比较
(如果理解不对,烦请指正,我也是刚开始学的小白,谢谢

标签:支配,Pareto,dominate,构造方法,sign,解集,个体,算法,NDSet
来源: https://blog.csdn.net/weixin_41458599/article/details/108997250