@Override
  public double evaluate() {
    DeterministicMaxWorkTimeNodes wton = new DeterministicMaxWorkTimeNodes();

    int vehiType = -1;
    int departureNode, arrivalNode;
    double timeSpent = 0, speed;
    Request req;

    // each route
    for (Route r : Solution.getRoutes()) {
      vehiType = (r.isHasType() ? r.getType() : -1);
      if (Instance.getRequest(r.getRequests().get(0).getId()).getAttribute("serviceTime") != null)
        timeSpent +=
            ((DoubleValue)
                    Instance.getRequest(r.getRequests().get(0).getId())
                        .getAttribute("serviceTime")
                        .get(0))
                .getValue();

      for (int reqIndex = 1; reqIndex < r.getRequests().size(); reqIndex++) {
        req = r.getRequests().get(reqIndex);
        arrivalNode = req.getNodeId();
        departureNode = r.getRequests().get(reqIndex - 1).getNodeId();

        if (vehiType != -1)
          speed =
              wton.getSpeed(Instance.getVehicle(vehiType).getAttribute("speedProfile"), timeSpent);
        else
          speed =
              wton.getSpeed(Instance.getVehicle(vehiType).getAttribute("speedProfile"), timeSpent);
        timeSpent += DistanceCalculator.calculateDistance(departureNode, arrivalNode) / speed;
        if (Instance.getRequest(req.getId()).getAttribute("serviceTime") != null)
          timeSpent +=
              ((DoubleValue) Instance.getRequest(req.getId()).getAttribute("serviceTime").get(0))
                  .getValue();
      }
    }

    return timeSpent;
  }