【问题标题】:Stochastic Search to lambda expression随机搜索到 lambda 表达式
【发布时间】:2018-11-02 21:37:46
【问题描述】:

感谢您的所有帮助和分享。

我的问题是关于随机搜索。该技术用于通过定义数量的 cicles 对数据进行近似计算,通常是数学计算。请参阅以下代码,我试图将其减少到最低限度。我的期望是将此代码设置为 lambda 表达式,即 for 循环,我希望它具有最佳性能。我有一些意图,但我不确定我是否充分利用了它。

package stochasticsearch;
import java.util.Random;
public class StochasticSearch {
    public static double f(double x) {
        return -(x - 1) * (x - 1) + 2;
    }
    public static void main(String[] args) {
        final Random random = new Random();
        double startPointX = 0;
        double max = f(startPointX);
        long begin = System.currentTimeMillis();
        for (int i = 0; i < 1000000000; i++) {
            double index = 2 * random.nextDouble();
            if (f(index) > max) {
                max = f(index);
            }
        }
        System.out.println("Elapsed time: " + (System.currentTimeMillis() - begin));
        System.out.println("Maximum value y=f(x) is " + max);
    }
}

谢谢,祝你有美好的一天。

【问题讨论】:

    标签: java algorithm performance artificial-intelligence stochastic


    【解决方案1】:

    您的代码在我的系统上不到 23 秒就完成了,我能够对其进行修改,使其在 2 秒内完成。这是我发现的:

    • 当您可以使用ThreadLocalRandom 时,您正在使用Random;此切换会导致相对较大的加速。
    • 在某些情况下,您在 for 循环中计算 f(index) 两次,而每次迭代只计算一次。
    • 因为您要迭代的值范围很大,所以您可以改用并行流;这也会导致相对较大的加速。
    • 您将2 添加到f 的每个结果中,因此最好在计算出max 后一次添加。

      public static double f(double x) {
          double y = x - 1;
          return -y * y;
      }
      
      public static void main(String[] args) {
          final ThreadLocalRandom random = ThreadLocalRandom.current();
      
          long begin = System.currentTimeMillis();
      
          double max = IntStream.range(0, 1_000_000_000)
                                .parallel()
                                .mapToDouble(i -> f(random.nextDouble() * 2))
                                .max()
                                .orElse(f(0)) + 2;
      
          System.out.println("Elapsed time: " + (System.currentTimeMillis() - begin));
          System.out.println("Maximum value y=f(x) is " + max);
      }
      

    【讨论】:

    • 这太好了,感谢您的快速周转。你有我的投票:)
    猜你喜欢
    • 1970-01-01
    • 2011-03-27
    • 2015-11-19
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    相关资源
    最近更新 更多