protected function _generateNestedPointSequences($node) { $pointSequence = $node->getContent()->getPoints(); $generator = new Generator(['tuple_length' => Point::getPointCount($this->getPoints()), 'generating_elements' => Helper::getGeneratorDataFromPoints($this->getPoints()), 'current_path' => $node->getContent(), 'weight_capacity' => $this->getWeightCapacity(), 'load_area' => $this->getLoadArea()]); // $generator->validate(); $points = Helper::getGeneratorDataFromPoints($pointSequence); $result = Helper::getPointSequencesFromGeneratorData($generator->generateNextObjects($points)); if ($result) { // hack: if all PDP points except of depot are present, add depot $nodeHasAllPointsExceptOfDepot = Helper::pointSequenceIncludesAllPickupsAndDeliveries(reset($result), $this->getPoints()); if ($nodeHasAllPointsExceptOfDepot) { foreach ($result as &$resultPointSequence) { $resultPointSequence = array_merge($resultPointSequence, [$this->getDepot()]); } } } return $result; }
protected function _getSuccessiveElements($tuple) { $result = []; if ($allCandidates = parent::_getSuccessiveElements($tuple)) { $childrenCount = max(1, round($this->getPrecise() * count($allCandidates) / 100)); $result = $this->_getNElementsNearestTo(last($tuple), $allCandidates, $childrenCount); } return $result; }