【发布时间】:2014-08-24 08:40:27
【问题描述】:
首先,这是我的设置:
-
x是一个n x 1向量,包含第一个成本函数的值。 -
y是另一个n x 1向量,包含第二个成本函数的值。 -
a是一个m x 1向量,其中包含要检查的x和y的索引,这用于有选择地从算法中排除值。除非需要,否则可以将其替换为1:n。 - 可以肯定地假设
(x,y)的所有组合都是唯一的。
任务是找到值对的帕累托最优集合(x,y),即所有不占优的对。如果存在另一对 (u,v) 使得 u <= x && v <= y 并且其中一个比较是严格的:u < x || v < y,则该对被称为主导。换句话说,如果另一对在一个值上更好而不在另一个值上更差,则一对被支配。
到目前为止,我的研究已经产生了三种有效的算法,不幸的是它们都依赖于循环。以下是它们的工作方式以及我用x、y 和a(长度为1e8)运行它们的时间:
- 按升序对
x进行排序。将第一对添加到帕累托集。- 循环通过
x。将每一对添加到帕累托集中,其中y低于前一个帕累托对的y。经过的时间是 80.204052 秒。
- 找到
min(x)。将该对添加到帕累托集。- 选择
y低于先前添加的对的y的所有对。- 除非第 2 步导致空集,否则请转到第 1 步。
经过的时间是 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
【问题讨论】:
-
我一直用
this function from File Exchange,它真的很快就能上千分,所以你可以偷偷溜进去看看他们是怎么做到的。 (使用和引用!) -
@thewaywewalk 我也发现了这个,但除非我遗漏了什么,否则这只是一个编译好的 mex 文件,我无法查看实际的源代码并弄清楚它的作用。我不习惯使用我不理解的外部资源...
-
好吧,你是对的,我之前没有检查过。对不起。
标签: algorithm matlab optimization vectorization mathematical-optimization