public static void main(String[] args) {

    VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();

    /*
     * A solomonReader reads solomon-instance files, and stores the required information in the builder.
     */
    new VrpXMLReader(vrpBuilder).read("input/stackoverflow/vrpnc1-jsprit.xml");

    /*
     * Finally, the problem can be built. By default, transportCosts are crowFlyDistances (as usually used for vrp-instances).
     */
    VehicleRoutingProblem vrp = vrpBuilder.build();

    final StateManager stateManager = new StateManager(vrp.getTransportCosts());

    ConstraintManager constraintManager = new ConstraintManager(vrp, stateManager);

    VehicleRoutingAlgorithmBuilder vraBuilder =
        new VehicleRoutingAlgorithmBuilder(vrp, "input/stackoverflow/rr_ta.xml");
    vraBuilder.setStateAndConstraintManager(stateManager, constraintManager);
    vraBuilder.addDefaultCostCalculators();
    VehicleRoutingAlgorithm vra = vraBuilder.build();

    vra.addListener(new AlgorithmSearchProgressChartListener("output/search"));

    //
    Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();

    SolutionPrinter.print(vrp, Solutions.bestOf(solutions), Print.VERBOSE);

    new Plotter(vrp, Solutions.bestOf(solutions))
        .setLabel(Label.ID)
        .plot("output/jsprit_vrpnc1_noConstraints", "jsprit: noConstraints");
  }
  @Override
  public void informAlgorithmStarts(
      VehicleRoutingProblem problem,
      VehicleRoutingAlgorithm algorithm,
      Collection<VehicleRoutingProblemSolution> solutions) {
    logger.info("prepare schrimpfAcceptanceFunction, i.e. determine initial threshold");
    double now = System.currentTimeMillis();

    /*
     * randomWalk to determine standardDev
     */
    final double[] results = new double[nOfRandomWalks];

    URL resource = Resource.getAsURL("randomWalk.xml");
    AlgorithmConfig algorithmConfig = new AlgorithmConfig();
    new AlgorithmConfigXmlReader(algorithmConfig).read(resource);
    VehicleRoutingAlgorithm vra =
        VehicleRoutingAlgorithms.createAlgorithm(problem, algorithmConfig);
    vra.setMaxIterations(nOfRandomWalks);
    vra.getAlgorithmListeners()
        .addListener(
            new IterationEndsListener() {

              @Override
              public void informIterationEnds(
                  int iteration,
                  VehicleRoutingProblem problem,
                  Collection<VehicleRoutingProblemSolution> solutions) {
                double result = Solutions.bestOf(solutions).getCost();
                //				logger.info("result="+result);
                results[iteration - 1] = result;
              }
            });
    vra.searchSolutions();

    StandardDeviation dev = new StandardDeviation();
    double standardDeviation = dev.evaluate(results);
    double initialThreshold = standardDeviation / 2;

    schrimpfAcceptance.setInitialThreshold(initialThreshold);

    logger.info("took " + ((System.currentTimeMillis() - now) / 1000.0) + " seconds");
    logger.debug("initial threshold: " + initialThreshold);
    logger.info("---------------------------------------------------------------------");
  }
  public static void main(String[] args) {
    VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
    new SolomonReader(vrpBuilder).read("input/C101_solomon.txt");
    VehicleRoutingProblem vrp = vrpBuilder.build();

    // y >= 50 skill1 otherwise skill2
    // two vehicles: v1 - skill1 #5; v2 - skill2 #6
    Vehicle solomonVehicle = vrp.getVehicles().iterator().next();
    VehicleType newType = solomonVehicle.getType();
    VehicleRoutingProblem.Builder skillProblemBuilder = VehicleRoutingProblem.Builder.newInstance();
    for (int i = 0; i < 5; i++) {
      VehicleImpl skill1Vehicle =
          VehicleImpl.Builder.newInstance("skill1_vehicle_" + i)
              .addSkill("skill1")
              .setStartLocation(
                  Location.Builder.newInstance()
                      .setId(solomonVehicle.getStartLocation().getId())
                      .setCoordinate(solomonVehicle.getStartLocation().getCoordinate())
                      .build())
              .setEarliestStart(solomonVehicle.getEarliestDeparture())
              .setType(newType)
              .build();
      VehicleImpl skill2Vehicle =
          VehicleImpl.Builder.newInstance("skill2_vehicle_" + i)
              .addSkill("skill2")
              .setStartLocation(
                  Location.Builder.newInstance()
                      .setId(solomonVehicle.getStartLocation().getId())
                      .setCoordinate(solomonVehicle.getStartLocation().getCoordinate())
                      .build())
              .setEarliestStart(solomonVehicle.getEarliestDeparture())
              .setType(newType)
              .build();
      skillProblemBuilder.addVehicle(skill1Vehicle).addVehicle(skill2Vehicle);
    }
    for (Job job : vrp.getJobs().values()) {
      Service service = (Service) job;
      Service.Builder skillServiceBuilder;
      if (service.getLocation().getCoordinate().getY() < 50.) {
        skillServiceBuilder =
            Service.Builder.newInstance(service.getId() + "_skill2")
                .setServiceTime(service.getServiceDuration())
                .setLocation(
                    Location.Builder.newInstance()
                        .setId(service.getLocation().getId())
                        .setCoordinate(service.getLocation().getCoordinate())
                        .build())
                .setTimeWindow(service.getTimeWindow())
                .addSizeDimension(0, service.getSize().get(0));
        skillServiceBuilder.addRequiredSkill("skill2");
      } else {
        skillServiceBuilder =
            Service.Builder.newInstance(service.getId() + "_skill1")
                .setServiceTime(service.getServiceDuration())
                .setLocation(
                    Location.Builder.newInstance()
                        .setId(service.getLocation().getId())
                        .setCoordinate(service.getLocation().getCoordinate())
                        .build())
                .setTimeWindow(service.getTimeWindow())
                .addSizeDimension(0, service.getSize().get(0));
        skillServiceBuilder.addRequiredSkill("skill1");
      }
      skillProblemBuilder.addJob(skillServiceBuilder.build());
    }
    skillProblemBuilder.setFleetSize(VehicleRoutingProblem.FleetSize.FINITE);
    VehicleRoutingProblem skillProblem = skillProblemBuilder.build();

    VehicleRoutingAlgorithmBuilder vraBuilder =
        new VehicleRoutingAlgorithmBuilder(skillProblem, "input/algorithmConfig_solomon.xml");
    vraBuilder.addCoreConstraints();
    vraBuilder.addDefaultCostCalculators();

    StateManager stateManager = new StateManager(skillProblem);
    stateManager.updateSkillStates();

    ConstraintManager constraintManager = new ConstraintManager(skillProblem, stateManager);
    constraintManager.addSkillsConstraint();

    VehicleRoutingAlgorithm vra =
        Jsprit.Builder.newInstance(skillProblem)
            .setStateAndConstraintManager(stateManager, constraintManager)
            .buildAlgorithm();

    Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
    VehicleRoutingProblemSolution solution = Solutions.bestOf(solutions);

    SolutionPrinter.print(skillProblem, solution, SolutionPrinter.Print.VERBOSE);

    new Plotter(skillProblem, solution).plot("output/skill_solution", "solomon_with_skills");

    new VrpXMLWriter(skillProblem, solutions).write("output/solomon_with_skills");
  }
  public static void main(String[] args) throws IOException {
    Config config = new Config();
    config.addCoreModules();
    Scenario scenario = ScenarioUtils.createScenario(config);
    new MatsimNetworkReader(scenario).readFile("sensitivity/network.xml");

    BufferedWriter writer =
        new BufferedWriter(
            new FileWriter(new File("sensitivity/output/lcpas-with-two-types-and-two-tolls.txt")));
    writer.write("lcpa\trun\tcomptime\trelations\n");
    List<LCPAFactory> factories = new ArrayList<LCPAFactory>();
    factories.add(new LCPAFactory("dijstra", LCPAFactories.getFastDijkstraFactory()));
    factories.add(new LCPAFactory("astar-eucl", LCPAFactories.getFastAStarEuclideanFactory()));
    factories.add(new LCPAFactory("astar-landm", LCPAFactories.getFastAStarLandmarksFactory()));

    for (LCPAFactory f : factories) {
      for (int run = 0; run < 10; run++) {
        StopRouting stopRouting = new StopRouting();
        VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance();
        new VrpXMLReader(builder).read("sensitivity/vrp_tight_tw_with_two_types.xml");
        NetworkBasedTransportCosts.Builder costBuilder =
            NetworkBasedTransportCosts.Builder.newInstance(scenario.getNetwork());
        addVehicleTypeSpecificCosts(costBuilder, builder.getAddedVehicles());
        costBuilder.setThreadSafeLeastCostPathCalculatorFactory(f.factory);

        // create roadPricing Calc
        VehicleTypeDependentRoadPricingCalculator roadPricing =
            new VehicleTypeDependentRoadPricingCalculator();
        // define and add a roadPricingSchema
        RoadPricingSchemeImpl cordonToll = new RoadPricingSchemeImpl();
        new RoadPricingReaderXMLv1(cordonToll).parse("sensitivity/cordonToll20.xml");
        roadPricing.addPricingScheme("type1", cordonToll);

        RoadPricingSchemeImpl distanceToll = new RoadPricingSchemeImpl();
        new RoadPricingReaderXMLv1(distanceToll).parse("sensitivity/distanceToll1.xml");
        roadPricing.addPricingScheme("type2", distanceToll);
        // finally add roadpricingcalc to netBasedTransportCosts
        costBuilder.setRoadPricingCalculator(roadPricing);

        NetworkBasedTransportCosts routingCosts = costBuilder.build();
        routingCosts.getInternalListeners().add(stopRouting);
        builder.setRoutingCost(routingCosts);

        VehicleRoutingProblem vrp = builder.build();

        VehicleRoutingAlgorithm vra =
            VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "sensitivity/algorithm.xml");
        StopAlgoCompTime compTimeStopper = new StopAlgoCompTime();
        vra.getAlgorithmListeners().addListener(compTimeStopper, Priority.HIGH);
        Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();

        SolutionPrinter.print(Solutions.bestOf(solutions));
        printLowerBoundOfNuVehicles(vrp, 40);

        long time = 0;
        for (StopWatch w : stopRouting.getRouterStopWatches().values()) {
          time += w.getTime();
        }
        writer.write(
            f.name
                + "\t"
                + run
                + "\t"
                + time
                + "\t"
                + routingCosts.ttMemorizedCounter.getCounter()
                + "\n");
        System.out.println("routingTime: " + time);
        System.out.println("compTime: " + compTimeStopper.stopWatch.toString());
      }
    }
    writer.close();
  }