java - 对 lambda 表达式的随机搜索

标签 java algorithm performance artificial-intelligence stochastic

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

我的问题是关于随机搜索的。该技术用于通过定义数量的圆环对一般数学计算进行数据近似。请看下面的代码,我试着把它减少到最低限度。我的期望是将此代码设置为 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);
    }
}

谢谢,祝你有愉快的一天。

最佳答案

您的代码在我的系统上完成时间不到 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);
    }
    

关于java - 对 lambda 表达式的随机搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50496129/

相关文章:

algorithm - 队列抽象数据类型到底是什么?

c# - 快速排序算法的问题

algorithm - 我需要一种基于 1 个变量排名和 1 个常量排名的评分算法

java - 两种相同方法的性能差异

python - 在 Pandas 中创建许多新列的最 Pythonic 方式

java - 如何用 Java 中表上的特定索引替换文本?

java - JDOM:将内容转换为文档

java - 在云提供商上初始化虚拟机并在该计算机上运行一些自定义代码

c++ - 通过指针与数组中的索引链接结构图

JAVA双链表-单元测试失败