从集合中选择具有最小Schwartzian变换的对象

时间:2011-10-25 02:44:57

标签: ruby artificial-intelligence path-finding

我正在为http://aichallenge.org/specification.php实现A *,并想知道一种灵活的方法来选择基于schartzian变换的最小集合。

基本上,我有一组合适的方块要搬到,我想以最低的成本搬到广场。

基本上我会从我的邻居那里选择一个成本最低的广场。

我能想到的唯一方法是使用

之类的东西

next_spot = spot.neighbors.sort_by |a,b| { a.cost(dest) <=> b.cost(dest) }.first

但是我真的想要更高性能的东西,因为我真的不想对集合进行排序,我只想要一个具有最小变换值的那个

注意,我可以写一些更详细和“C风格”的循环并跟踪先前的最小值,但我希望有一些清晰和紧凑的东西。

1 个答案:

答案 0 :(得分:2)

为什么不使用min_by

next_spot = spot.neighbors.min_by { |x| x.cost(dest) }

如果不存在Enumerable-ish方法的“_by”版本,你可以通过这种伪Ruby模式手工完成旧学校并进行Schwartzian变换:

a.map { |x| [ expensive(x), x ] }.       # Do the expensive part once and cache it
  op  { |x| something_with x.first... }. # Do what you really came to do
  map { |x| x.last }                     # Unwrap the caching