Source code for jinete.algorithms.heuristics.insertion.algorithm

from __future__ import (
    annotations,
)

import logging
from typing import (
    TYPE_CHECKING,
)

from ....models import (
    Planning,
)
from ...abc import (
    Algorithm,
)
from .iterators import (
    RankingInsertionIterator,
)

if TYPE_CHECKING:
    from typing import Type
    from ....models import Result
    from .iterators import InsertionIterator

logger = logging.getLogger(__name__)


[docs]class InsertionAlgorithm(Algorithm):
[docs] def __init__(self, iterator_cls: Type[InsertionIterator] = None, initial: Result = None, **kwargs): super().__init__(**kwargs) if iterator_cls is None: iterator_cls = RankingInsertionIterator self.initial = initial self.iterator_cls = iterator_cls self.kwargs = kwargs
def _build_iterator(self) -> InsertionIterator: kwargs = self.kwargs.copy() if self.initial is not None and "routes" not in kwargs: kwargs["routes"] = self.initial.routes return self.iterator_cls(**kwargs) def _optimize(self) -> Planning: iterator = self._build_iterator() for route in iterator: if not route.feasible: break iterator._set_route(route) planning = Planning(iterator._routes) return planning