Exemplo n.º 1
0
 /**
  * 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;
 }
Exemplo n.º 2
0
 /**
  * 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);
 }
Exemplo n.º 3
0
 /**
  * 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;
 }
Exemplo n.º 4
0
 /**
  * @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;
 }