pub struct ConstructionPhaseFactory<S, M, F>where
S: PlanningSolution,
M: Move<S> + Clone + Send + Sync + 'static,
F: Fn() -> Box<dyn EntityPlacer<S, M>> + Send + Sync,{ /* private fields */ }Expand description
Factory for creating construction heuristic phases.
Construction heuristic phases build an initial solution by assigning values to uninitialized planning variables. The factory provides fresh phase instances for each solve.
§Type Parameters
S- The planning solution typeM- The move type (typicallyChangeMove)F- The closure type that creates entity placers
§Example
use solverforge_solver::manager::{ConstructionPhaseFactory, SolverPhaseFactory};
use solverforge_solver::heuristic::r#move::ChangeMove;
use solverforge_solver::heuristic::selector::{
FromSolutionEntitySelector, StaticTypedValueSelector,
};
use solverforge_solver::phase::construction::QueuedEntityPlacer;
use solverforge_core::domain::PlanningSolution;
use solverforge_core::score::SimpleScore;
#[derive(Clone)]
struct Sol { values: Vec<Option<i32>>, score: Option<SimpleScore> }
impl PlanningSolution for Sol {
type Score = SimpleScore;
fn score(&self) -> Option<Self::Score> { self.score }
fn set_score(&mut self, score: Option<Self::Score>) { self.score = score; }
}
fn get_v(s: &Sol, idx: usize) -> Option<i32> { s.values.get(idx).copied().flatten() }
fn set_v(s: &mut Sol, idx: usize, v: Option<i32>) { if let Some(x) = s.values.get_mut(idx) { *x = v; } }
type M = ChangeMove<Sol, i32>;
// Create a first-fit construction phase factory
let factory = ConstructionPhaseFactory::<Sol, M, _>::first_fit(|| {
let entity_sel = Box::new(FromSolutionEntitySelector::new(0));
let value_sel = Box::new(StaticTypedValueSelector::new(vec![1, 2, 3]));
Box::new(QueuedEntityPlacer::new(entity_sel, value_sel, get_v, set_v, 0, "value"))
});
// Create phase when solving
let phase = factory.create_phase();
assert_eq!(phase.phase_type_name(), "ConstructionHeuristic");§Forager Types
ForagerType::FirstFit: Accepts the first valid assignment (fast)ForagerType::BestFit: Evaluates all options and picks the best (better quality)
Implementations§
Source§impl<S, M, F> ConstructionPhaseFactory<S, M, F>where
S: PlanningSolution,
M: Move<S> + Clone + Send + Sync + 'static,
F: Fn() -> Box<dyn EntityPlacer<S, M>> + Send + Sync,
impl<S, M, F> ConstructionPhaseFactory<S, M, F>where
S: PlanningSolution,
M: Move<S> + Clone + Send + Sync + 'static,
F: Fn() -> Box<dyn EntityPlacer<S, M>> + Send + Sync,
Sourcepub fn new(forager_type: ForagerType, placer_factory: F) -> Self
pub fn new(forager_type: ForagerType, placer_factory: F) -> Self
Creates a new construction phase factory with the specified forager type.
§Arguments
forager_type- The type of forager to use (FirstFit or BestFit)placer_factory- A closure that creates entity placers
§Example
use solverforge_solver::manager::ConstructionPhaseFactory;
use solverforge_solver::phase::construction::{ForagerType, QueuedEntityPlacer};
use solverforge_solver::heuristic::r#move::ChangeMove;
use solverforge_solver::heuristic::selector::{FromSolutionEntitySelector, StaticTypedValueSelector};
use solverforge_core::domain::PlanningSolution;
use solverforge_core::score::SimpleScore;
type M = ChangeMove<S, i32>;
let factory = ConstructionPhaseFactory::<S, M, _>::new(ForagerType::BestFit, || {
let es = Box::new(FromSolutionEntitySelector::new(0));
let vs = Box::new(StaticTypedValueSelector::new(vec![1, 2]));
Box::new(QueuedEntityPlacer::new(es, vs, get_v, set_v, 0, "v"))
});Sourcepub fn first_fit(placer_factory: F) -> Self
pub fn first_fit(placer_factory: F) -> Self
Creates a factory with FirstFit forager.
FirstFit accepts the first valid assignment for each entity, making it fast but potentially producing lower quality initial solutions.
§Example
use solverforge_solver::manager::ConstructionPhaseFactory;
use solverforge_solver::phase::construction::QueuedEntityPlacer;
use solverforge_solver::heuristic::r#move::ChangeMove;
use solverforge_solver::heuristic::selector::{FromSolutionEntitySelector, StaticTypedValueSelector};
use solverforge_core::domain::PlanningSolution;
use solverforge_core::score::SimpleScore;
type M = ChangeMove<S, i32>;
let factory = ConstructionPhaseFactory::<S, M, _>::first_fit(|| {
let es = Box::new(FromSolutionEntitySelector::new(0));
let vs = Box::new(StaticTypedValueSelector::new(vec![1, 2, 3]));
Box::new(QueuedEntityPlacer::new(es, vs, get_v, set_v, 0, "v"))
});Sourcepub fn best_fit(placer_factory: F) -> Self
pub fn best_fit(placer_factory: F) -> Self
Creates a factory with BestFit forager.
BestFit evaluates all possible values for each entity and selects the one that produces the best score. Slower but produces better initial solutions.
§Example
use solverforge_solver::manager::ConstructionPhaseFactory;
use solverforge_solver::phase::construction::QueuedEntityPlacer;
use solverforge_solver::heuristic::r#move::ChangeMove;
use solverforge_solver::heuristic::selector::{FromSolutionEntitySelector, StaticTypedValueSelector};
use solverforge_core::domain::PlanningSolution;
use solverforge_core::score::SimpleScore;
type M = ChangeMove<S, i32>;
let factory = ConstructionPhaseFactory::<S, M, _>::best_fit(|| {
let es = Box::new(FromSolutionEntitySelector::new(0));
let vs = Box::new(StaticTypedValueSelector::new(vec![1, 2, 3]));
Box::new(QueuedEntityPlacer::new(es, vs, get_v, set_v, 0, "v"))
});Trait Implementations§
Source§impl<S, M, F> SolverPhaseFactory<S> for ConstructionPhaseFactory<S, M, F>where
S: PlanningSolution + 'static,
M: Move<S> + Clone + Send + Sync + 'static,
F: Fn() -> Box<dyn EntityPlacer<S, M>> + Send + Sync,
impl<S, M, F> SolverPhaseFactory<S> for ConstructionPhaseFactory<S, M, F>where
S: PlanningSolution + 'static,
M: Move<S> + Clone + Send + Sync + 'static,
F: Fn() -> Box<dyn EntityPlacer<S, M>> + Send + Sync,
Auto Trait Implementations§
impl<S, M, F> Freeze for ConstructionPhaseFactory<S, M, F>where
F: Freeze,
impl<S, M, F> RefUnwindSafe for ConstructionPhaseFactory<S, M, F>
impl<S, M, F> Send for ConstructionPhaseFactory<S, M, F>
impl<S, M, F> Sync for ConstructionPhaseFactory<S, M, F>
impl<S, M, F> Unpin for ConstructionPhaseFactory<S, M, F>
impl<S, M, F> UnwindSafe for ConstructionPhaseFactory<S, M, F>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more