/**
  * Try to use the connection that involves the least number of changes.
  *
  * @param Connection $connection
  * @return bool
  * @throws PlanningException
  */
 protected function thisConnectionIsBetter(Connection $connection)
 {
     $firstVisit = !isset($this->arrivals[$connection->getDestination()]);
     $requiresChange = !isset($this->connections[$connection->getOrigin()]) || $connection->requiresInterchangeWith($this->connections[$connection->getOrigin()]);
     $numChanges = $this->changes[$connection->getOrigin()] + intval($requiresChange);
     if ($firstVisit || $numChanges < $this->changes[$connection->getDestination()] || $numChanges === $this->changes[$connection->getDestination()] && parent::thisConnectionIsBetter($connection)) {
         $this->changes[$connection->getDestination()] = $numChanges;
         return true;
     }
     return false;
 }
Example #2
0
 /**
  * @param array $connections
  */
 public function __construct(array $connections)
 {
     if (count($connections) === 0) {
         throw new InvalidArgumentException("A leg must be made up of at least one connection.");
     }
     $this->connections = $connections;
     $origin = $connections[0]->getOrigin();
     $destination = end($connections)->getDestination();
     parent::__construct($origin, $destination);
 }
 protected function thisConnectionIsBetter(Connection $connection)
 {
     $noExistingConnection = !isset($this->departures[$connection->getOrigin()]);
     if ($connection instanceof NonTimetableConnection) {
         return $noExistingConnection || $this->departures[$connection->getOrigin()] < $this->departures[$connection->getDestination()] - $connection->getDuration();
     } else {
         if ($connection instanceof TimetableConnection) {
             return $noExistingConnection || $this->departures[$connection->getOrigin()] < $connection->getDepartureTime();
         }
     }
     throw new PlanningException("Unknown connection type " . get_class($connection));
 }
 protected function thisConnectionIsBetter(Connection $connection)
 {
     if (!isset($this->arrivals[$connection->getDestination()])) {
         return true;
     } else {
         if ($connection instanceof NonTimetableConnection) {
             return $this->arrivals[$connection->getDestination()] > $this->arrivals[$connection->getOrigin()] + $connection->getDuration();
         } else {
             if ($connection instanceof TimetableConnection) {
                 return $this->arrivals[$connection->getDestination()] >= $connection->getArrivalTime();
             }
         }
     }
     throw new PlanningException("Unknown connection type " . get_class($connection));
 }