首先,这里是我的设置:矢量化帕累托前算法
x
是包含第一成本函数的值的n x 1
载体。y
是另一个包含第二个成本函数值的n x 1
向量。a
是包含x
和y
索引的m x 1
向量,以用于选择性地排除算法中的值。除非需要,否则可以用1:n
替代。- 假设所有组合
(x,y)
都是唯一的是安全的。
任务是找到pareto最优值对组合(x,y)
,也就是所有未被支配的对。如果存在另一对(u,v)
,则一对称为支配,使得u <= x && v <= y
和其中一个比较严格:u < x || v < y
。换句话说,如果另一对在一个值中更好,而另一个中的另一个更糟,则一对是主导的。
我到目前为止的研究已经产生了三种工作算法,不幸的是它们都依赖于循环。下面是他们是如何工作的,什么时候我得到了与x
,y
和长度1e8
的a
运行它们:
- 排序
x
。将第一对添加到pareto集。- Loop through
x
。将每一对添加到帕雷托集合,其中y
比先前帕雷托对的y
低。已用时间为80.204052秒。
- 查找
min(x)
。将该对添加到pareto集。- 选择所有对,其中
y
低于先前添加的对y
。- 转到第1步,除非第2步导致空集。
已用时间为2.993350秒。
- 遍历所有对
(x,y)
。- 删除所有对
(u,v)
与x >= u && y >= v
。已用时间105.924814秒。
现在我试图做的是创建一个矢量化算法。它不必基于上述之一,但我无法找到任何其他工作算法。我所能做的最好的是这样的:
ap = a(y < min(y(x == min(x))) | x < min(x(y == min(y))));
这也通常会发现所有的帕累托最优对,但包括min(x)
或min(y)
由一对不占主导地位的所有对,即使一个占主导地位的另一个。我说通常是因为如果只有一个全局优化的配对支配其他配对,它就完全失败了。用<=
代替<
可以解决第二个问题,但找到更多支配对(那些只有一个更差的值)。我也通过与上面相同的计时器运行此:
已用时间为0.800385秒。
下面是我使用来检查怎么算法确实,随意使用它
for i=1:25
x = randi(8,10,1);
y = randi(8,10,1);
a = 1:10;
ap = a(y < min(y(x == min(x))) | x < min(x(y == min(y)))); %// algorithm here
figure(1);
subplot(5,5,i);
plot(a,x,'b',a,y,'r',ap,x(ap),'b.',ap,y(ap),'r.','MarkerSize',20);
axis([0,11,0,9]);
set(gca,'XGrid','on','YGrid','on','XTick',1:10,'YTick',0:8);
figure(2);
subplot(5,5,i);
plot(x,y,'b.',x(ap),y(ap),'ro','MarkerSize',10);
axis([0,9,0,9]);
end
我总是使用[**'此功能从文件交换**](http://www.mathworks.com/matlabcentral/fileexchange/17251-pareto-front)它是真的很快就有成千上万的点,所以你可以潜入并看看他们是如何做到的。 (使用和引用!) – thewaywewalk
@thewaywewalk我也发现了这一点,但除非我错过了一些东西,这只是一个编译好的mex文件,我无法看到实际的源代码并找出它的作用。我不习惯使用外部来源,我不明白... – scenia
好吧,你是对的,我没有检查过,之前。抱歉。 – thewaywewalk