our*_*930 5 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);
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢,祝你有愉快的一天.
您的代码在我的系统上只需不到 23 秒即可完成,并且我能够对其进行修改,使其在 2 秒内完成。这是我发现的:
Random当你可以使用的时候你就使用了ThreadLocalRandom;这种切换导致相对较大的加速。f(index)在某些情况下,您在 for 循环内计算两次,而每次迭代只应计算一次。您要添加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);
}
Run Code Online (Sandbox Code Playgroud)