/** * 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; }
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)); }