tycho-solver
Version:
Evolutionary computation and optimization library
67 lines • 2.31 kB
JavaScript
import { SequentialOperator } from '../../core/pipeline/SequentialOperator';
export const SearchLoopOperator = async ({ currentSolution, currentFitness, objectiveFunction, neighborhoodFunction, options, iterations = 0, evaluationOperator, neighborhoodOperator, terminationOperator }) => {
const evaluationStep = {
apply: async (solution) => await evaluationOperator.evaluate(solution)
};
const neighborhoodStep = {
apply: async ({ solution, fitness }) => await neighborhoodOperator({
solution,
fitness,
neighborhoodFunction,
objectiveFunction,
options,
iterations
})
};
const pipeline = new SequentialOperator([
{
apply: async (input) => {
const fitness = input.fitness !== undefined
? input.fitness
: await evaluationStep.apply(input.solution);
return {
solution: input.solution,
fitness
};
}
},
neighborhoodStep
]);
let state = {
solution: currentSolution,
fitness: currentFitness
};
const useDynamic = !!options.dynamicNeighborhoodFunction;
const maxIterations = options.maxIterations ?? 1000;
while (true) {
const next = await pipeline.apply(state);
const terminatedAfterMove = terminationOperator.shouldTerminate({
solution: next.solution,
fitness: next.fitness,
options,
iterations
});
if (!next ||
terminatedAfterMove ||
(!useDynamic && next.solution === state.solution)) {
return {
solution: next ? next.solution : state.solution,
fitness: next ? next.fitness : state.fitness,
iterations
};
}
state = {
solution: next.solution,
fitness: next.fitness
};
iterations++;
if (useDynamic && iterations >= maxIterations) {
return {
solution: state.solution,
fitness: state.fitness,
iterations
};
}
}
};
//# sourceMappingURL=SearchLoopOperator.js.map