All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.lstephen.ai.search.RepeatedHillClimbing Maven / Gradle / Ivy

package com.github.lstephen.ai.search;

import java.util.List;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import com.google.common.base.Preconditions;

/**
 *
 */
public final class RepeatedHillClimbing {

  private static final Integer REPEATS = 5;

  private final Supplier initialFactory;

  private final HillClimbing hillClimbing;

  public RepeatedHillClimbing(Supplier initialFactory, HillClimbing hillClimbing) {
    Preconditions.checkNotNull(initialFactory);
    Preconditions.checkNotNull(hillClimbing);

    this.initialFactory = initialFactory;
    this.hillClimbing = hillClimbing;
  }

  public S search() {
    List initial = Stream
      .generate(initialFactory)
      .limit(REPEATS)
      .collect(Collectors.toList());

    return initial
      .parallelStream()
      .map(hillClimbing::search)
      .max(hillClimbing.getHeuristic())
      .orElseThrow(() -> new IllegalStateException("Could not find final result"));
  }

}