微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

帕累托边界集合:算法的顺序

如何解决帕累托边界集合:算法的顺序

我必须进行一项挑战,该挑战涉及详细阐述计算帕累托(集合)边界的算法。声明基本上是:

给定正方形[0,1] x [0,1]中n个点的集合S,做一个算法来确定S中包含的子集P,由S的非支配点组成。

也有人说,可以很容易地详细说明实现此目的的n*n 点比较顺序的算法。好吧,我通过在这里和那里的研究提出了一个算法。挑战仍然是实现 n*log(n) 阶的算法。我如何获得这些算法的顺序?

提前致谢!

#data
set.seed(103)
x = runif(200)
y = runif(200)

#algorithm
pareto = 1:length(x)
for(i in 1:length(x)){
    cond1 = y[i]!=min(y[which(x==x[i])])
    cond2 = x[i]!=min(x[which(y==y[i])])
    for(k in 1:length(x)){
        if((x[i]>x[k]  &  y[i]>y[k]) | (x[i]==x[k] & cond1) | (y[i]==y[k] & cond2)){
            pareto[i] = NA
            break
        }
    }
}
xPareto = x[pareto[!is.na(pareto)]]
yPareto = y[pareto[!is.na(pareto)]]

#graphic:
plot(x,y)
points(xPareto,yPareto,col=2,pch=16)
dat = data.frame(x=xPareto,y=yPareto)
dat = dat[order(dat$x),]
for(i in 1:(nrow(dat)-1)){
    segments(dat$x[i],dat$y[i],dat$x[i+1],dat$y[i+1],lty=2)
}

enter image description here

解决方法

这个问题的有效贪婪解决方案背后的直觉在于,点i被点j iff x[i] > x[j] and {{ 1}},这意味着当点按任一坐标排序时,y[i] > y[j] 必须在 j 之前。因此,如果我们按照 x 坐标的递增顺序遍历这些点,那么支配点 i 的点 j(如果有)必须在点{之前被遍历{1}} 被遍历。换句话说,在这个排序中,支配点 i 不可能出现在支配点 i 之后。

因此,通过这种遍历顺序,支配问题(即检查一个点是否被其他点支配)归结为检查我们是否已经看到了一个具有较低 y 坐标的点,因为遍历顺序已经强制执行了 x - 坐标条件。这可以通过检查每个点的 y 坐标到我们迄今为止看到的最低(最小)y 坐标来轻松完成——如果最小 y 坐标小于当前点 j 的 y 坐标那么具有最小 y 坐标的点 i 作为 i 支配 j,因为 ix[j] < x[i] 之前被看到。

按 x 坐标排序需要 j 时间,检查每个点(同时保持部分最小 y 坐标)需要 i 时间,使得整个算法需要 O(n log n) 时间。

O(n)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。