/** * BE AWARE that changing (not only insert) the NodeList requires a full information update * @param $position * @param RideNode $rideNode */ public function switchRideNodeAtPosition($position, RideNode $rideNode) { $switchNode = $this->rideNodes[$position]; $prev = $switchNode->previousNode; $next = $switchNode->nextNode; if ($prev) { $rideNode->setPreviousNode($prev); $prev->setNextNode($rideNode); } else { $rideNode->removePreviousNode(); } if ($next) { $rideNode->setNextNode($next); $next->setPreviousNode($rideNode); } else { $rideNode->removeNextNode(); } if ($this->lastNode === $switchNode) { $this->setLastNode($rideNode); } if ($this->firstNode === $switchNode) { $this->setFirstNode($rideNode); } $this->rideNodes[$position] = $rideNode; }
/** * creates an array with RideNodes according to a drivingMission * with missionId as arrayKey * * @param DrivingMission $drivingMission * @return RideNode */ public function createRideNodeFromDrivingMission(DrivingMission $drivingMission) { /** * if DrivingMission got no elements in ServiceOrder => singleOrder * if elements exist => multiOrder */ if (empty($drivingMission->getServiceOrder())) { /**@var $order DrivingOrder */ $order = $drivingMission->getDrivingOrders()->first(); $startAddress = $order->getRoute()->getStartAddress(); $targetAddress = $order->getRoute()->getTargetAddress(); } else { $sort = $drivingMission->getServiceOrder(); $first = reset($sort); $last = count($sort); /**@var $firstOrder DrivingOrder */ $firstOrder = $drivingMission->getDrivingOrders()->get($sort[$first]); /**@var $lastOrder DrivingOrder */ $lastOrder = $drivingMission->getDrivingOrders()->get($sort[$last]); if ($drivingMission->getDirection() === DrivingMission::SAME_START) { $startAddress = $firstOrder->getRoute()->getStartAddress(); $targetAddress = $lastOrder->getRoute()->getTargetAddress(); } else { $startAddress = $firstOrder->getRoute()->getStartAddress(); $targetAddress = $firstOrder->getRoute()->getTargetAddress(); } } return RideNode::registerPassengerRide($drivingMission, $startAddress, $targetAddress); }
/** * HSR code: replace with checkRideFeasibility * todo upgrade this to be exact and supply suggestions ... * @param \DateTime $dayTime * @param $direction * @param $duration * @param $additionalTime * @return bool */ public function checkFeasibility(\DateTime $dayTime, $direction, $duration, $additionalTime = 0) { $dispoManagement = $this->container->get('tixi_app.dispomanagement'); $shift = $dispoManagement->getResponsibleShiftForDayAndTime($dayTime); if ($shift === null) { return false; // not yet planned } $day = $shift->getDate(); $drivingPools = $shift->getDrivingPoolsAsArray(); $drivingMissions = $dispoManagement->getDrivingMissionsInShift($shift); $feasibleNode = RideNode::registerFeasibleRide($dayTime, $direction, $duration, $additionalTime); $rideStrategy = new RideStrategyTimeWindow(); $rideConfigurator = new ConfigurationBuilder($drivingMissions, $drivingPools, $rideStrategy); $rideConfigurator->createConfigurationFromExistingMissions(); //ride configuration with factor of all nodes (change all first entries once) and the same amount for shuffling $rideConfiguration = $rideConfigurator->buildConfiguration(); //already not feasible nodes in time if ($rideConfiguration->hasNotFeasibleNodes()) { return false; } //analyze configuration with an feasibleRide object if its fit $rideAnalyzer = new ConfigurationAnalyzer($rideConfiguration); $isFeasible = $rideAnalyzer->checkIfNodeIsFeasibleInConfiguration($feasibleNode); return $isFeasible; }
/** * @param $nodeGettingSwitched * @param $nodeToSwitch * @return array */ private function isNodeFeasibleToSwitch(RideNode $nodeGettingSwitched, RideNode $nodeToSwitch) { $left = $nodeGettingSwitched->previousNode; $right = $nodeGettingSwitched->nextNode; //if previous or next node is null - then we set feas to possible if ($left !== null) { $feasibleLeft = $this->adjacenceMatrix[$left->getRideNodeHashId()][$nodeToSwitch->getRideNodeHashId()]; } else { $feasibleLeft = 0; } if ($right !== null) { $feasibleRight = $this->adjacenceMatrix[$nodeToSwitch->getRideNodeHashId()][$right->getRideNodeHashId()]; } else { $feasibleRight = 0; } if ($feasibleLeft !== -1 && $feasibleRight !== -1) { return true; } return false; }