Стохастический поиск по лямбда-выражению - PullRequest
0 голосов
/ 23 мая 2018

Спасибо за вашу помощь и обмен.

Мой вопрос касается Стохастического Поиска.Этот метод используется для аппроксимации данных через определенное количество циклов в общем математическом расчете.Пожалуйста, смотрите следующий код, я попытался уменьшить его до минимума.Я ожидаю, что этот код будет настроен как лямбда-выражение, цикл 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 голосов
/ 23 мая 2018

Ваш код завершается в моей системе менее чем за 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);
    }
    
...