随机搜索lambda表达式

时间:2018-05-23 19:29:45

标签: java algorithm performance artificial-intelligence stochastic

感谢您的帮助和分享。

我的问题是关于随机搜索。该技术用于通过一般数学计算中的规定量的cicle进行数据的近似。请参阅以下代码,我尝试将其降至最低。我的期望是将此代码设置为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);
    }
}

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

1 个答案:

答案 0 :(得分:3)

您的代码在我的系统上完成了不到23秒,我能够修改它,所以它需要不到2秒。这是我发现的:

  • 当您使用Random时,您正在使用ThreadLocalRandom;此开关导致相对较大的加速。
  • 在某些情况下,你的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);
    }