ISCSolver

class ISCSolver @JvmOverloads constructor(problemDefinition: ProblemDefinition, evaluator: EvaluatorIfc, streamNum: Int = 0, streamProvider: RNStreamProviderIfc = RNStreamProvider(), replicationsPerEvaluation: ReplicationPerEvaluationIfc, deltaC: Double = problemDefinition.indifferenceZoneParameter, deltaL: Double = deltaC, skipGlobalPhase: Boolean = false, globalPhase: NichingGeneticAlgorithmSolver? = null, localPhaseFactory: (InputMap) -> CompassSolver? = null, cleanUp: CleanUpProcedure? = null, globalBudget: Int? = null, maximumIterations: Int = iscDefaultMaxIterations, maxLocalPhaseReplications: Int = CompassSolver.defaultMaxReplications, maxCleanUpReplicationsPerSystem: Int = CleanUpProcedure.DEFAULT_MAX_REPLICATIONS_PER_SYSTEM, name: String? = null) : StochasticSolver(source)

The three-phase Industrial Strength COMPASS (ISC) driver: a global Niching-GA exploration phase, a local COMPASS phase run once per niche seed, and a clean-up ranking-and-selection phase that screens the local optima, selects the best, and reports a confidence interval. It orchestrates the in-package NichingGeneticAlgorithmSolver, CompassSolver, and CleanUpProcedure as a phase state machine: each mainIteration advances one macro-step (run the global phase, run one local search, or finish with clean-up).

Requires an integer-ordered problem definition. ISC's COMPASS local phase searches an integer lattice (unit-step neighborhood), so every input must have granularity 1.0. The constructor throws an IllegalArgumentException when the problem is not integer-ordered.

Indifference zones and graceful degradation. A single user parameter deltaC drives the statistical guarantees, with deltaL (COMPASS local-optimality) defaulting to it:

  • deltaC > 0 — full ISC. Clean-up runs the Rinott indifference-zone selection and reports ḡ(x_B) ± δ_C with the correct-selection guarantee; with deltaL > 0 each COMPASS run confirms local optimality with Kim's (2005) sequential test.

  • deltaC = 0 (the default, inherited from ProblemDefinition.indifferenceZoneParameter) — degraded. ISC still returns a feasible best, but the IZ-dependent guarantees are intentionally dropped: clean-up degrades to screening + an ordinary confidence interval (no ±δ_C correct-selection guarantee), and COMPASS stops on the most-promising-area singleton condition plus the iteration budget. A positive δ_C is required to obtain the guarantees.

Set globalPhase to null (or use the COMPASS-only factory) for the paper's unimodal shortcut: the global phase is skipped and a single COMPASS run starts from the configured starting point (or a random feasible point).

The best solution found is tracked automatically by the base class through currentSolution; the selected best and its confidenceInterval are finalized by the clean-up phase.

Reading the result (D2). For ISC, read the answer from currentSolution together with confidenceInterval — that pair is the clean-up-selected best and its interval. The generic Solver.bestSolution returns the minimum penalized point estimate across every solution the run produced (including unconfirmed niching-GA population members), which can differ from — and is less trustworthy than — the ranking-and-selection winner that confidenceInterval describes.

Parameters

problemDefinition

the problem being solved

evaluator

the evaluator responsible for assessing the quality of solutions

streamNum

the random number stream number; 0 (the default) means the next available stream

streamProvider

the provider of random number streams shared with the sub-solvers

replicationsPerEvaluation

strategy for the number of replications per evaluation

deltaC

the clean-up indifference zone δ_C; defaults to the problem's IZ parameter

deltaL

the COMPASS local-optimality indifference zone δ_L; defaults to deltaC

skipGlobalPhase

when true, skip the global phase (COMPASS-only unimodal shortcut)

globalPhase

the Niching-GA global phase; when null and not skipped, a default is built

localPhaseFactory

builds a CompassSolver for a given seed point; when null a default is used

cleanUp

the clean-up procedure; when null a default is built from deltaC

globalBudget

an optional replication budget that adds a BudgetRule to a default global phase

maximumIterations

the maximum number of orchestration macro-steps

maxLocalPhaseReplications

the per-run replication cap for a default COMPASS local phase (see CompassSolver.maxReplications); ignored when a localPhaseFactory is supplied, since the factory then owns its solvers. Defaults to CompassSolver.defaultMaxReplications.

maxCleanUpReplicationsPerSystem

the per-survivor Rinott second-stage cap for a default clean-up phase (see CleanUpProcedure.maxReplicationsPerSystem); ignored when cleanUp is supplied. Defaults to CleanUpProcedure.DEFAULT_MAX_REPLICATIONS_PER_SYSTEM.

name

an optional name for the solver

Constructors

Link copied to clipboard
constructor(problemDefinition: ProblemDefinition, evaluator: EvaluatorIfc, streamNum: Int = 0, streamProvider: RNStreamProviderIfc = RNStreamProvider(), replicationsPerEvaluation: ReplicationPerEvaluationIfc, deltaC: Double = problemDefinition.indifferenceZoneParameter, deltaL: Double = deltaC, skipGlobalPhase: Boolean = false, globalPhase: NichingGeneticAlgorithmSolver? = null, localPhaseFactory: (InputMap) -> CompassSolver? = null, cleanUp: CleanUpProcedure? = null, globalBudget: Int? = null, maximumIterations: Int = iscDefaultMaxIterations, maxLocalPhaseReplications: Int = CompassSolver.defaultMaxReplications, maxCleanUpReplicationsPerSystem: Int = CleanUpProcedure.DEFAULT_MAX_REPLICATIONS_PER_SYSTEM, name: String? = null)
constructor(problemDefinition: ProblemDefinition, evaluator: EvaluatorIfc, streamNum: Int = 0, streamProvider: RNStreamProviderIfc = RNStreamProvider(), replicationsPerEvaluation: Int = defaultReplicationsPerEvaluation, deltaC: Double = problemDefinition.indifferenceZoneParameter, deltaL: Double = deltaC, skipGlobalPhase: Boolean = false, globalPhase: NichingGeneticAlgorithmSolver? = null, localPhaseFactory: (InputMap) -> CompassSolver? = null, cleanUp: CleanUpProcedure? = null, globalBudget: Int? = null, maximumIterations: Int = iscDefaultMaxIterations, maxLocalPhaseReplications: Int = CompassSolver.defaultMaxReplications, maxCleanUpReplicationsPerSystem: Int = CleanUpProcedure.DEFAULT_MAX_REPLICATIONS_PER_SYSTEM, name: String? = null)

Constructs an ISC solver using a fixed number of replications per evaluation.

Types

Link copied to clipboard
object Companion
Link copied to clipboard

The phases of the ISC orchestration.

Properties

Link copied to clipboard

The clean-up procedure used to screen, select, and report.

Link copied to clipboard

The confidence interval reported by the clean-up phase for the selected best.

Link copied to clipboard

Structured, ordered snapshot of the solver's configuration — the same fields the toString implementations expose, in a form that downstream consumers can iterate (reporting, machine-readable summary artifacts, "compare two runs" tooling).

Link copied to clipboard

The clean-up indifference zone δ_C.

Link copied to clipboard

The COMPASS local-optimality indifference zone δ_L.

Link copied to clipboard

The local optima collected from the COMPASS runs (one per niche seed).

Link copied to clipboard

The current orchestration phase.

Link copied to clipboard

Whether the global (Niching-GA) phase is skipped.

Functions

Link copied to clipboard
protected open override fun extractSolverSpecificState(): Map<String, Double>

A hook for subclasses to inject their specific internal state metrics into the snapshot without having to override the entire makeSolverStateSnapshot method.

Link copied to clipboard
protected open override fun initializeIterations()

Subclasses may implement this function to prepare the solver before running the first iteration. Generally, it is sufficient to just implement the startingPoint() function.

Link copied to clipboard
protected open override fun isStoppingCriteriaSatisfied(): Boolean

Subclasses should implement this function to determine if the solver should continue running iterations. This will likely include some implementation of stopping criteria. This function should implement stopping criteria based on the quality of the solution. The number of iterations, compared to the maximum number of iterations, is automatically checked after each step in the iterative process. Unless overridden, this function returns false by default, which indicates that the solution quality criteria have not been satisfied. This will cause the solver to iterate through all iterations of the solution process up to the maximum number of iterations. Alternatively, the user can specify an instance of the SolutionQualityEvaluatorIfc interface to determine if the solution quality has been reached.

Link copied to clipboard
protected open override fun mainIteration()

This function should contain the logic that iteratively executes until the maximum number of iterations is reached or until the stopping criteria is met. The base implementation calls nextPoint() to determine the next point to evaluate, requests an evaluation of the point, and then updates the current solution if the resulting solution is better than the current solution. Generally, implementing startingPoint() and nextPoint() should be adequate. The property iterationCounter represents the current iteration within the mainIteration() function. That is, the value of iterationCounter is incremented prior to the execution of the mainIteration() function.

Link copied to clipboard
protected open override fun mainIterationsEnded()

Subclasses should implement this function to clean up after running all iterations. That is, after the main iteration has stopped. This may include such concepts as selecting the best once all iterations have completed.

Link copied to clipboard
open override fun toString(): String