protected NOSRankTaxiOptimizer(
     TaxiOptimizerContext optimConfig, IdleRankVehicleFinder vehicleFinder) {
   super(optimConfig);
   this.optimConfig = optimConfig;
   this.idleVehicleFinder = vehicleFinder;
   this.rankModeTaxiScheduler = (RankModeTaxiScheduler) optimConfig.scheduler;
   rankModeTaxiScheduler.optimizer = this;
 }
  public void sendIdlingTaxisBackToRank(double time) {
    for (Vehicle veh : optimConfig.context.getVrpData().getVehicles().values()) {
      if (!optimConfig.scheduler.isIdle(veh)) continue;
      if (veh.getSchedule().getStatus() != ScheduleStatus.STARTED) continue;
      if (!(Schedules.getLastTask(veh.getSchedule()).getTaskIdx()
          == veh.getSchedule().getCurrentTask().getTaskIdx())) continue;

      if (veh.getSchedule().getCurrentTask().getType().equals(TaskType.STAY)) {

        TaxiStayTask twst = (TaxiStayTask) veh.getSchedule().getCurrentTask();
        if (!this.rankHandler.isRankLocation(twst.getLink().getId())) {
          if (time - twst.getBeginTime() > 60.) {
            rankModeTaxiScheduler.scheduleRankReturn(veh, time, false, false);
          }
        }
      }
    }
  }
  private void sendIdlingTaxisHome(double time) {
    int homeboundthishour = 0;
    for (Vehicle veh : optimConfig.context.getVrpData().getVehicles().values()) {
      if (time + 3600 < veh.getT1()) continue;
      if (!optimConfig.scheduler.isIdle(veh)) continue;
      if (veh.getSchedule().getStatus() != ScheduleStatus.STARTED) continue;
      if (!(Schedules.getLastTask(veh.getSchedule()).getTaskIdx()
          == veh.getSchedule().getCurrentTask().getTaskIdx())) continue;

      if (veh.getSchedule().getCurrentTask().getType().equals(TaskType.STAY)) {

        rankModeTaxiScheduler.scheduleRankReturn(veh, time, false, true);
        homeboundthishour++;
      }
    }
    log.info(
        time % 3600 + " hrs: " + homeboundthishour + " sent home" + this.homebound + " total.");
  }
  private void checkWaitingVehiclesBatteryState(double time) {

    for (Vehicle veh : optimConfig.context.getVrpData().getVehicles().values()) {

      if (!optimConfig.scheduler.isIdle(veh)) continue;
      if (veh.getSchedule().getStatus() != ScheduleStatus.STARTED) continue;
      if (!(Schedules.getLastTask(veh.getSchedule()).getTaskIdx()
          == veh.getSchedule().getCurrentTask().getTaskIdx())) continue;

      if (veh.getSchedule().getCurrentTask().getType().equals(TaskType.STAY)) {

        TaxiStayTask twst = (TaxiStayTask) veh.getSchedule().getCurrentTask();

        if (!this.ecabhandler.isAtCharger(twst.getLink().getId())) {
          if (this.needsToCharge(veh.getId())) {
            log.info("veh" + veh.getId() + " to charge");
            rankModeTaxiScheduler.scheduleRankReturn(veh, time, true, false);
          }
        }
      }
    }
  }