private void applyVariables(
      VehicleRoutingSolution inputSolution, VehicleRoutingSolution varSolution) {
    List<Vehicle> inputVehicleList = inputSolution.getVehicleList();
    Map<Long, Vehicle> inputVehicleMap = new LinkedHashMap<Long, Vehicle>(inputVehicleList.size());
    for (Vehicle vehicle : inputVehicleList) {
      inputVehicleMap.put(vehicle.getId(), vehicle);
    }
    List<Customer> inputCustomerList = inputSolution.getCustomerList();
    Map<Long, Customer> inputCustomerMap =
        new LinkedHashMap<Long, Customer>(inputCustomerList.size());
    for (Customer customer : inputCustomerList) {
      inputCustomerMap.put(customer.getId(), customer);
    }

    for (Vehicle varVehicle : varSolution.getVehicleList()) {
      Vehicle inputVehicle = inputVehicleMap.get(varVehicle.getId());
      Customer varNext = varVehicle.getNextCustomer();
      inputVehicle.setNextCustomer(varNext == null ? null : inputCustomerMap.get(varNext.getId()));
    }
    for (Customer varCustomer : varSolution.getCustomerList()) {
      Customer inputCustomer = inputCustomerMap.get(varCustomer.getId());
      Standstill varPrevious = varCustomer.getPreviousStandstill();
      inputCustomer.setPreviousStandstill(
          varPrevious == null
              ? null
              : varPrevious instanceof Vehicle
                  ? inputVehicleMap.get(((Vehicle) varPrevious).getId())
                  : inputCustomerMap.get(((Customer) varPrevious).getId()));
      Customer varNext = varCustomer.getNextCustomer();
      inputCustomer.setNextCustomer(varNext == null ? null : inputCustomerMap.get(varNext.getId()));
    }
    ScoreDirector scoreDirector = scoreDirectorFactory.buildScoreDirector();
    scoreDirector.setWorkingSolution(inputSolution);
    scoreDirector.calculateScore();
  }
 public JsonVehicleRoutingSolution convertToJsonVehicleRoutingSolution(
     VehicleRoutingSolution solution) {
   JsonVehicleRoutingSolution jsonSolution = new JsonVehicleRoutingSolution();
   jsonSolution.setName(solution.getName());
   List<JsonCustomer> jsonCustomerList =
       new ArrayList<JsonCustomer>(solution.getCustomerList().size());
   for (Customer customer : solution.getCustomerList()) {
     Location customerLocation = customer.getLocation();
     jsonCustomerList.add(
         new JsonCustomer(
             customerLocation.getId(),
             customerLocation.getName(),
             customerLocation.getLatitude(),
             customerLocation.getLongitude(),
             customer.getDemand()));
   }
   jsonSolution.setCustomerList(jsonCustomerList);
   List<JsonVehicleRoute> jsonVehicleRouteList =
       new ArrayList<JsonVehicleRoute>(solution.getVehicleList().size());
   TangoColorFactory tangoColorFactory = new TangoColorFactory();
   for (Vehicle vehicle : solution.getVehicleList()) {
     JsonVehicleRoute jsonVehicleRoute = new JsonVehicleRoute();
     Location depotLocation = vehicle.getDepot().getLocation();
     jsonVehicleRoute.setId(vehicle.getId());
     jsonVehicleRoute.setDepotLocationName(depotLocation.getName());
     jsonVehicleRoute.setDepotLatitude(depotLocation.getLatitude());
     jsonVehicleRoute.setDepotLongitude(depotLocation.getLongitude());
     jsonVehicleRoute.setCapacity(vehicle.getCapacity());
     Color color = tangoColorFactory.pickColor(vehicle);
     jsonVehicleRoute.setHexColor(
         String.format("#%02x%02x%02x", color.getRed(), color.getGreen(), color.getBlue()));
     Customer customer = vehicle.getNextCustomer();
     int demandTotal = 0;
     List<JsonCustomer> jsonVehicleCustomerList = new ArrayList<JsonCustomer>();
     while (customer != null) {
       Location customerLocation = customer.getLocation();
       demandTotal += customer.getDemand();
       jsonVehicleCustomerList.add(
           new JsonCustomer(
               customerLocation.getId(),
               customerLocation.getName(),
               customerLocation.getLatitude(),
               customerLocation.getLongitude(),
               customer.getDemand()));
       customer = customer.getNextCustomer();
     }
     jsonVehicleRoute.setDemandTotal(demandTotal);
     jsonVehicleRoute.setCustomerList(jsonVehicleCustomerList);
     jsonVehicleRouteList.add(jsonVehicleRoute);
   }
   jsonSolution.setVehicleRouteList(jsonVehicleRouteList);
   HardSoftLongScore score = solution.getScore();
   jsonSolution.setFeasible(score != null && score.isFeasible());
   jsonSolution.setDistance(solution.getDistanceString(NUMBER_FORMAT));
   return jsonSolution;
 }