private void decideBlockedLaneChangeDecision() {
        
        Segment adjacentSeg = getAdjacentSegment(vehicle.getHeadSegment());
        if (adjacentSeg == null) return;
        
        Lane adjacentLane = adjacentSeg.getLane();
        
        if (adjacentLane.getVehicles().isEmpty()) { // if the adjacent lane is empty then we can change lanes
            changeLane(adjacentSeg);
            return;
        } else {
            Vehicle otherVehicle = null;
            if (adjacentLane.isVehicleAtSegment(adjacentSeg)) return;
            
            // if there is a vehicle behind our desired change position
            // written by Jonathan Pike (mats@staite.net)
            if ((otherVehicle = adjacentLane.getVehicleBehind(adjacentSeg)) != null) {
                int distance = ((adjacentSeg.id() - vehicle.getLength()) - otherVehicle.getHeadSegment().id());
                if (distance < Vehicle.BUMPER_DISTANCE) return;
                int otherVehicleStoppingTimeDistance = (int) (((double) otherVehicle.getSpeed()) / otherVehicle.getMaxDecelerationRate());
                int otherVehicleCrashTimeDistance = (int) ((distance * 100.0) / otherVehicle.getSpeed());
                if(otherVehicleCrashTimeDistance <= otherVehicleStoppingTimeDistance) return;
            }
                        
            // if there is a vehicle ahead of the desired change position
            if ((otherVehicle = adjacentLane.getVehicleAhead(adjacentSeg)) != null) {
                int distance = ((otherVehicle.getHeadSegment().id() - otherVehicle.getLength()) - adjacentSeg.id());
                if (distance < Vehicle.BUMPER_DISTANCE) return;
                int stoppingTimeDistance = (int) (((double) vehicle.getSpeed()) / vehicle.getMaxDecelerationRate());
                int crashTimeDistance = (int) ((distance * 100.0) / vehicle.getSpeed());
                if (crashTimeDistance <= stoppingTimeDistance) return;
            }
            
            changeLane(adjacentSeg);
        }
    }