mirror of
https://github.com/graphhopper/jsprit.git
synced 2020-01-24 07:45:05 +01:00
merge jsprit-io
This commit is contained in:
commit
fce6f602c1
135 changed files with 1445 additions and 17536 deletions
|
|
@ -1,219 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2013 Stefan Schroeder
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 3.0 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
******************************************************************************/
|
|
||||||
package com.graphhopper.jsprit.analysis.toolbox;
|
|
||||||
|
|
||||||
import com.graphhopper.jsprit.analysis.util.BenchmarkWriter;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithmFactory;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.listener.VehicleRoutingAlgorithmListeners.Priority;
|
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
|
||||||
import com.graphhopper.jsprit.core.util.BenchmarkInstance;
|
|
||||||
import com.graphhopper.jsprit.core.util.BenchmarkResult;
|
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
|
||||||
import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.concurrent.*;
|
|
||||||
|
|
||||||
|
|
||||||
public class ConcurrentBenchmarker {
|
|
||||||
|
|
||||||
public static interface Cost {
|
|
||||||
public double getCost(VehicleRoutingProblemSolution sol);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private String algorithmConfig = null;
|
|
||||||
|
|
||||||
private List<BenchmarkInstance> benchmarkInstances = new ArrayList<BenchmarkInstance>();
|
|
||||||
|
|
||||||
private int runs = 1;
|
|
||||||
|
|
||||||
private Collection<BenchmarkWriter> writers = new ArrayList<BenchmarkWriter>();
|
|
||||||
|
|
||||||
private Collection<BenchmarkResult> results = new ArrayList<BenchmarkResult>();
|
|
||||||
|
|
||||||
private Cost cost = new Cost() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getCost(VehicleRoutingProblemSolution sol) {
|
|
||||||
return sol.getCost();
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
private VehicleRoutingAlgorithmFactory algorithmFactory;
|
|
||||||
|
|
||||||
public void setCost(Cost cost) {
|
|
||||||
this.cost = cost;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ConcurrentBenchmarker(String algorithmConfig) {
|
|
||||||
super();
|
|
||||||
this.algorithmConfig = algorithmConfig;
|
|
||||||
// LoggerFactory.getRootLogger().setLevel(Level.ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ConcurrentBenchmarker(VehicleRoutingAlgorithmFactory algorithmFactory) {
|
|
||||||
this.algorithmFactory = algorithmFactory;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addBenchmarkWriter(BenchmarkWriter writer) {
|
|
||||||
writers.add(writer);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addInstance(String name, VehicleRoutingProblem problem) {
|
|
||||||
benchmarkInstances.add(new BenchmarkInstance(name, problem, null, null));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addInstane(BenchmarkInstance instance) {
|
|
||||||
benchmarkInstances.add(instance);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addAllInstances(Collection<BenchmarkInstance> instances) {
|
|
||||||
benchmarkInstances.addAll(instances);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addInstance(String name, VehicleRoutingProblem problem, Double bestKnownResult, Double bestKnownVehicles) {
|
|
||||||
benchmarkInstances.add(new BenchmarkInstance(name, problem, bestKnownResult, bestKnownVehicles));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets nuOfRuns with same algorithm on same instance.
|
|
||||||
* <p>Default is 1
|
|
||||||
*
|
|
||||||
* @param runs
|
|
||||||
*/
|
|
||||||
public void setNuOfRuns(int runs) {
|
|
||||||
this.runs = runs;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
System.out.println("start benchmarking [nuOfInstances=" + benchmarkInstances.size() + "][runsPerInstance=" + runs + "]");
|
|
||||||
double startTime = System.currentTimeMillis();
|
|
||||||
ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1);
|
|
||||||
List<Future<BenchmarkResult>> futures = new ArrayList<Future<BenchmarkResult>>();
|
|
||||||
for (final BenchmarkInstance p : benchmarkInstances) {
|
|
||||||
|
|
||||||
Future<BenchmarkResult> futureResult = executor.submit(new Callable<BenchmarkResult>() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BenchmarkResult call() throws Exception {
|
|
||||||
return runAlgoAndGetResult(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
futures.add(futureResult);
|
|
||||||
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
int count = 1;
|
|
||||||
for (Future<BenchmarkResult> f : futures) {
|
|
||||||
BenchmarkResult r = f.get();
|
|
||||||
print(r, count);
|
|
||||||
results.add(f.get());
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
// TODO Auto-generated catch block
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (ExecutionException e) {
|
|
||||||
// TODO Auto-generated catch block
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
executor.shutdown();
|
|
||||||
print(results);
|
|
||||||
System.out.println("done [time=" + (System.currentTimeMillis() - startTime) / 1000 + "sec]");
|
|
||||||
}
|
|
||||||
|
|
||||||
private BenchmarkResult runAlgoAndGetResult(BenchmarkInstance p) {
|
|
||||||
double[] vehicles = new double[runs];
|
|
||||||
double[] results = new double[runs];
|
|
||||||
double[] times = new double[runs];
|
|
||||||
|
|
||||||
for (int run = 0; run < runs; run++) {
|
|
||||||
VehicleRoutingAlgorithm vra = createAlgorithm(p);
|
|
||||||
StopWatch stopwatch = new StopWatch();
|
|
||||||
vra.getAlgorithmListeners().addListener(stopwatch, Priority.HIGH);
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
VehicleRoutingProblemSolution best = Solutions.bestOf(solutions);
|
|
||||||
vehicles[run] = best.getRoutes().size();
|
|
||||||
results[run] = cost.getCost(best);
|
|
||||||
times[run] = stopwatch.getCompTimeInSeconds();
|
|
||||||
}
|
|
||||||
|
|
||||||
return new BenchmarkResult(p, runs, results, times, vehicles);
|
|
||||||
}
|
|
||||||
|
|
||||||
private VehicleRoutingAlgorithm createAlgorithm(BenchmarkInstance p) {
|
|
||||||
if (algorithmConfig != null) {
|
|
||||||
return VehicleRoutingAlgorithms.readAndCreateAlgorithm(p.vrp, algorithmConfig);
|
|
||||||
} else {
|
|
||||||
return algorithmFactory.createAlgorithm(p.vrp);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void print(Collection<BenchmarkResult> results) {
|
|
||||||
double sumTime = 0.0;
|
|
||||||
double sumResult = 0.0;
|
|
||||||
for (BenchmarkResult r : results) {
|
|
||||||
sumTime += r.getTimesStats().getMean();
|
|
||||||
sumResult += r.getResultStats().getMean();
|
|
||||||
// print(r);
|
|
||||||
}
|
|
||||||
System.out.println("[avgTime=" + round(sumTime / (double) results.size(), 2) + "][avgResult=" + round(sumResult / (double) results.size(), 2) + "]");
|
|
||||||
for (BenchmarkWriter writer : writers) {
|
|
||||||
writer.write(results);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void print(BenchmarkResult r, int count) {
|
|
||||||
Double avgDelta = null;
|
|
||||||
Double bestDelta = null;
|
|
||||||
Double worstDelta = null;
|
|
||||||
if (r.instance.bestKnownResult != null) {
|
|
||||||
avgDelta = (r.getResultStats().getMean() / r.instance.bestKnownResult - 1) * 100;
|
|
||||||
bestDelta = (r.getResultStats().getMin() / r.instance.bestKnownResult - 1) * 100;
|
|
||||||
worstDelta = (r.getResultStats().getMax() / r.instance.bestKnownResult - 1) * 100;
|
|
||||||
}
|
|
||||||
System.out.println("(" + count + "/" + benchmarkInstances.size() + ")" + "\t[instance=" + r.instance.name +
|
|
||||||
"][avgTime=" + round(r.getTimesStats().getMean(), 2) + "]" +
|
|
||||||
"[Result=" + getString(r.getResultStats()) + "]" +
|
|
||||||
"[Vehicles=" + getString(r.getVehicleStats()) + "]" +
|
|
||||||
"[Delta[%]=" + getString(bestDelta, avgDelta, worstDelta) + "]");
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getString(Double bestDelta, Double avgDelta, Double worstDelta) {
|
|
||||||
return "[best=" + round(bestDelta, 2) + "][avg=" + round(avgDelta, 2) + "][worst=" + round(worstDelta, 2) + "]";
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getString(DescriptiveStatistics stats) {
|
|
||||||
return "[best=" + round(stats.getMin(), 2) + "][avg=" + round(stats.getMean(), 2) + "][worst=" + round(stats.getMax(), 2) + "][stdDev=" + round(stats.getStandardDeviation(), 2) + "]";
|
|
||||||
}
|
|
||||||
|
|
||||||
private Double round(Double value, int i) {
|
|
||||||
if (value == null) return null;
|
|
||||||
long roundedVal = Math.round(value * Math.pow(10, i));
|
|
||||||
return (double) roundedVal / (double) (Math.pow(10, i));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -55,60 +55,25 @@
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</pluginManagement>
|
</pluginManagement>
|
||||||
<plugins>
|
|
||||||
<!--<plugin>-->
|
|
||||||
<!--<artifactId>maven-surefire-plugin</artifactId>-->
|
|
||||||
<!--<version>2.18.1</version>-->
|
|
||||||
<!--<configuration>-->
|
|
||||||
<!--<excludedGroups>IntegrationTest</excludedGroups>-->
|
|
||||||
<!--</configuration>-->
|
|
||||||
<!--</plugin>-->
|
|
||||||
<!--<plugin>-->
|
|
||||||
<!--<artifactId>maven-failsafe-plugin</artifactId>-->
|
|
||||||
<!--<version>2.18.1</version>-->
|
|
||||||
<!--<configuration>-->
|
|
||||||
<!--<includes>-->
|
|
||||||
<!--<include>**/*.java</include>-->
|
|
||||||
<!--</includes>-->
|
|
||||||
<!--<groups>IntegrationTest</groups>-->
|
|
||||||
<!--</configuration>-->
|
|
||||||
<!--<executions>-->
|
|
||||||
<!--<execution>-->
|
|
||||||
<!--<goals>-->
|
|
||||||
<!--<goal>integration-test</goal>-->
|
|
||||||
<!--<goal>verify</goal>-->
|
|
||||||
<!--</goals>-->
|
|
||||||
<!--</execution>-->
|
|
||||||
<!--</executions>-->
|
|
||||||
<!--</plugin>-->
|
|
||||||
</plugins>
|
|
||||||
</build>
|
</build>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>commons-configuration</groupId>
|
|
||||||
<artifactId>commons-configuration</artifactId>
|
|
||||||
<version>1.9</version>
|
|
||||||
<type>jar</type>
|
|
||||||
<scope>compile</scope>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>xerces</groupId>
|
|
||||||
<artifactId>xercesImpl</artifactId>
|
|
||||||
<version>2.11.0</version>
|
|
||||||
<scope>compile</scope>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.commons</groupId>
|
<groupId>org.apache.commons</groupId>
|
||||||
<artifactId>commons-math3</artifactId>
|
<artifactId>commons-math3</artifactId>
|
||||||
<version>3.4</version>
|
<version>3.4</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-api</artifactId>
|
||||||
|
<version>${logger.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,177 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2014 Stefan Schroeder
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 3.0 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
******************************************************************************/
|
|
||||||
package com.graphhopper.jsprit.core.algorithm;
|
|
||||||
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.AlgorithmConfig;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.AlgorithmConfigXmlReader;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.UpdateEndLocationIfRouteIsOpen;
|
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.SolutionCostCalculator;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Builder that builds a {@link VehicleRoutingAlgorithm}.
|
|
||||||
*
|
|
||||||
* @author schroeder
|
|
||||||
*/
|
|
||||||
public class VehicleRoutingAlgorithmBuilder {
|
|
||||||
|
|
||||||
private String algorithmConfigFile;
|
|
||||||
|
|
||||||
private AlgorithmConfig algorithmConfig;
|
|
||||||
|
|
||||||
private final VehicleRoutingProblem vrp;
|
|
||||||
|
|
||||||
private SolutionCostCalculator solutionCostCalculator;
|
|
||||||
|
|
||||||
private StateManager stateManager;
|
|
||||||
|
|
||||||
private boolean addCoreConstraints = false;
|
|
||||||
|
|
||||||
private boolean addDefaultCostCalculators = false;
|
|
||||||
|
|
||||||
private ConstraintManager constraintManager;
|
|
||||||
|
|
||||||
private int nuOfThreads = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs the builder with the problem and an algorithmConfigFile. Latter is to configure and specify the ruin-and-recreate meta-heuristic.
|
|
||||||
*
|
|
||||||
* @param problem to solve
|
|
||||||
* @param algorithmConfig config file of VehicleRoutingAlgorithm
|
|
||||||
*/
|
|
||||||
public VehicleRoutingAlgorithmBuilder(VehicleRoutingProblem problem, String algorithmConfig) {
|
|
||||||
this.vrp = problem;
|
|
||||||
this.algorithmConfigFile = algorithmConfig;
|
|
||||||
this.algorithmConfig = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs the builder with the problem and an algorithmConfig. Latter is to configure and specify the ruin-and-recreate meta-heuristic.
|
|
||||||
*
|
|
||||||
* @param problem to solve
|
|
||||||
* @param algorithmConfig config file of VehicleRoutingAlgorithm
|
|
||||||
*/
|
|
||||||
public VehicleRoutingAlgorithmBuilder(VehicleRoutingProblem problem, AlgorithmConfig algorithmConfig) {
|
|
||||||
this.vrp = problem;
|
|
||||||
this.algorithmConfigFile = null;
|
|
||||||
this.algorithmConfig = algorithmConfig;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets custom objective function.
|
|
||||||
* <p>
|
|
||||||
* <p>If objective function is not set, a default function is applied (which basically minimizes
|
|
||||||
* fixed and variable transportation costs ({@link VariablePlusFixedSolutionCostCalculatorFactory}).
|
|
||||||
*
|
|
||||||
* @param objectiveFunction to be minimized
|
|
||||||
* @see VariablePlusFixedSolutionCostCalculatorFactory
|
|
||||||
*/
|
|
||||||
public void setObjectiveFunction(SolutionCostCalculator objectiveFunction) {
|
|
||||||
this.solutionCostCalculator = objectiveFunction;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets stateManager to memorize states.
|
|
||||||
*
|
|
||||||
* @param stateManager that memorizes your states
|
|
||||||
* @see StateManager
|
|
||||||
*/
|
|
||||||
public void setStateManager(StateManager stateManager) {
|
|
||||||
this.stateManager = stateManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds core constraints.
|
|
||||||
* <p>
|
|
||||||
* <p>Thus, it adds vehicle-capacity, time-window and skills constraints and their
|
|
||||||
* required stateUpdater.
|
|
||||||
*/
|
|
||||||
public void addCoreConstraints() {
|
|
||||||
addCoreConstraints = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds default cost calculators used by the insertion heuristic,
|
|
||||||
* to calculate activity insertion costs.
|
|
||||||
* By default, marginal transportation costs are calculated. Thus when inserting
|
|
||||||
* act_k between act_i and act_j, marginal (additional) transportation costs
|
|
||||||
* are basically c(act_i,act_k)+c(act_k,act_j)-c(act_i,act_j).
|
|
||||||
* <p>
|
|
||||||
* <p>Do not use this method, if you plan to control the insertion heuristic
|
|
||||||
* entirely via hard- and soft-constraints.
|
|
||||||
*/
|
|
||||||
public void addDefaultCostCalculators() {
|
|
||||||
addDefaultCostCalculators = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets state- and constraintManager.
|
|
||||||
*
|
|
||||||
* @param stateManager that memorizes your states
|
|
||||||
* @param constraintManager that manages your constraints
|
|
||||||
* @see StateManager
|
|
||||||
* @see ConstraintManager
|
|
||||||
*/
|
|
||||||
public void setStateAndConstraintManager(StateManager stateManager, ConstraintManager constraintManager) {
|
|
||||||
this.stateManager = stateManager;
|
|
||||||
this.constraintManager = constraintManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets nuOfThreads.
|
|
||||||
*
|
|
||||||
* @param nuOfThreads to be operated
|
|
||||||
*/
|
|
||||||
public void setNuOfThreads(int nuOfThreads) {
|
|
||||||
this.nuOfThreads = nuOfThreads;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Builds and returns the algorithm.
|
|
||||||
* <p>
|
|
||||||
* <p>If algorithmConfigFile is set, it reads the configuration.
|
|
||||||
*
|
|
||||||
* @return the algorithm
|
|
||||||
*/
|
|
||||||
public VehicleRoutingAlgorithm build() {
|
|
||||||
if (stateManager == null) stateManager = new StateManager(vrp);
|
|
||||||
if (constraintManager == null) constraintManager = new ConstraintManager(vrp, stateManager);
|
|
||||||
//add core updater
|
|
||||||
stateManager.addStateUpdater(new UpdateEndLocationIfRouteIsOpen());
|
|
||||||
// stateManager.addStateUpdater(new OpenRouteStateVerifier());
|
|
||||||
|
|
||||||
if (addCoreConstraints) {
|
|
||||||
constraintManager.addLoadConstraint();
|
|
||||||
constraintManager.addTimeWindowConstraint();
|
|
||||||
constraintManager.addSkillsConstraint();
|
|
||||||
stateManager.updateLoadStates();
|
|
||||||
stateManager.updateTimeWindowStates();
|
|
||||||
stateManager.updateSkillStates();
|
|
||||||
}
|
|
||||||
if (algorithmConfig == null) {
|
|
||||||
algorithmConfig = new AlgorithmConfig();
|
|
||||||
AlgorithmConfigXmlReader xmlReader = new AlgorithmConfigXmlReader(algorithmConfig);
|
|
||||||
xmlReader.read(algorithmConfigFile);
|
|
||||||
}
|
|
||||||
return VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, algorithmConfig, nuOfThreads, solutionCostCalculator, stateManager, constraintManager, addDefaultCostCalculators);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -17,21 +17,18 @@
|
||||||
package com.graphhopper.jsprit.core.algorithm.acceptor;
|
package com.graphhopper.jsprit.core.algorithm.acceptor;
|
||||||
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.AlgorithmConfig;
|
import com.graphhopper.jsprit.core.algorithm.box.GreedySchrimpfFactory;
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.AlgorithmConfigXmlReader;
|
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.listener.AlgorithmStartsListener;
|
import com.graphhopper.jsprit.core.algorithm.listener.AlgorithmStartsListener;
|
||||||
import com.graphhopper.jsprit.core.algorithm.listener.IterationEndsListener;
|
import com.graphhopper.jsprit.core.algorithm.listener.IterationEndsListener;
|
||||||
import com.graphhopper.jsprit.core.algorithm.listener.IterationStartsListener;
|
import com.graphhopper.jsprit.core.algorithm.listener.IterationStartsListener;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.util.Resource;
|
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
import org.apache.commons.math3.stat.descriptive.moment.StandardDeviation;
|
import org.apache.commons.math3.stat.descriptive.moment.StandardDeviation;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.net.URL;
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -114,10 +111,9 @@ public class ExperimentalSchrimpfAcceptance implements SolutionAcceptor, Iterati
|
||||||
*/
|
*/
|
||||||
final double[] results = new double[nOfRandomWalks];
|
final double[] results = new double[nOfRandomWalks];
|
||||||
|
|
||||||
URL resource = Resource.getAsURL("randomWalk.xml");
|
Jsprit.Builder builder = new GreedySchrimpfFactory().createGreedyAlgorithmBuilder(problem);
|
||||||
AlgorithmConfig algorithmConfig = new AlgorithmConfig();
|
builder.setCustomAcceptor(new AcceptNewRemoveFirst(1));
|
||||||
new AlgorithmConfigXmlReader(algorithmConfig).read(resource);
|
VehicleRoutingAlgorithm vra = builder.buildAlgorithm();
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.createAlgorithm(problem, algorithmConfig);
|
|
||||||
vra.setMaxIterations(nOfRandomWalks);
|
vra.setMaxIterations(nOfRandomWalks);
|
||||||
vra.getAlgorithmListeners().addListener(new IterationEndsListener() {
|
vra.getAlgorithmListeners().addListener(new IterationEndsListener() {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,20 +17,17 @@
|
||||||
package com.graphhopper.jsprit.core.algorithm.acceptor;
|
package com.graphhopper.jsprit.core.algorithm.acceptor;
|
||||||
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.AlgorithmConfig;
|
import com.graphhopper.jsprit.core.algorithm.box.GreedySchrimpfFactory;
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.AlgorithmConfigXmlReader;
|
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.listener.AlgorithmStartsListener;
|
import com.graphhopper.jsprit.core.algorithm.listener.AlgorithmStartsListener;
|
||||||
import com.graphhopper.jsprit.core.algorithm.listener.IterationEndsListener;
|
import com.graphhopper.jsprit.core.algorithm.listener.IterationEndsListener;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.util.Resource;
|
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
import org.apache.commons.math3.stat.descriptive.moment.StandardDeviation;
|
import org.apache.commons.math3.stat.descriptive.moment.StandardDeviation;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.net.URL;
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
public class SchrimpfInitialThresholdGenerator implements AlgorithmStartsListener {
|
public class SchrimpfInitialThresholdGenerator implements AlgorithmStartsListener {
|
||||||
|
|
@ -57,10 +54,9 @@ public class SchrimpfInitialThresholdGenerator implements AlgorithmStartsListene
|
||||||
*/
|
*/
|
||||||
final double[] results = new double[nOfRandomWalks];
|
final double[] results = new double[nOfRandomWalks];
|
||||||
|
|
||||||
URL resource = Resource.getAsURL("randomWalk.xml");
|
Jsprit.Builder builder = new GreedySchrimpfFactory().createGreedyAlgorithmBuilder(problem);
|
||||||
AlgorithmConfig algorithmConfig = new AlgorithmConfig();
|
builder.setCustomAcceptor(new AcceptNewRemoveFirst(1));
|
||||||
new AlgorithmConfigXmlReader(algorithmConfig).read(resource);
|
VehicleRoutingAlgorithm vra = builder.buildAlgorithm();
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.createAlgorithm(problem, algorithmConfig);
|
|
||||||
vra.setMaxIterations(nOfRandomWalks);
|
vra.setMaxIterations(nOfRandomWalks);
|
||||||
vra.getAlgorithmListeners().addListener(new IterationEndsListener() {
|
vra.getAlgorithmListeners().addListener(new IterationEndsListener() {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,13 +17,7 @@
|
||||||
package com.graphhopper.jsprit.core.algorithm.box;
|
package com.graphhopper.jsprit.core.algorithm.box;
|
||||||
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.AlgorithmConfig;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.AlgorithmConfigXmlReader;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.util.Resource;
|
|
||||||
|
|
||||||
import java.net.URL;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -53,11 +47,28 @@ public class GreedySchrimpfFactory {
|
||||||
* @return algorithm
|
* @return algorithm
|
||||||
*/
|
*/
|
||||||
public VehicleRoutingAlgorithm createAlgorithm(VehicleRoutingProblem vrp) {
|
public VehicleRoutingAlgorithm createAlgorithm(VehicleRoutingProblem vrp) {
|
||||||
AlgorithmConfig algorithmConfig = new AlgorithmConfig();
|
return createGreedyAlgorithmBuilder(vrp).buildAlgorithm();
|
||||||
URL resource = Resource.getAsURL("greedySchrimpf.xml");
|
|
||||||
new AlgorithmConfigXmlReader(algorithmConfig).read(resource);
|
|
||||||
return VehicleRoutingAlgorithms.createAlgorithm(vrp, algorithmConfig);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Jsprit.Builder createGreedyAlgorithmBuilder(VehicleRoutingProblem vrp) {
|
||||||
|
int radialShare = (int) (vrp.getJobs().size() * 0.3);
|
||||||
|
int randomShare = (int) (vrp.getJobs().size() * 0.5);
|
||||||
|
|
||||||
|
Jsprit.Builder builder = Jsprit.Builder.newInstance(vrp);
|
||||||
|
builder.setProperty(Jsprit.Parameter.THRESHOLD_ALPHA,"0.0");
|
||||||
|
builder.setProperty(Jsprit.Strategy.RADIAL_BEST, "0.5");
|
||||||
|
builder.setProperty(Jsprit.Strategy.RADIAL_REGRET, "0.0");
|
||||||
|
builder.setProperty(Jsprit.Strategy.RANDOM_BEST, "0.5");
|
||||||
|
builder.setProperty(Jsprit.Strategy.RANDOM_REGRET, "0.0");
|
||||||
|
builder.setProperty(Jsprit.Strategy.WORST_BEST, "0.0");
|
||||||
|
builder.setProperty(Jsprit.Strategy.WORST_REGRET, "0.0");
|
||||||
|
builder.setProperty(Jsprit.Strategy.CLUSTER_BEST, "0.0");
|
||||||
|
builder.setProperty(Jsprit.Strategy.CLUSTER_REGRET, "0.0");
|
||||||
|
builder.setProperty(Jsprit.Parameter.RADIAL_MIN_SHARE, String.valueOf(radialShare));
|
||||||
|
builder.setProperty(Jsprit.Parameter.RADIAL_MAX_SHARE, String.valueOf(radialShare));
|
||||||
|
builder.setProperty(Jsprit.Parameter.RANDOM_BEST_MIN_SHARE, String.valueOf(randomShare));
|
||||||
|
builder.setProperty(Jsprit.Parameter.RANDOM_BEST_MAX_SHARE, String.valueOf(randomShare));
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import com.graphhopper.jsprit.core.algorithm.PrettyAlgorithmBuilder;
|
||||||
import com.graphhopper.jsprit.core.algorithm.SearchStrategy;
|
import com.graphhopper.jsprit.core.algorithm.SearchStrategy;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.acceptor.SchrimpfAcceptance;
|
import com.graphhopper.jsprit.core.algorithm.acceptor.SchrimpfAcceptance;
|
||||||
|
import com.graphhopper.jsprit.core.algorithm.acceptor.SolutionAcceptor;
|
||||||
import com.graphhopper.jsprit.core.algorithm.listener.AlgorithmEndsListener;
|
import com.graphhopper.jsprit.core.algorithm.listener.AlgorithmEndsListener;
|
||||||
import com.graphhopper.jsprit.core.algorithm.listener.IterationStartsListener;
|
import com.graphhopper.jsprit.core.algorithm.listener.IterationStartsListener;
|
||||||
import com.graphhopper.jsprit.core.algorithm.module.RuinAndRecreateModule;
|
import com.graphhopper.jsprit.core.algorithm.module.RuinAndRecreateModule;
|
||||||
|
|
@ -140,6 +141,8 @@ public class Jsprit {
|
||||||
|
|
||||||
private ActivityInsertionCostsCalculator activityInsertionCalculator;
|
private ActivityInsertionCostsCalculator activityInsertionCalculator;
|
||||||
|
|
||||||
|
private SolutionAcceptor solutionAcceptor;
|
||||||
|
|
||||||
public static Builder newInstance(VehicleRoutingProblem vrp) {
|
public static Builder newInstance(VehicleRoutingProblem vrp) {
|
||||||
return new Builder(vrp);
|
return new Builder(vrp);
|
||||||
}
|
}
|
||||||
|
|
@ -199,6 +202,11 @@ public class Jsprit {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Builder setCustomAcceptor(SolutionAcceptor acceptor){
|
||||||
|
this.solutionAcceptor = acceptor;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public Builder setRandom(Random random) {
|
public Builder setRandom(Random random) {
|
||||||
this.random = random;
|
this.random = random;
|
||||||
return this;
|
return this;
|
||||||
|
|
@ -300,6 +308,8 @@ public class Jsprit {
|
||||||
|
|
||||||
private Random random;
|
private Random random;
|
||||||
|
|
||||||
|
private SolutionAcceptor acceptor;
|
||||||
|
|
||||||
private Jsprit(Builder builder) {
|
private Jsprit(Builder builder) {
|
||||||
this.stateManager = builder.stateManager;
|
this.stateManager = builder.stateManager;
|
||||||
this.constraintManager = builder.constraintManager;
|
this.constraintManager = builder.constraintManager;
|
||||||
|
|
@ -310,6 +320,7 @@ public class Jsprit {
|
||||||
this.objectiveFunction = builder.objectiveFunction;
|
this.objectiveFunction = builder.objectiveFunction;
|
||||||
this.random = builder.random;
|
this.random = builder.random;
|
||||||
this.activityInsertion = builder.activityInsertionCalculator;
|
this.activityInsertion = builder.activityInsertionCalculator;
|
||||||
|
this.acceptor = builder.solutionAcceptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
private VehicleRoutingAlgorithm create(final VehicleRoutingProblem vrp) {
|
private VehicleRoutingAlgorithm create(final VehicleRoutingProblem vrp) {
|
||||||
|
|
@ -500,40 +511,44 @@ public class Jsprit {
|
||||||
}
|
}
|
||||||
best.setRandom(random);
|
best.setRandom(random);
|
||||||
|
|
||||||
final SchrimpfAcceptance schrimpfAcceptance = new SchrimpfAcceptance(1, toDouble(getProperty(Parameter.THRESHOLD_ALPHA.toString())));
|
IterationStartsListener schrimpfThreshold = null;
|
||||||
IterationStartsListener schrimpfThreshold = new IterationStartsListener() {
|
if(acceptor == null) {
|
||||||
@Override
|
final SchrimpfAcceptance schrimpfAcceptance = new SchrimpfAcceptance(1, toDouble(getProperty(Parameter.THRESHOLD_ALPHA.toString())));
|
||||||
public void informIterationStarts(int i, VehicleRoutingProblem problem, Collection<VehicleRoutingProblemSolution> solutions) {
|
schrimpfThreshold = new IterationStartsListener() {
|
||||||
if (i == 1) {
|
@Override
|
||||||
double initialThreshold = Solutions.bestOf(solutions).getCost() * toDouble(getProperty(Parameter.THRESHOLD_INI.toString()));
|
public void informIterationStarts(int i, VehicleRoutingProblem problem, Collection<VehicleRoutingProblemSolution> solutions) {
|
||||||
schrimpfAcceptance.setInitialThreshold(initialThreshold);
|
if (i == 1) {
|
||||||
|
double initialThreshold = Solutions.bestOf(solutions).getCost() * toDouble(getProperty(Parameter.THRESHOLD_INI.toString()));
|
||||||
|
schrimpfAcceptance.setInitialThreshold(initialThreshold);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
};
|
acceptor = schrimpfAcceptance;
|
||||||
|
}
|
||||||
|
|
||||||
SolutionCostCalculator objectiveFunction = getObjectiveFunction(vrp, maxCosts);
|
SolutionCostCalculator objectiveFunction = getObjectiveFunction(vrp, maxCosts);
|
||||||
SearchStrategy radial_regret = new SearchStrategy(Strategy.RADIAL_REGRET.toString(), new SelectBest(), schrimpfAcceptance, objectiveFunction);
|
SearchStrategy radial_regret = new SearchStrategy(Strategy.RADIAL_REGRET.toString(), new SelectBest(), acceptor, objectiveFunction);
|
||||||
radial_regret.addModule(new RuinAndRecreateModule(Strategy.RADIAL_REGRET.toString(), regret, radial));
|
radial_regret.addModule(new RuinAndRecreateModule(Strategy.RADIAL_REGRET.toString(), regret, radial));
|
||||||
|
|
||||||
SearchStrategy radial_best = new SearchStrategy(Strategy.RADIAL_BEST.toString(), new SelectBest(), schrimpfAcceptance, objectiveFunction);
|
SearchStrategy radial_best = new SearchStrategy(Strategy.RADIAL_BEST.toString(), new SelectBest(), acceptor, objectiveFunction);
|
||||||
radial_best.addModule(new RuinAndRecreateModule(Strategy.RADIAL_BEST.toString(), best, radial));
|
radial_best.addModule(new RuinAndRecreateModule(Strategy.RADIAL_BEST.toString(), best, radial));
|
||||||
|
|
||||||
SearchStrategy random_best = new SearchStrategy(Strategy.RANDOM_BEST.toString(), new SelectBest(), schrimpfAcceptance, objectiveFunction);
|
SearchStrategy random_best = new SearchStrategy(Strategy.RANDOM_BEST.toString(), new SelectBest(), acceptor, objectiveFunction);
|
||||||
random_best.addModule(new RuinAndRecreateModule(Strategy.RANDOM_BEST.toString(), best, random_for_best));
|
random_best.addModule(new RuinAndRecreateModule(Strategy.RANDOM_BEST.toString(), best, random_for_best));
|
||||||
|
|
||||||
SearchStrategy random_regret = new SearchStrategy(Strategy.RANDOM_REGRET.toString(), new SelectBest(), schrimpfAcceptance, objectiveFunction);
|
SearchStrategy random_regret = new SearchStrategy(Strategy.RANDOM_REGRET.toString(), new SelectBest(), acceptor, objectiveFunction);
|
||||||
random_regret.addModule(new RuinAndRecreateModule(Strategy.RANDOM_REGRET.toString(), regret, random_for_regret));
|
random_regret.addModule(new RuinAndRecreateModule(Strategy.RANDOM_REGRET.toString(), regret, random_for_regret));
|
||||||
|
|
||||||
SearchStrategy worst_regret = new SearchStrategy(Strategy.WORST_REGRET.toString(), new SelectBest(), schrimpfAcceptance, objectiveFunction);
|
SearchStrategy worst_regret = new SearchStrategy(Strategy.WORST_REGRET.toString(), new SelectBest(), acceptor, objectiveFunction);
|
||||||
worst_regret.addModule(new RuinAndRecreateModule(Strategy.WORST_REGRET.toString(), regret, worst));
|
worst_regret.addModule(new RuinAndRecreateModule(Strategy.WORST_REGRET.toString(), regret, worst));
|
||||||
|
|
||||||
SearchStrategy worst_best = new SearchStrategy(Strategy.WORST_BEST.toString(), new SelectBest(), schrimpfAcceptance, objectiveFunction);
|
SearchStrategy worst_best = new SearchStrategy(Strategy.WORST_BEST.toString(), new SelectBest(), acceptor, objectiveFunction);
|
||||||
worst_best.addModule(new RuinAndRecreateModule(Strategy.WORST_BEST.toString(), best, worst));
|
worst_best.addModule(new RuinAndRecreateModule(Strategy.WORST_BEST.toString(), best, worst));
|
||||||
|
|
||||||
final SearchStrategy clusters_regret = new SearchStrategy(Strategy.CLUSTER_REGRET.toString(), new SelectBest(), schrimpfAcceptance, objectiveFunction);
|
final SearchStrategy clusters_regret = new SearchStrategy(Strategy.CLUSTER_REGRET.toString(), new SelectBest(), acceptor, objectiveFunction);
|
||||||
clusters_regret.addModule(new RuinAndRecreateModule(Strategy.CLUSTER_REGRET.toString(), regret, clusters));
|
clusters_regret.addModule(new RuinAndRecreateModule(Strategy.CLUSTER_REGRET.toString(), regret, clusters));
|
||||||
|
|
||||||
final SearchStrategy clusters_best = new SearchStrategy(Strategy.CLUSTER_BEST.toString(), new SelectBest(), schrimpfAcceptance, objectiveFunction);
|
final SearchStrategy clusters_best = new SearchStrategy(Strategy.CLUSTER_BEST.toString(), new SelectBest(), acceptor, objectiveFunction);
|
||||||
clusters_best.addModule(new RuinAndRecreateModule(Strategy.CLUSTER_BEST.toString(), best, clusters));
|
clusters_best.addModule(new RuinAndRecreateModule(Strategy.CLUSTER_BEST.toString(), best, clusters));
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -558,7 +573,9 @@ public class Jsprit {
|
||||||
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = prettyBuilder.build();
|
VehicleRoutingAlgorithm vra = prettyBuilder.build();
|
||||||
vra.addListener(schrimpfThreshold);
|
if(schrimpfThreshold != null) {
|
||||||
|
vra.addListener(schrimpfThreshold);
|
||||||
|
}
|
||||||
vra.addListener(noiseConfigurator);
|
vra.addListener(noiseConfigurator);
|
||||||
vra.addListener(noise);
|
vra.addListener(noise);
|
||||||
vra.addListener(clusters);
|
vra.addListener(clusters);
|
||||||
|
|
|
||||||
|
|
@ -17,13 +17,7 @@
|
||||||
package com.graphhopper.jsprit.core.algorithm.box;
|
package com.graphhopper.jsprit.core.algorithm.box;
|
||||||
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.AlgorithmConfig;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.AlgorithmConfigXmlReader;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.util.Resource;
|
|
||||||
|
|
||||||
import java.net.URL;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -53,10 +47,25 @@ public class SchrimpfFactory {
|
||||||
* @return algorithm
|
* @return algorithm
|
||||||
*/
|
*/
|
||||||
public VehicleRoutingAlgorithm createAlgorithm(VehicleRoutingProblem vrp) {
|
public VehicleRoutingAlgorithm createAlgorithm(VehicleRoutingProblem vrp) {
|
||||||
AlgorithmConfig algorithmConfig = new AlgorithmConfig();
|
//TODO determine alpha threshold
|
||||||
URL resource = Resource.getAsURL("schrimpf.xml");
|
|
||||||
new AlgorithmConfigXmlReader(algorithmConfig).read(resource);
|
int radialShare = (int) (vrp.getJobs().size() * 0.3);
|
||||||
return VehicleRoutingAlgorithms.createAlgorithm(vrp, algorithmConfig);
|
int randomShare = (int) (vrp.getJobs().size() * 0.5);
|
||||||
|
Jsprit.Builder builder = Jsprit.Builder.newInstance(vrp);
|
||||||
|
builder.setProperty(Jsprit.Parameter.THRESHOLD_ALPHA,"0.0");
|
||||||
|
builder.setProperty(Jsprit.Strategy.RADIAL_BEST, "0.5");
|
||||||
|
builder.setProperty(Jsprit.Strategy.RADIAL_REGRET, "0.0");
|
||||||
|
builder.setProperty(Jsprit.Strategy.RANDOM_BEST, "0.5");
|
||||||
|
builder.setProperty(Jsprit.Strategy.RANDOM_REGRET, "0.0");
|
||||||
|
builder.setProperty(Jsprit.Strategy.WORST_BEST, "0.0");
|
||||||
|
builder.setProperty(Jsprit.Strategy.WORST_REGRET, "0.0");
|
||||||
|
builder.setProperty(Jsprit.Strategy.CLUSTER_BEST, "0.0");
|
||||||
|
builder.setProperty(Jsprit.Strategy.CLUSTER_REGRET, "0.0");
|
||||||
|
builder.setProperty(Jsprit.Parameter.RADIAL_MIN_SHARE, String.valueOf(radialShare));
|
||||||
|
builder.setProperty(Jsprit.Parameter.RADIAL_MAX_SHARE, String.valueOf(radialShare));
|
||||||
|
builder.setProperty(Jsprit.Parameter.RANDOM_BEST_MIN_SHARE, String.valueOf(randomShare));
|
||||||
|
builder.setProperty(Jsprit.Parameter.RANDOM_BEST_MAX_SHARE, String.valueOf(randomShare));
|
||||||
|
return builder.buildAlgorithm();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,12 +30,12 @@ import com.graphhopper.jsprit.core.algorithm.state.InternalStates;
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLReader;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.SolutionCostCalculator;
|
import com.graphhopper.jsprit.core.problem.solution.SolutionCostCalculator;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute;
|
import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.InfiniteFleetManagerFactory;
|
import com.graphhopper.jsprit.core.problem.vehicle.InfiniteFleetManagerFactory;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleFleetManager;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleFleetManager;
|
||||||
|
import com.graphhopper.jsprit.core.util.ChristofidesReader;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
@ -55,7 +55,7 @@ public class BuildCVRPAlgoFromScratch_IT {
|
||||||
@Before
|
@Before
|
||||||
public void setup() {
|
public void setup() {
|
||||||
VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance();
|
VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance();
|
||||||
new VrpXMLReader(builder).read("src/test/resources/vrpnc1-jsprit.xml");
|
new ChristofidesReader(builder).read(getClass().getResourceAsStream("vrpnc1.txt"));
|
||||||
vrp = builder.build();
|
vrp = builder.build();
|
||||||
|
|
||||||
final StateManager stateManager = new StateManager(vrp);
|
final StateManager stateManager = new StateManager(vrp);
|
||||||
|
|
|
||||||
|
|
@ -1,118 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2014 Stefan Schroeder
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 3.0 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
******************************************************************************/
|
|
||||||
package com.graphhopper.jsprit.core.algorithm;
|
|
||||||
|
|
||||||
import com.graphhopper.jsprit.core.IntegrationTest;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.acceptor.GreedyAcceptance;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.module.RuinAndRecreateModule;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.recreate.BestInsertionBuilder;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.recreate.InsertionStrategy;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.ruin.RadialRuinStrategyFactory;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.ruin.RandomRuinStrategyFactory;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.ruin.RuinStrategy;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.ruin.distance.AvgServiceDistance;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.selector.SelectBest;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.InternalStates;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.termination.IterationWithoutImprovementTermination;
|
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLReader;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.SolutionCostCalculator;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute;
|
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.InfiniteFleetManagerFactory;
|
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleFleetManager;
|
|
||||||
import junit.framework.Assert;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.experimental.categories.Category;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
|
|
||||||
public class BuildPDVRPAlgoFromScratch_IT {
|
|
||||||
|
|
||||||
VehicleRoutingProblem vrp;
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra;
|
|
||||||
|
|
||||||
static Logger log = LoggerFactory.getLogger(BuildPDVRPAlgoFromScratch_IT.class);
|
|
||||||
|
|
||||||
@Before
|
|
||||||
public void setup() {
|
|
||||||
|
|
||||||
VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(builder).read("src/test/resources/pd_solomon_r101.xml");
|
|
||||||
vrp = builder.build();
|
|
||||||
|
|
||||||
final StateManager stateManager = new StateManager(vrp);
|
|
||||||
|
|
||||||
ConstraintManager constraintManager = new ConstraintManager(vrp, stateManager);
|
|
||||||
|
|
||||||
VehicleFleetManager fleetManager = new InfiniteFleetManagerFactory(vrp.getVehicles()).createFleetManager();
|
|
||||||
|
|
||||||
InsertionStrategy bestInsertion = new BestInsertionBuilder(vrp, fleetManager, stateManager, constraintManager).build();
|
|
||||||
|
|
||||||
RuinStrategy radial = new RadialRuinStrategyFactory(0.15, new AvgServiceDistance(vrp.getTransportCosts())).createStrategy(vrp);
|
|
||||||
RuinStrategy random = new RandomRuinStrategyFactory(0.25).createStrategy(vrp);
|
|
||||||
|
|
||||||
SolutionCostCalculator solutionCostCalculator = new SolutionCostCalculator() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getCosts(VehicleRoutingProblemSolution solution) {
|
|
||||||
double costs = 0.0;
|
|
||||||
for (VehicleRoute route : solution.getRoutes()) {
|
|
||||||
Double cost_of_route = stateManager.getRouteState(route, InternalStates.COSTS, Double.class);
|
|
||||||
if (cost_of_route == null) cost_of_route = 0.;
|
|
||||||
costs += cost_of_route;
|
|
||||||
}
|
|
||||||
return costs;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
SearchStrategy randomStrategy = new SearchStrategy("random", new SelectBest(), new GreedyAcceptance(1), solutionCostCalculator);
|
|
||||||
RuinAndRecreateModule randomModule = new RuinAndRecreateModule("randomRuin_bestInsertion", bestInsertion, random);
|
|
||||||
randomStrategy.addModule(randomModule);
|
|
||||||
|
|
||||||
SearchStrategy radialStrategy = new SearchStrategy("radial", new SelectBest(), new GreedyAcceptance(1), solutionCostCalculator);
|
|
||||||
RuinAndRecreateModule radialModule = new RuinAndRecreateModule("radialRuin_bestInsertion", bestInsertion, radial);
|
|
||||||
radialStrategy.addModule(radialModule);
|
|
||||||
|
|
||||||
vra = new PrettyAlgorithmBuilder(vrp, fleetManager, stateManager, constraintManager)
|
|
||||||
.addCoreStateAndConstraintStuff().constructInitialSolutionWith(bestInsertion, solutionCostCalculator)
|
|
||||||
.withStrategy(radialStrategy, 0.5).withStrategy(randomStrategy, 0.5).build();
|
|
||||||
|
|
||||||
vra.setMaxIterations(1000);
|
|
||||||
vra.setPrematureAlgorithmTermination(new IterationWithoutImprovementTermination(100));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Category(IntegrationTest.class)
|
|
||||||
public void test() {
|
|
||||||
try {
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
Assert.assertTrue(true);
|
|
||||||
} catch (Exception e) {
|
|
||||||
Assert.assertTrue(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,114 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2014 Stefan Schroeder
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 3.0 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
******************************************************************************/
|
|
||||||
package com.graphhopper.jsprit.core.algorithm;
|
|
||||||
|
|
||||||
import com.graphhopper.jsprit.core.IntegrationTest;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.acceptor.GreedyAcceptance;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.module.RuinAndRecreateModule;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.recreate.BestInsertionBuilder;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.recreate.InsertionStrategy;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.ruin.RadialRuinStrategyFactory;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.ruin.RandomRuinStrategyFactory;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.ruin.RuinStrategy;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.ruin.distance.AvgServiceAndShipmentDistance;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.selector.SelectBest;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.InternalStates;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.UpdateVariableCosts;
|
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLReader;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.SolutionCostCalculator;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute;
|
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.InfiniteFleetManagerFactory;
|
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleFleetManager;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.experimental.categories.Category;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
|
|
||||||
|
|
||||||
public class BuildPDVRPWithShipmentsAlgoFromScratch_IT {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Category(IntegrationTest.class)
|
|
||||||
public void test() {
|
|
||||||
VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(builder).read("src/test/resources/pdp.xml");
|
|
||||||
|
|
||||||
VehicleRoutingProblem vrp = builder.build();
|
|
||||||
|
|
||||||
final StateManager stateManager = new StateManager(vrp);
|
|
||||||
stateManager.updateLoadStates();
|
|
||||||
// stateManager.updateTimeWindowStates();
|
|
||||||
stateManager.addStateUpdater(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager));
|
|
||||||
|
|
||||||
ConstraintManager constraintManager = new ConstraintManager(vrp, stateManager);
|
|
||||||
// constraintManager.addTimeWindowConstraint();
|
|
||||||
constraintManager.addLoadConstraint();
|
|
||||||
|
|
||||||
VehicleFleetManager fleetManager = new InfiniteFleetManagerFactory(vrp.getVehicles()).createFleetManager();
|
|
||||||
|
|
||||||
BestInsertionBuilder bestIBuilder = new BestInsertionBuilder(vrp, fleetManager, stateManager, constraintManager);
|
|
||||||
InsertionStrategy bestInsertion = bestIBuilder.build();
|
|
||||||
|
|
||||||
|
|
||||||
RuinStrategy radial = new RadialRuinStrategyFactory(0.3, new AvgServiceAndShipmentDistance(vrp.getTransportCosts())).createStrategy(vrp);
|
|
||||||
RuinStrategy random = new RandomRuinStrategyFactory(0.5).createStrategy(vrp);
|
|
||||||
|
|
||||||
|
|
||||||
SolutionCostCalculator solutionCostCalculator = new SolutionCostCalculator() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getCosts(VehicleRoutingProblemSolution solution) {
|
|
||||||
double costs = 0.0;
|
|
||||||
for (VehicleRoute route : solution.getRoutes()) {
|
|
||||||
costs += stateManager.getRouteState(route, InternalStates.COSTS, Double.class);
|
|
||||||
}
|
|
||||||
return costs;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
SearchStrategy randomStrategy = new SearchStrategy("random", new SelectBest(), new GreedyAcceptance(1), solutionCostCalculator);
|
|
||||||
RuinAndRecreateModule randomModule = new RuinAndRecreateModule("randomRuin_bestInsertion", bestInsertion, random);
|
|
||||||
randomStrategy.addModule(randomModule);
|
|
||||||
|
|
||||||
SearchStrategy radialStrategy = new SearchStrategy("radial", new SelectBest(), new GreedyAcceptance(1), solutionCostCalculator);
|
|
||||||
RuinAndRecreateModule radialModule = new RuinAndRecreateModule("radialRuin_bestInsertion", bestInsertion, radial);
|
|
||||||
radialStrategy.addModule(radialModule);
|
|
||||||
|
|
||||||
SearchStrategyManager strategyManager = new SearchStrategyManager();
|
|
||||||
strategyManager.addStrategy(radialStrategy, 0.5);
|
|
||||||
strategyManager.addStrategy(randomStrategy, 0.5);
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = new VehicleRoutingAlgorithm(vrp, strategyManager);
|
|
||||||
vra.addListener(stateManager);
|
|
||||||
vra.addListener(new RemoveEmptyVehicles(fleetManager));
|
|
||||||
|
|
||||||
VehicleRoutingProblemSolution iniSolution = new InsertionInitialSolutionFactory(bestInsertion, solutionCostCalculator).createSolution(vrp);
|
|
||||||
vra.addInitialSolution(iniSolution);
|
|
||||||
|
|
||||||
vra.setMaxIterations(3);
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
assertTrue(!solutions.isEmpty());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,64 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2014 Stefan Schroeder
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 3.0 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
******************************************************************************/
|
|
||||||
package com.graphhopper.jsprit.core.algorithm;
|
|
||||||
|
|
||||||
import com.graphhopper.jsprit.core.IntegrationTest;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLReader;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
|
||||||
import junit.framework.Assert;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.experimental.categories.Category;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
public class CVRPwithDeliveriesAndDifferentInsertionStrategies_IT {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Category(IntegrationTest.class)
|
|
||||||
public void whenWithTwoInsertionStrategiesWhereOnleOneIsInAlgo_itShouldWork() {
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/vrpnc1-jsprit-with-deliveries.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/algorithmConfig_greedyWithRegret.xml");
|
|
||||||
vra.setMaxIterations(10);
|
|
||||||
try {
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
Assert.assertTrue(true);
|
|
||||||
} catch (Exception e) {
|
|
||||||
Assert.assertTrue(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Category(IntegrationTest.class)
|
|
||||||
public void whenWithTwoInsertionStrategiesWhereBothAreInAlgo_itShouldWork() {
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/vrpnc1-jsprit-with-deliveries.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/algorithmConfig_greedyWithRegret_v2.xml");
|
|
||||||
vra.setMaxIterations(10);
|
|
||||||
try {
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
Assert.assertTrue(true);
|
|
||||||
} catch (Exception e) {
|
|
||||||
Assert.assertTrue(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -18,10 +18,10 @@ package com.graphhopper.jsprit.core.algorithm;
|
||||||
|
|
||||||
import com.graphhopper.jsprit.core.IntegrationTest;
|
import com.graphhopper.jsprit.core.IntegrationTest;
|
||||||
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLReader;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
|
import com.graphhopper.jsprit.core.util.ChristofidesReader;
|
||||||
|
import com.graphhopper.jsprit.core.util.JobType;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.experimental.categories.Category;
|
import org.junit.experimental.categories.Category;
|
||||||
|
|
@ -32,23 +32,11 @@ import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
public class CVRPwithDeliveries_IT {
|
public class CVRPwithDeliveries_IT {
|
||||||
|
|
||||||
@Test
|
|
||||||
@Category(IntegrationTest.class)
|
|
||||||
public void whenSolvingVRPNC1withDeliveries_solutionsMustNoBeWorseThan5PercentOfBestKnownSolution() {
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/vrpnc1-jsprit-with-deliveries.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/algorithmConfig.xml");
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
assertEquals(530.0, Solutions.bestOf(solutions).getCost(), 50.0);
|
|
||||||
assertEquals(5, Solutions.bestOf(solutions).getRoutes().size());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Category(IntegrationTest.class)
|
@Category(IntegrationTest.class)
|
||||||
public void whenSolvingVRPNC1withDeliveriesWithJsprit_solutionsMustNoBeWorseThan5PercentOfBestKnownSolution() {
|
public void whenSolvingVRPNC1withDeliveriesWithJsprit_solutionsMustNoBeWorseThan5PercentOfBestKnownSolution() {
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/vrpnc1-jsprit-with-deliveries.xml");
|
new ChristofidesReader(vrpBuilder).setJobType(JobType.DELIVERY).read(getClass().getResourceAsStream("vrpnc1.txt"));
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
VehicleRoutingProblem vrp = vrpBuilder.build();
|
||||||
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
|
|
|
||||||
|
|
@ -17,20 +17,17 @@
|
||||||
package com.graphhopper.jsprit.core.algorithm;
|
package com.graphhopper.jsprit.core.algorithm;
|
||||||
|
|
||||||
import com.graphhopper.jsprit.core.IntegrationTest;
|
import com.graphhopper.jsprit.core.IntegrationTest;
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
||||||
import com.graphhopper.jsprit.core.analysis.SolutionAnalyser;
|
import com.graphhopper.jsprit.core.analysis.SolutionAnalyser;
|
||||||
import com.graphhopper.jsprit.core.problem.Location;
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.cost.TransportDistance;
|
import com.graphhopper.jsprit.core.problem.cost.TransportDistance;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLReader;
|
|
||||||
import com.graphhopper.jsprit.core.problem.job.Job;
|
import com.graphhopper.jsprit.core.problem.job.Job;
|
||||||
import com.graphhopper.jsprit.core.problem.job.Service;
|
import com.graphhopper.jsprit.core.problem.job.Service;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.Vehicle;
|
import com.graphhopper.jsprit.core.problem.vehicle.Vehicle;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
||||||
import com.graphhopper.jsprit.core.util.EuclideanDistanceCalculator;
|
import com.graphhopper.jsprit.core.util.*;
|
||||||
import com.graphhopper.jsprit.core.util.FastVehicleRoutingTransportCostsMatrix;
|
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.experimental.categories.Category;
|
import org.junit.experimental.categories.Category;
|
||||||
|
|
@ -50,10 +47,10 @@ public class CVRPwithMatrix_IT {
|
||||||
@Category(IntegrationTest.class)
|
@Category(IntegrationTest.class)
|
||||||
public void whenReturnToDepot_itShouldWorkWithMatrix() {
|
public void whenReturnToDepot_itShouldWorkWithMatrix() {
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/vrpnc1-jsprit-with-deliveries.xml");
|
new ChristofidesReader(vrpBuilder).setJobType(JobType.DELIVERY).read(getClass().getResourceAsStream("vrpnc1.txt"));
|
||||||
VehicleRoutingProblem vrp_ = vrpBuilder.build();
|
VehicleRoutingProblem vrp_ = vrpBuilder.build();
|
||||||
VehicleRoutingProblem vrp = createVrpWithLocationIndecesAndMatrix(vrp_, true);
|
VehicleRoutingProblem vrp = createVrpWithLocationIndecesAndMatrix(vrp_, true);
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/algorithmConfig.xml");
|
VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp).setProperty(Jsprit.Parameter.FAST_REGRET,"true").buildAlgorithm();
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
Assert.assertEquals(530.0, Solutions.bestOf(solutions).getCost(), 50.0);
|
Assert.assertEquals(530.0, Solutions.bestOf(solutions).getCost(), 50.0);
|
||||||
assertEquals(5, Solutions.bestOf(solutions).getRoutes().size());
|
assertEquals(5, Solutions.bestOf(solutions).getRoutes().size());
|
||||||
|
|
@ -63,10 +60,10 @@ public class CVRPwithMatrix_IT {
|
||||||
@Category(IntegrationTest.class)
|
@Category(IntegrationTest.class)
|
||||||
public void whenNotReturnToDepot_itShouldWorkWithMatrix() {
|
public void whenNotReturnToDepot_itShouldWorkWithMatrix() {
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/vrpnc1-jsprit-with-deliveries.xml");
|
new ChristofidesReader(vrpBuilder).setJobType(JobType.DELIVERY).read(getClass().getResourceAsStream("vrpnc1.txt"));
|
||||||
VehicleRoutingProblem vrp_ = vrpBuilder.build();
|
VehicleRoutingProblem vrp_ = vrpBuilder.build();
|
||||||
VehicleRoutingProblem vrp = createVrpWithLocationIndecesAndMatrix(vrp_, false);
|
VehicleRoutingProblem vrp = createVrpWithLocationIndecesAndMatrix(vrp_, false);
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/algorithmConfig.xml");
|
VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp).setProperty(Jsprit.Parameter.FAST_REGRET,"true").buildAlgorithm();
|
||||||
try {
|
try {
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
assertTrue(true);
|
assertTrue(true);
|
||||||
|
|
@ -79,10 +76,10 @@ public class CVRPwithMatrix_IT {
|
||||||
@Category(IntegrationTest.class)
|
@Category(IntegrationTest.class)
|
||||||
public void whenCalcTimeWithSolutionAnalyser_itShouldWork() {
|
public void whenCalcTimeWithSolutionAnalyser_itShouldWork() {
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/vrpnc1-jsprit-with-deliveries.xml");
|
new ChristofidesReader(vrpBuilder).setJobType(JobType.DELIVERY).read(getClass().getResourceAsStream("vrpnc1.txt"));
|
||||||
VehicleRoutingProblem vrp_ = vrpBuilder.build();
|
VehicleRoutingProblem vrp_ = vrpBuilder.build();
|
||||||
final VehicleRoutingProblem vrp = createVrpWithLocationIndecesAndMatrix(vrp_, false);
|
final VehicleRoutingProblem vrp = createVrpWithLocationIndecesAndMatrix(vrp_, false);
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/algorithmConfig.xml");
|
VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp).setProperty(Jsprit.Parameter.FAST_REGRET,"true").buildAlgorithm();
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
SolutionAnalyser sa = new SolutionAnalyser(vrp, Solutions.bestOf(solutions), new TransportDistance() {
|
SolutionAnalyser sa = new SolutionAnalyser(vrp, Solutions.bestOf(solutions), new TransportDistance() {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -18,10 +18,10 @@ package com.graphhopper.jsprit.core.algorithm;
|
||||||
|
|
||||||
import com.graphhopper.jsprit.core.IntegrationTest;
|
import com.graphhopper.jsprit.core.IntegrationTest;
|
||||||
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLReader;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
|
import com.graphhopper.jsprit.core.util.ChristofidesReader;
|
||||||
|
import com.graphhopper.jsprit.core.util.JobType;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.experimental.categories.Category;
|
import org.junit.experimental.categories.Category;
|
||||||
|
|
@ -36,22 +36,9 @@ public class CVRPwithPickups_IT {
|
||||||
@Category(IntegrationTest.class)
|
@Category(IntegrationTest.class)
|
||||||
public void whenSolvingVRPNC1WithPickups_solutionsMustNoBeWorseThan5PercentOfBestKnownSolution() {
|
public void whenSolvingVRPNC1WithPickups_solutionsMustNoBeWorseThan5PercentOfBestKnownSolution() {
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/vrpnc1-jsprit-with-pickups.xml");
|
new ChristofidesReader(vrpBuilder).setJobType(JobType.PICKUP).read(getClass().getResourceAsStream("vrpnc1.txt"));
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
VehicleRoutingProblem vrp = vrpBuilder.build();
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/algorithmConfig.xml");
|
VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp).setProperty(Jsprit.Parameter.FAST_REGRET,"true").buildAlgorithm();
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
assertEquals(530.0, Solutions.bestOf(solutions).getCost(), 50.0);
|
|
||||||
assertEquals(5, Solutions.bestOf(solutions).getRoutes().size());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Category(IntegrationTest.class)
|
|
||||||
public void whenSolvingVRPNC1WithPickupsWithJsprit_solutionsMustNoBeWorseThan5PercentOfBestKnownSolution() {
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/vrpnc1-jsprit-with-pickups.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
|
||||||
vra.setMaxIterations(1000);
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
assertEquals(530.0, Solutions.bestOf(solutions).getCost(), 50.0);
|
assertEquals(530.0, Solutions.bestOf(solutions).getCost(), 50.0);
|
||||||
assertEquals(5, Solutions.bestOf(solutions).getRoutes().size());
|
assertEquals(5, Solutions.bestOf(solutions).getRoutes().size());
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@
|
||||||
package com.graphhopper.jsprit.core.algorithm;
|
package com.graphhopper.jsprit.core.algorithm;
|
||||||
|
|
||||||
|
|
||||||
|
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
||||||
import com.graphhopper.jsprit.core.problem.Location;
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
|
|
@ -29,57 +30,27 @@ import com.graphhopper.jsprit.core.problem.solution.route.activity.TimeWindow;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
public class DeactivateTimeWindowsTest {
|
public class DeactivateTimeWindowsTest {
|
||||||
|
|
||||||
@Test
|
VehicleRoutingProblem vrp;
|
||||||
public void activityTimesShouldIgnoreTimeWindows() {
|
|
||||||
|
@Before
|
||||||
|
public void doBefore(){
|
||||||
Service service = Service.Builder.newInstance("s").setLocation(Location.newInstance(20, 0))
|
Service service = Service.Builder.newInstance("s").setLocation(Location.newInstance(20, 0))
|
||||||
.setTimeWindow(TimeWindow.newInstance(40, 50)).build();
|
.setTimeWindow(TimeWindow.newInstance(40, 50)).build();
|
||||||
VehicleImpl vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance(0, 0)).build();
|
VehicleImpl vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance(0, 0)).build();
|
||||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(service).addVehicle(vehicle).build();
|
vrp = VehicleRoutingProblem.Builder.newInstance().addJob(service).addVehicle(vehicle).build();
|
||||||
VehicleRoutingAlgorithmBuilder vraBuilder = new VehicleRoutingAlgorithmBuilder(vrp, "src/test/resources/algorithmConfig.xml");
|
|
||||||
vraBuilder.addDefaultCostCalculators();
|
|
||||||
VehicleRoutingAlgorithm vra = vraBuilder.build(); //this should ignore any constraints
|
|
||||||
vra.setMaxIterations(10);
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
|
|
||||||
VehicleRoute route = Solutions.bestOf(solutions).getRoutes().iterator().next();
|
|
||||||
Assert.assertEquals(20., route.getActivities().get(0).getEndTime(), 0.01);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenNotActivatingViaStateManager_activityTimesShouldConsiderTimeWindows() {
|
|
||||||
Service service = Service.Builder.newInstance("s").setLocation(Location.newInstance(20, 0))
|
|
||||||
.setTimeWindow(TimeWindow.newInstance(40, 50)).build();
|
|
||||||
VehicleImpl vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance(0, 0)).build();
|
|
||||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(service).addVehicle(vehicle).build();
|
|
||||||
VehicleRoutingAlgorithmBuilder vraBuilder = new VehicleRoutingAlgorithmBuilder(vrp, "src/test/resources/algorithmConfig.xml");
|
|
||||||
vraBuilder.addDefaultCostCalculators();
|
|
||||||
StateManager stateManager = new StateManager(vrp);
|
|
||||||
ConstraintManager constraintManager = new ConstraintManager(vrp, stateManager);
|
|
||||||
vraBuilder.setStateAndConstraintManager(stateManager, constraintManager);
|
|
||||||
VehicleRoutingAlgorithm vra = vraBuilder.build(); //this should ignore any constraints
|
|
||||||
vra.setMaxIterations(10);
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
|
|
||||||
VehicleRoute route = Solutions.bestOf(solutions).getRoutes().iterator().next();
|
|
||||||
Assert.assertEquals(20., route.getActivities().get(0).getEndTime(), 0.01);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void activityTimesShouldConsiderTimeWindows() {
|
public void activityTimesShouldConsiderTimeWindows() {
|
||||||
Service service = Service.Builder.newInstance("s").setLocation(Location.newInstance(20, 0))
|
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp); //this should ignore any constraints
|
||||||
.setTimeWindow(TimeWindow.newInstance(40, 50)).build();
|
|
||||||
VehicleImpl vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance(0, 0)).build();
|
|
||||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(service).addVehicle(vehicle).build();
|
|
||||||
VehicleRoutingAlgorithmBuilder vraBuilder = new VehicleRoutingAlgorithmBuilder(vrp, "src/test/resources/algorithmConfig.xml");
|
|
||||||
vraBuilder.addCoreConstraints();
|
|
||||||
vraBuilder.addDefaultCostCalculators();
|
|
||||||
VehicleRoutingAlgorithm vra = vraBuilder.build(); //this should ignore any constraints
|
|
||||||
vra.setMaxIterations(10);
|
vra.setMaxIterations(10);
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
|
|
||||||
|
|
@ -89,18 +60,13 @@ public class DeactivateTimeWindowsTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenActivatingViaStateManager_activityTimesShouldConsiderTimeWindows() {
|
public void whenActivatingViaStateManager_activityTimesShouldConsiderTimeWindows() {
|
||||||
Service service = Service.Builder.newInstance("s").setLocation(Location.newInstance(20, 0))
|
|
||||||
.setTimeWindow(TimeWindow.newInstance(40, 50)).build();
|
|
||||||
VehicleImpl vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance(0, 0)).build();
|
|
||||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(service).addVehicle(vehicle).build();
|
|
||||||
VehicleRoutingAlgorithmBuilder vraBuilder = new VehicleRoutingAlgorithmBuilder(vrp, "src/test/resources/algorithmConfig.xml");
|
|
||||||
vraBuilder.addDefaultCostCalculators();
|
|
||||||
StateManager stateManager = new StateManager(vrp);
|
StateManager stateManager = new StateManager(vrp);
|
||||||
stateManager.updateTimeWindowStates();
|
stateManager.updateTimeWindowStates();
|
||||||
ConstraintManager constraintManager = new ConstraintManager(vrp, stateManager);
|
ConstraintManager constraintManager = new ConstraintManager(vrp, stateManager);
|
||||||
constraintManager.addTimeWindowConstraint();
|
constraintManager.addTimeWindowConstraint();
|
||||||
vraBuilder.setStateAndConstraintManager(stateManager, constraintManager);
|
|
||||||
VehicleRoutingAlgorithm vra = vraBuilder.build(); //this should ignore any constraints
|
VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp).addCoreStateAndConstraintStuff(true)
|
||||||
|
.setStateAndConstraintManager(stateManager,constraintManager).buildAlgorithm();
|
||||||
vra.setMaxIterations(10);
|
vra.setMaxIterations(10);
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package com.graphhopper.jsprit.core.algorithm;
|
package com.graphhopper.jsprit.core.algorithm;
|
||||||
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
||||||
import com.graphhopper.jsprit.core.problem.Location;
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.job.Service;
|
import com.graphhopper.jsprit.core.problem.job.Service;
|
||||||
|
|
@ -27,7 +27,7 @@ public class ExternalInitialSolutionIsInValidTest {
|
||||||
|
|
||||||
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(s1).addJob(s2).addVehicle(vehicle).build();
|
VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addJob(s1).addJob(s2).addVehicle(vehicle).build();
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/algorithm_without_construction.xml");
|
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
create ini sol
|
create ini sol
|
||||||
|
|
|
||||||
|
|
@ -25,13 +25,11 @@ import com.graphhopper.jsprit.core.algorithm.box.SchrimpfFactory;
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.UpdateEndLocationIfRouteIsOpen;
|
import com.graphhopper.jsprit.core.algorithm.state.UpdateEndLocationIfRouteIsOpen;
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.UpdateVariableCosts;
|
import com.graphhopper.jsprit.core.algorithm.state.UpdateVariableCosts;
|
||||||
import com.graphhopper.jsprit.core.problem.AbstractActivity;
|
|
||||||
import com.graphhopper.jsprit.core.problem.Location;
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.ServiceLoadActivityLevelConstraint;
|
import com.graphhopper.jsprit.core.problem.constraint.ServiceLoadActivityLevelConstraint;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.ServiceLoadRouteLevelConstraint;
|
import com.graphhopper.jsprit.core.problem.constraint.ServiceLoadRouteLevelConstraint;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLReader;
|
|
||||||
import com.graphhopper.jsprit.core.problem.job.Job;
|
import com.graphhopper.jsprit.core.problem.job.Job;
|
||||||
import com.graphhopper.jsprit.core.problem.job.Service;
|
import com.graphhopper.jsprit.core.problem.job.Service;
|
||||||
import com.graphhopper.jsprit.core.problem.job.Shipment;
|
import com.graphhopper.jsprit.core.problem.job.Shipment;
|
||||||
|
|
@ -42,184 +40,56 @@ import com.graphhopper.jsprit.core.problem.solution.route.activity.TourActivity;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleType;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleType;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
|
||||||
import com.graphhopper.jsprit.core.util.Coordinate;
|
import com.graphhopper.jsprit.core.util.Coordinate;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
public class InitialRoutesTest {
|
public class InitialRoutesTest {
|
||||||
|
|
||||||
@Test
|
private VehicleRoutingProblem vrp;
|
||||||
public void whenReading_jobMapShouldOnlyContainJob2() {
|
|
||||||
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
private VehicleRoute initialRoute;
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem_iniRoutes.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
assertEquals(1, getNuServices(vrp));
|
@Before
|
||||||
assertTrue(vrp.getJobs().containsKey("2"));
|
public void before(){
|
||||||
|
VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance();
|
||||||
|
VehicleImpl v = VehicleImpl.Builder.newInstance("veh1").setStartLocation(Location.newInstance(0,0)).setLatestArrival(48600).build();
|
||||||
|
Service s1 = Service.Builder.newInstance("s1").setLocation(Location.newInstance(1000,0)).build();
|
||||||
|
Service s2 = Service.Builder.newInstance("s2").setLocation(Location.newInstance(1000,1000)).build();
|
||||||
|
builder.addVehicle(v).addJob(s1).addJob(s2);
|
||||||
|
initialRoute = VehicleRoute.Builder.newInstance(v).addService(s1).build();
|
||||||
|
builder.addInitialVehicleRoute(initialRoute);
|
||||||
|
vrp = builder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenReadingProblem2_jobMapShouldContain_service2() {
|
|
||||||
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem_inclShipments_iniRoutes.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
assertEquals(1, getNuServices(vrp));
|
|
||||||
assertTrue(vrp.getJobs().containsKey("2"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenReading_jobMapShouldContain_shipment4() {
|
|
||||||
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem_inclShipments_iniRoutes.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
assertEquals(1, getNuShipments(vrp));
|
|
||||||
assertTrue(vrp.getJobs().containsKey("4"));
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getNuShipments(VehicleRoutingProblem vrp) {
|
|
||||||
int nuShipments = 0;
|
|
||||||
for (Job job : vrp.getJobs().values()) {
|
|
||||||
if (job instanceof Shipment) nuShipments++;
|
|
||||||
}
|
|
||||||
return nuShipments;
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getNuServices(VehicleRoutingProblem vrp) {
|
|
||||||
int nuServices = 0;
|
|
||||||
for (Job job : vrp.getJobs().values()) {
|
|
||||||
if (job instanceof Service) nuServices++;
|
|
||||||
}
|
|
||||||
return nuServices;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenReading_thereShouldBeOnlyOneActAssociatedToJob2() {
|
|
||||||
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem_iniRoutes.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
assertEquals(1, vrp.getActivities(vrp.getJobs().get("2")).size());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenReading_thereShouldBeOnlyOneActAssociatedToJob2_v2() {
|
|
||||||
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem_inclShipments_iniRoutes.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
assertEquals(1, vrp.getActivities(vrp.getJobs().get("2")).size());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenReading_thereShouldBeTwoActsAssociatedToShipment4() {
|
|
||||||
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem_inclShipments_iniRoutes.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
Job job = vrp.getJobs().get("4");
|
|
||||||
List<AbstractActivity> activities = vrp.getActivities(job);
|
|
||||||
|
|
||||||
assertEquals(2, activities.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenSolving_nuJobsInSolutionShouldBe2() {
|
public void whenSolving_nuJobsInSolutionShouldBe2() {
|
||||||
|
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem_iniRoutes.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
VehicleRoutingProblemSolution solution = Solutions.bestOf(solutions);
|
VehicleRoutingProblemSolution solution = Solutions.bestOf(solutions);
|
||||||
|
|
||||||
SolutionPrinter.print(vrp, solution, SolutionPrinter.Print.VERBOSE);
|
|
||||||
|
|
||||||
assertEquals(2, solution.getRoutes().iterator().next().getTourActivities().getJobs().size());
|
assertEquals(2, solution.getRoutes().iterator().next().getTourActivities().getJobs().size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenSolvingProblem2_nuJobsInSolutionShouldBe4() {
|
|
||||||
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem_inclShipments_iniRoutes.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
VehicleRoutingProblemSolution solution = Solutions.bestOf(solutions);
|
|
||||||
|
|
||||||
SolutionPrinter.print(vrp, solution, SolutionPrinter.Print.VERBOSE);
|
|
||||||
|
|
||||||
int jobsInSolution = 0;
|
|
||||||
for (VehicleRoute r : solution.getRoutes()) {
|
|
||||||
jobsInSolution += r.getTourActivities().jobSize();
|
|
||||||
}
|
|
||||||
assertEquals(4, jobsInSolution);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenSolving_nuActsShouldBe2() {
|
public void whenSolving_nuActsShouldBe2() {
|
||||||
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem_iniRoutes.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
VehicleRoutingProblemSolution solution = Solutions.bestOf(solutions);
|
VehicleRoutingProblemSolution solution = Solutions.bestOf(solutions);
|
||||||
|
|
||||||
SolutionPrinter.print(vrp, solution, SolutionPrinter.Print.VERBOSE);
|
|
||||||
|
|
||||||
assertEquals(2, solution.getRoutes().iterator().next().getActivities().size());
|
assertEquals(2, solution.getRoutes().iterator().next().getActivities().size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenSolvingProblem2_nuActsShouldBe6() {
|
|
||||||
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem_inclShipments_iniRoutes.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
VehicleRoutingProblemSolution solution = Solutions.bestOf(solutions);
|
|
||||||
|
|
||||||
int nuActs = 0;
|
|
||||||
for (VehicleRoute r : solution.getRoutes()) {
|
|
||||||
nuActs += r.getActivities().size();
|
|
||||||
}
|
|
||||||
assertEquals(6, nuActs);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenSolving_deliverService1_shouldBeInRoute() {
|
public void whenSolving_deliverService1_shouldBeInRoute() {
|
||||||
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem_iniRoutes.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
VehicleRoutingProblemSolution solution = Solutions.bestOf(solutions);
|
VehicleRoutingProblemSolution solution = Solutions.bestOf(solutions);
|
||||||
|
Job job = getInitialJob("s1", vrp);
|
||||||
SolutionPrinter.print(vrp, solution, SolutionPrinter.Print.VERBOSE);
|
|
||||||
|
|
||||||
Job job = getInitialJob("1", vrp);
|
|
||||||
assertTrue(hasActivityIn(solution, "veh1", job));
|
assertTrue(hasActivityIn(solution, "veh1", job));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -232,63 +102,6 @@ public class InitialRoutesTest {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenSolvingWithJsprit_deliverService1_shouldBeInRoute() {
|
|
||||||
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem_iniRoutes_3.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
VehicleRoutingProblemSolution solution = Solutions.bestOf(solutions);
|
|
||||||
|
|
||||||
SolutionPrinter.print(vrp, solution, SolutionPrinter.Print.VERBOSE);
|
|
||||||
|
|
||||||
Job job = getInitialJob("1", vrp);
|
|
||||||
assertTrue(hasActivityIn(solution, "veh1", job));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenSolvingProblem2With_deliverServices_and_allShipmentActs_shouldBeInRoute() {
|
|
||||||
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem_inclShipments_iniRoutes.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
VehicleRoutingProblemSolution solution = Solutions.bestOf(solutions);
|
|
||||||
|
|
||||||
assertTrue(hasActivityIn(solution.getRoutes(), "1"));
|
|
||||||
assertTrue(hasActivityIn(solution.getRoutes(), "2"));
|
|
||||||
assertTrue(hasActivityIn(solution.getRoutes(), "3"));
|
|
||||||
assertTrue(hasActivityIn(solution.getRoutes(), "4"));
|
|
||||||
|
|
||||||
assertTrue(hasActivityIn(solution, "veh1", getInitialJob("1", vrp)));
|
|
||||||
assertTrue(hasActivityIn(solution, "veh2", getInitialJob("3", vrp)));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenSolvingProblem2WithJsprit_deliverServices_and_allShipmentActs_shouldBeInRoute() {
|
|
||||||
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem_inclShipments_iniRoutes.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
VehicleRoutingProblemSolution solution = Solutions.bestOf(solutions);
|
|
||||||
|
|
||||||
assertTrue(hasActivityIn(solution.getRoutes(), "1"));
|
|
||||||
assertTrue(hasActivityIn(solution.getRoutes(), "2"));
|
|
||||||
assertTrue(hasActivityIn(solution.getRoutes(), "3"));
|
|
||||||
assertTrue(hasActivityIn(solution.getRoutes(), "4"));
|
|
||||||
|
|
||||||
assertTrue(hasActivityIn(solution, "veh1", getInitialJob("1", vrp)));
|
|
||||||
assertTrue(hasActivityIn(solution, "veh2", getInitialJob("3", vrp)));
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean hasActivityIn(Collection<VehicleRoute> routes, String jobId) {
|
private boolean hasActivityIn(Collection<VehicleRoute> routes, String jobId) {
|
||||||
boolean isInRoute = false;
|
boolean isInRoute = false;
|
||||||
for (VehicleRoute route : routes) {
|
for (VehicleRoute route : routes) {
|
||||||
|
|
@ -326,16 +139,11 @@ public class InitialRoutesTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenSolving_deliverService2_shouldBeInRoute() {
|
public void whenSolving_deliverService2_shouldBeInRoute() {
|
||||||
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem_iniRoutes.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
VehicleRoutingProblemSolution solution = Solutions.bestOf(solutions);
|
VehicleRoutingProblemSolution solution = Solutions.bestOf(solutions);
|
||||||
|
|
||||||
assertTrue(hasActivityIn(solution.getRoutes().iterator().next(), "2"));
|
assertTrue(hasActivityIn(solution.getRoutes().iterator().next(), "s2"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -372,19 +180,6 @@ public class InitialRoutesTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenReadingProblemFromFile_maxCapacityShouldNotBeExceeded() {
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem_iniRoutes_2.xml");
|
|
||||||
VehicleRoutingAlgorithm vra = new GreedySchrimpfFactory().createAlgorithm(vrpBuilder.build());
|
|
||||||
vra.setMaxIterations(10);
|
|
||||||
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
|
|
||||||
assertFalse(secondActIsPickup(solutions));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean secondActIsPickup(Collection<VehicleRoutingProblemSolution> solutions) {
|
private boolean secondActIsPickup(Collection<VehicleRoutingProblemSolution> solutions) {
|
||||||
VehicleRoutingProblemSolution solution = Solutions.bestOf(solutions);
|
VehicleRoutingProblemSolution solution = Solutions.bestOf(solutions);
|
||||||
TourActivity secondAct = solution.getRoutes().iterator().next().getActivities().get(1);
|
TourActivity secondAct = solution.getRoutes().iterator().next().getActivities().get(1);
|
||||||
|
|
|
||||||
|
|
@ -18,27 +18,30 @@
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
package com.graphhopper.jsprit.core.algorithm;
|
package com.graphhopper.jsprit.core.algorithm;
|
||||||
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.box.GreedySchrimpfFactory;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
||||||
import com.graphhopper.jsprit.core.algorithm.box.SchrimpfFactory;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.recreate.listener.JobInsertedListener;
|
import com.graphhopper.jsprit.core.algorithm.recreate.listener.JobInsertedListener;
|
||||||
import com.graphhopper.jsprit.core.algorithm.recreate.listener.VehicleSwitchedListener;
|
import com.graphhopper.jsprit.core.algorithm.recreate.listener.VehicleSwitchedListener;
|
||||||
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLReader;
|
|
||||||
import com.graphhopper.jsprit.core.problem.job.Job;
|
import com.graphhopper.jsprit.core.problem.job.Job;
|
||||||
|
import com.graphhopper.jsprit.core.problem.job.Service;
|
||||||
|
import com.graphhopper.jsprit.core.problem.job.Shipment;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute;
|
import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute;
|
||||||
|
import com.graphhopper.jsprit.core.problem.solution.route.activity.TimeWindow;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.Vehicle;
|
import com.graphhopper.jsprit.core.problem.vehicle.Vehicle;
|
||||||
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
||||||
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleType;
|
||||||
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
||||||
import com.graphhopper.jsprit.core.util.FastVehicleRoutingTransportCostsMatrix;
|
import com.graphhopper.jsprit.core.util.FastVehicleRoutingTransportCostsMatrix;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileReader;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -48,26 +51,35 @@ import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
public class MeetTimeWindowConstraint_IT {
|
public class MeetTimeWindowConstraint_IT {
|
||||||
|
|
||||||
|
VehicleRoutingProblem vrp;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void doBefore(){
|
||||||
|
VehicleType type1 = VehicleTypeImpl.Builder.newInstance("5").build();
|
||||||
|
VehicleType type2 = VehicleTypeImpl.Builder.newInstance("3.5").build();
|
||||||
|
VehicleImpl vehicle1 = VehicleImpl.Builder.newInstance("21").setStartLocation(Location.newInstance(0,0))
|
||||||
|
.setEarliestStart(14400).setLatestArrival(46800).setType(type1).build();
|
||||||
|
VehicleImpl vehicle2 = VehicleImpl.Builder.newInstance("19").setStartLocation(Location.newInstance(0,0))
|
||||||
|
.setEarliestStart(39600).setLatestArrival(64800).setType(type2).build();
|
||||||
|
Service service1 = Service.Builder.newInstance("2").setLocation(Location.newInstance(2000, 0))
|
||||||
|
.setTimeWindow(TimeWindow.newInstance(54000,54000)).build();
|
||||||
|
Service service2 = Service.Builder.newInstance("1").setLocation(Location.newInstance(1000, 1000))
|
||||||
|
.setTimeWindow(TimeWindow.newInstance(19800,21600)).build();
|
||||||
|
vrp = VehicleRoutingProblem.Builder.newInstance().addVehicle(vehicle1).addVehicle(vehicle2)
|
||||||
|
.addJob(service1).addJob(service2).setFleetSize(VehicleRoutingProblem.FleetSize.FINITE).build();
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenEmployingVehicleWithDifferentWorkingShifts_nRoutesShouldBeCorrect() {
|
public void whenEmployingVehicleWithDifferentWorkingShifts_nRoutesShouldBeCorrect() {
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
|
||||||
vra.setMaxIterations(100);
|
vra.setMaxIterations(100);
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
|
|
||||||
Assert.assertEquals(2, Solutions.bestOf(solutions).getRoutes().size());
|
Assert.assertEquals(2, Solutions.bestOf(solutions).getRoutes().size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenEmployingVehicleWithDifferentWorkingShifts_certainJobsCanNeverBeAssignedToCertainVehicles() {
|
public void whenEmployingVehicleWithDifferentWorkingShifts_certainJobsCanNeverBeAssignedToCertainVehicles() {
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
|
||||||
vra.setMaxIterations(100);
|
vra.setMaxIterations(100);
|
||||||
final List<Boolean> testFailed = new ArrayList<Boolean>();
|
final List<Boolean> testFailed = new ArrayList<Boolean>();
|
||||||
vra.addListener(new JobInsertedListener() {
|
vra.addListener(new JobInsertedListener() {
|
||||||
|
|
@ -89,17 +101,12 @@ public class MeetTimeWindowConstraint_IT {
|
||||||
});
|
});
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
|
|
||||||
assertTrue(testFailed.isEmpty());
|
assertTrue(testFailed.isEmpty());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenEmployingVehicleWithDifferentWorkingShifts_certainVehiclesCanNeverBeAssignedToCertainRoutes() {
|
public void whenEmployingVehicleWithDifferentWorkingShifts_certainVehiclesCanNeverBeAssignedToCertainRoutes() {
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
|
||||||
vra.setMaxIterations(100);
|
vra.setMaxIterations(100);
|
||||||
final List<Boolean> testFailed = new ArrayList<Boolean>();
|
final List<Boolean> testFailed = new ArrayList<Boolean>();
|
||||||
vra.addListener(new VehicleSwitchedListener() {
|
vra.addListener(new VehicleSwitchedListener() {
|
||||||
|
|
@ -133,11 +140,7 @@ public class MeetTimeWindowConstraint_IT {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenEmployingVehicleWithDifferentWorkingShifts_job2CanNeverBeInVehicle21() {
|
public void whenEmployingVehicleWithDifferentWorkingShifts_job2CanNeverBeInVehicle21() {
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
|
||||||
vra.setMaxIterations(100);
|
vra.setMaxIterations(100);
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
|
|
||||||
|
|
@ -146,40 +149,24 @@ public class MeetTimeWindowConstraint_IT {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenEmployingVehicleWithDifferentWorkingShifts_job1ShouldBeAssignedCorrectly() {
|
public void whenEmployingVehicleWithDifferentWorkingShifts_job1ShouldBeAssignedCorrectly() {
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
|
||||||
vra.setMaxIterations(100);
|
vra.setMaxIterations(100);
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
|
|
||||||
// assertEquals(2,Solutions.bestOf(solutions).getRoutes().size());
|
|
||||||
assertTrue(containsJob(vrp.getJobs().get("1"), getRoute("21", Solutions.bestOf(solutions))));
|
assertTrue(containsJob(vrp.getJobs().get("1"), getRoute("21", Solutions.bestOf(solutions))));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenEmployingVehicleWithDifferentWorkingShifts_job2ShouldBeAssignedCorrectly() {
|
public void whenEmployingVehicleWithDifferentWorkingShifts_job2ShouldBeAssignedCorrectly() {
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
|
||||||
vra.setMaxIterations(100);
|
vra.setMaxIterations(100);
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
|
|
||||||
// assertEquals(2,Solutions.bestOf(solutions).getRoutes().size());
|
|
||||||
assertTrue(containsJob(vrp.getJobs().get("2"), getRoute("19", Solutions.bestOf(solutions))));
|
assertTrue(containsJob(vrp.getJobs().get("2"), getRoute("19", Solutions.bestOf(solutions))));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenEmployingVehicleWithDifferentWorkingShifts_and_vehicleSwitchIsNotAllowed_nRoutesShouldBeCorrect() {
|
public void whenEmployingVehicleWithDifferentWorkingShifts_and_vehicleSwitchIsNotAllowed_nRoutesShouldBeCorrect() {
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp).setProperty(Jsprit.Parameter.VEHICLE_SWITCH,"false").buildAlgorithm();
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/schrimpf_vehicleSwitchNotAllowed.xml");
|
|
||||||
vra.setMaxIterations(100);
|
vra.setMaxIterations(100);
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
|
|
||||||
|
|
@ -188,11 +175,7 @@ public class MeetTimeWindowConstraint_IT {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenEmployingVehicleWithDifferentWorkingShifts_and_vehicleSwitchIsNotAllowed_certainJobsCanNeverBeAssignedToCertainVehicles() {
|
public void whenEmployingVehicleWithDifferentWorkingShifts_and_vehicleSwitchIsNotAllowed_certainJobsCanNeverBeAssignedToCertainVehicles() {
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp).setProperty(Jsprit.Parameter.VEHICLE_SWITCH,"false").buildAlgorithm();
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/schrimpf_vehicleSwitchNotAllowed.xml");
|
|
||||||
vra.setMaxIterations(100);
|
vra.setMaxIterations(100);
|
||||||
final List<Boolean> testFailed = new ArrayList<Boolean>();
|
final List<Boolean> testFailed = new ArrayList<Boolean>();
|
||||||
vra.addListener(new JobInsertedListener() {
|
vra.addListener(new JobInsertedListener() {
|
||||||
|
|
@ -220,11 +203,7 @@ public class MeetTimeWindowConstraint_IT {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenEmployingVehicleWithDifferentWorkingShifts_and_vehicleSwitchIsNotAllowed_certainVehiclesCanNeverBeAssignedToCertainRoutes() {
|
public void whenEmployingVehicleWithDifferentWorkingShifts_and_vehicleSwitchIsNotAllowed_certainVehiclesCanNeverBeAssignedToCertainRoutes() {
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp).setProperty(Jsprit.Parameter.VEHICLE_SWITCH,"false").buildAlgorithm();
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/schrimpf_vehicleSwitchNotAllowed.xml");
|
|
||||||
vra.setMaxIterations(100);
|
vra.setMaxIterations(100);
|
||||||
final List<Boolean> testFailed = new ArrayList<Boolean>();
|
final List<Boolean> testFailed = new ArrayList<Boolean>();
|
||||||
vra.addListener(new VehicleSwitchedListener() {
|
vra.addListener(new VehicleSwitchedListener() {
|
||||||
|
|
@ -258,11 +237,7 @@ public class MeetTimeWindowConstraint_IT {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenEmployingVehicleWithDifferentWorkingShifts_and_vehicleSwitchIsNotAllowed_job2CanNeverBeInVehicle21() {
|
public void whenEmployingVehicleWithDifferentWorkingShifts_and_vehicleSwitchIsNotAllowed_job2CanNeverBeInVehicle21() {
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp).setProperty(Jsprit.Parameter.VEHICLE_SWITCH,"false").buildAlgorithm();
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/schrimpf_vehicleSwitchNotAllowed.xml");
|
|
||||||
vra.setMaxIterations(100);
|
vra.setMaxIterations(100);
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
|
|
||||||
|
|
@ -271,11 +246,7 @@ public class MeetTimeWindowConstraint_IT {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenEmployingVehicleWithDifferentWorkingShifts_and_vehicleSwitchIsNotAllowed_job1ShouldBeAssignedCorrectly() {
|
public void whenEmployingVehicleWithDifferentWorkingShifts_and_vehicleSwitchIsNotAllowed_job1ShouldBeAssignedCorrectly() {
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp).setProperty(Jsprit.Parameter.VEHICLE_SWITCH,"false").buildAlgorithm();
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/schrimpf_vehicleSwitchNotAllowed.xml");
|
|
||||||
vra.setMaxIterations(100);
|
vra.setMaxIterations(100);
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
|
|
||||||
|
|
@ -285,261 +256,7 @@ public class MeetTimeWindowConstraint_IT {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenEmployingVehicleWithDifferentWorkingShifts_and_vehicleSwitchIsNotAllowed_job2ShouldBeAssignedCorrectly() {
|
public void whenEmployingVehicleWithDifferentWorkingShifts_and_vehicleSwitchIsNotAllowed_job2ShouldBeAssignedCorrectly() {
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp).setProperty(Jsprit.Parameter.VEHICLE_SWITCH,"false").buildAlgorithm();
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/schrimpf_vehicleSwitchNotAllowed.xml");
|
|
||||||
vra.setMaxIterations(100);
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
|
|
||||||
assertEquals(2, Solutions.bestOf(solutions).getRoutes().size());
|
|
||||||
assertTrue(containsJob(vrp.getJobs().get("2"), getRoute("19", Solutions.bestOf(solutions))));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenEmployingVehicleWithDifferentWorkingShifts_jsprit_nRoutesShouldBeCorrect() {
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
|
||||||
vra.setMaxIterations(100);
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
|
|
||||||
assertEquals(2, Solutions.bestOf(solutions).getRoutes().size());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenEmployingVehicleWithDifferentWorkingShifts_jsprit_certainJobsCanNeverBeAssignedToCertainVehicles() {
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
|
||||||
vra.setMaxIterations(100);
|
|
||||||
final List<Boolean> testFailed = new ArrayList<Boolean>();
|
|
||||||
vra.addListener(new JobInsertedListener() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) {
|
|
||||||
if (job2insert.getId().equals("1")) {
|
|
||||||
if (inRoute.getVehicle().getId().equals("19")) {
|
|
||||||
testFailed.add(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (job2insert.getId().equals("2")) {
|
|
||||||
if (inRoute.getVehicle().getId().equals("21")) {
|
|
||||||
testFailed.add(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
|
|
||||||
assertTrue(testFailed.isEmpty());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenEmployingVehicleWithDifferentWorkingShifts_jsprit_certainVehiclesCanNeverBeAssignedToCertainRoutes() {
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
|
||||||
vra.setMaxIterations(100);
|
|
||||||
final List<Boolean> testFailed = new ArrayList<Boolean>();
|
|
||||||
vra.addListener(new VehicleSwitchedListener() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void vehicleSwitched(VehicleRoute vehicleRoute, Vehicle oldVehicle, Vehicle newVehicle) {
|
|
||||||
if (oldVehicle == null) return;
|
|
||||||
if (oldVehicle.getId().equals("21") && newVehicle.getId().equals("19")) {
|
|
||||||
for (Job j : vehicleRoute.getTourActivities().getJobs()) {
|
|
||||||
if (j.getId().equals("1")) {
|
|
||||||
testFailed.add(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (oldVehicle.getId().equals("19") && newVehicle.getId().equals("21")) {
|
|
||||||
for (Job j : vehicleRoute.getTourActivities().getJobs()) {
|
|
||||||
if (j.getId().equals("2")) {
|
|
||||||
testFailed.add(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
assertTrue(testFailed.isEmpty());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenEmployingVehicleWithDifferentWorkingShifts_jsprit_job2CanNeverBeInVehicle21() {
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
|
||||||
vra.setMaxIterations(100);
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
|
|
||||||
assertEquals(2, Solutions.bestOf(solutions).getRoutes().size());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenEmployingVehicleWithDifferentWorkingShifts_jsprit_job1ShouldBeAssignedCorrectly() {
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
|
||||||
vra.setMaxIterations(100);
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
|
|
||||||
// assertEquals(2,Solutions.bestOf(solutions).getRoutes().size());
|
|
||||||
assertTrue(containsJob(vrp.getJobs().get("1"), getRoute("21", Solutions.bestOf(solutions))));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenEmployingVehicleWithDifferentWorkingShifts_jsprit_job2ShouldBeAssignedCorrectly() {
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
|
||||||
vra.setMaxIterations(100);
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
|
|
||||||
// assertEquals(2,Solutions.bestOf(solutions).getRoutes().size());
|
|
||||||
assertTrue(containsJob(vrp.getJobs().get("2"), getRoute("19", Solutions.bestOf(solutions))));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenEmployingVehicleWithDifferentWorkingShifts_jsprit_and_vehicleSwitchIsNotAllowed_nRoutesShouldBeCorrect() {
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp).setProperty(Jsprit.Parameter.VEHICLE_SWITCH, "false").buildAlgorithm();
|
|
||||||
vra.setMaxIterations(100);
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
|
|
||||||
assertEquals(2, Solutions.bestOf(solutions).getRoutes().size());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenEmployingVehicleWithDifferentWorkingShifts_and_vehicleSwitchIsNotAllowed_jsprit_certainJobsCanNeverBeAssignedToCertainVehicles() {
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp).setProperty(Jsprit.Parameter.VEHICLE_SWITCH, "false").buildAlgorithm();
|
|
||||||
vra.setMaxIterations(100);
|
|
||||||
final List<Boolean> testFailed = new ArrayList<Boolean>();
|
|
||||||
vra.addListener(new JobInsertedListener() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) {
|
|
||||||
if (job2insert.getId().equals("1")) {
|
|
||||||
if (inRoute.getVehicle().getId().equals("19")) {
|
|
||||||
testFailed.add(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (job2insert.getId().equals("2")) {
|
|
||||||
if (inRoute.getVehicle().getId().equals("21")) {
|
|
||||||
testFailed.add(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
|
|
||||||
assertTrue(testFailed.isEmpty());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenEmployingVehicleWithDifferentWorkingShifts_and_vehicleSwitchIsNotAllowed_jsprit_certainVehiclesCanNeverBeAssignedToCertainRoutes() {
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp).setProperty(Jsprit.Parameter.VEHICLE_SWITCH, "false").buildAlgorithm();
|
|
||||||
vra.setMaxIterations(100);
|
|
||||||
final List<Boolean> testFailed = new ArrayList<Boolean>();
|
|
||||||
vra.addListener(new VehicleSwitchedListener() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void vehicleSwitched(VehicleRoute vehicleRoute, Vehicle oldVehicle, Vehicle newVehicle) {
|
|
||||||
if (oldVehicle == null) return;
|
|
||||||
if (oldVehicle.getId().equals("21") && newVehicle.getId().equals("19")) {
|
|
||||||
for (Job j : vehicleRoute.getTourActivities().getJobs()) {
|
|
||||||
if (j.getId().equals("1")) {
|
|
||||||
testFailed.add(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (oldVehicle.getId().equals("19") && newVehicle.getId().equals("21")) {
|
|
||||||
for (Job j : vehicleRoute.getTourActivities().getJobs()) {
|
|
||||||
if (j.getId().equals("2")) {
|
|
||||||
testFailed.add(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
assertTrue(testFailed.isEmpty());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenEmployingVehicleWithDifferentWorkingShifts_and_vehicleSwitchIsNotAllowed_jsprit_job2CanNeverBeInVehicle21() {
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp).setProperty(Jsprit.Parameter.VEHICLE_SWITCH, "false").buildAlgorithm();
|
|
||||||
vra.setMaxIterations(100);
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
|
|
||||||
assertEquals(2, Solutions.bestOf(solutions).getRoutes().size());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenEmployingVehicleWithDifferentWorkingShifts_and_vehicleSwitchIsNotAllowed_jsprit_job1ShouldBeAssignedCorrectly() {
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp).setProperty(Jsprit.Parameter.VEHICLE_SWITCH, "false").buildAlgorithm();
|
|
||||||
vra.setMaxIterations(100);
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
|
|
||||||
assertEquals(2, Solutions.bestOf(solutions).getRoutes().size());
|
|
||||||
assertTrue(containsJob(vrp.getJobs().get("1"), getRoute("21", Solutions.bestOf(solutions))));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenEmployingVehicleWithDifferentWorkingShifts_and_vehicleSwitchIsNotAllowed_jsprit_job2ShouldBeAssignedCorrectly() {
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp).setProperty(Jsprit.Parameter.VEHICLE_SWITCH, "false").buildAlgorithm();
|
|
||||||
vra.setMaxIterations(100);
|
vra.setMaxIterations(100);
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
|
|
||||||
|
|
@ -549,12 +266,8 @@ public class MeetTimeWindowConstraint_IT {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenUsingJsprit_driverTimesShouldBeMet() throws IOException {
|
public void whenUsingJsprit_driverTimesShouldBeMet() throws IOException {
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
VehicleRoutingProblem vrp = createTWBugProblem();
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/twbug.xml");
|
VehicleRoutingAlgorithm algorithm = Jsprit.createAlgorithm(vrp);
|
||||||
final FastVehicleRoutingTransportCostsMatrix matrix = createMatrix();
|
|
||||||
vrpBuilder.setRoutingCost(matrix);
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
VehicleRoutingAlgorithm algorithm = Jsprit.Builder.newInstance(vrp).buildAlgorithm();
|
|
||||||
algorithm.setMaxIterations(1000);
|
algorithm.setMaxIterations(1000);
|
||||||
VehicleRoutingProblemSolution solution = Solutions.bestOf(algorithm.searchSolutions());
|
VehicleRoutingProblemSolution solution = Solutions.bestOf(algorithm.searchSolutions());
|
||||||
for (VehicleRoute r : solution.getRoutes()) {
|
for (VehicleRoute r : solution.getRoutes()) {
|
||||||
|
|
@ -563,41 +276,8 @@ public class MeetTimeWindowConstraint_IT {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenUsingSchrimpf_driverTimesShouldBeMet() throws IOException {
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/twbug.xml");
|
|
||||||
final FastVehicleRoutingTransportCostsMatrix matrix = createMatrix();
|
|
||||||
vrpBuilder.setRoutingCost(matrix);
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
VehicleRoutingAlgorithm algorithm = new SchrimpfFactory().createAlgorithm(vrp);
|
|
||||||
algorithm.setMaxIterations(1000);
|
|
||||||
VehicleRoutingProblemSolution solution = Solutions.bestOf(algorithm.searchSolutions());
|
|
||||||
for (VehicleRoute r : solution.getRoutes()) {
|
|
||||||
assertTrue(r.getVehicle().getEarliestDeparture() <= r.getDepartureTime());
|
|
||||||
assertTrue(r.getVehicle().getLatestArrival() >= r.getEnd().getArrTime());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenUsingGreedySchrimpf_driverTimesShouldBeMet() throws IOException {
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/twbug.xml");
|
|
||||||
final FastVehicleRoutingTransportCostsMatrix matrix = createMatrix();
|
|
||||||
vrpBuilder.setRoutingCost(matrix);
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
VehicleRoutingAlgorithm algorithm = new GreedySchrimpfFactory().createAlgorithm(vrp);
|
|
||||||
algorithm.setMaxIterations(1000);
|
|
||||||
VehicleRoutingProblemSolution solution = Solutions.bestOf(algorithm.searchSolutions());
|
|
||||||
for (VehicleRoute r : solution.getRoutes()) {
|
|
||||||
assertTrue(r.getVehicle().getEarliestDeparture() <= r.getDepartureTime());
|
|
||||||
assertTrue(r.getVehicle().getLatestArrival() >= r.getEnd().getArrTime());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private FastVehicleRoutingTransportCostsMatrix createMatrix() throws IOException {
|
private FastVehicleRoutingTransportCostsMatrix createMatrix() throws IOException {
|
||||||
BufferedReader reader = new BufferedReader(new FileReader(new File("src/test/resources/matrix.txt")));
|
BufferedReader reader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("matrix.txt")));
|
||||||
String line;
|
String line;
|
||||||
FastVehicleRoutingTransportCostsMatrix.Builder builder = FastVehicleRoutingTransportCostsMatrix.Builder.newInstance(11, false);
|
FastVehicleRoutingTransportCostsMatrix.Builder builder = FastVehicleRoutingTransportCostsMatrix.Builder.newInstance(11, false);
|
||||||
while ((line = reader.readLine()) != null) {
|
while ((line = reader.readLine()) != null) {
|
||||||
|
|
@ -628,4 +308,75 @@ public class MeetTimeWindowConstraint_IT {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private VehicleRoutingProblem createTWBugProblem() throws IOException {
|
||||||
|
VehicleType type = VehicleTypeImpl.Builder.newInstance("type").addCapacityDimension(0,20)
|
||||||
|
.setCostPerTransportTime(1.).setCostPerDistance(0).build();
|
||||||
|
VehicleImpl v0 = VehicleImpl.Builder.newInstance("vehicle0").setStartLocation(Location.newInstance(0))
|
||||||
|
.setEarliestStart(60).setLatestArrival(18060).setType(type).build();
|
||||||
|
VehicleImpl v1 = VehicleImpl.Builder.newInstance("vehicle1").setStartLocation(Location.newInstance(0))
|
||||||
|
.setEarliestStart(60).setLatestArrival(18060).setType(type).build();
|
||||||
|
VehicleImpl v2 = VehicleImpl.Builder.newInstance("vehicle2").setStartLocation(Location.newInstance(0))
|
||||||
|
.setEarliestStart(7200).setLatestArrival(36060).setType(type).build();
|
||||||
|
VehicleImpl v3 = VehicleImpl.Builder.newInstance("vehicle3").setStartLocation(Location.newInstance(0))
|
||||||
|
.setEarliestStart(36000).setLatestArrival(54060).setType(type).build();
|
||||||
|
VehicleImpl v4 = VehicleImpl.Builder.newInstance("vehicle4").setStartLocation(Location.newInstance(0))
|
||||||
|
.setEarliestStart(36000).setLatestArrival(54060).setType(type).build();
|
||||||
|
|
||||||
|
Service s1 = Service.Builder.newInstance("1").setLocation(Location.Builder.newInstance().setIndex(1).setId("js0").build())
|
||||||
|
.setServiceTime(600).setTimeWindow(TimeWindow.newInstance(0,1800)).addSizeDimension(0,1).build();
|
||||||
|
Service s2 = Service.Builder.newInstance("2").setLocation(Location.Builder.newInstance().setIndex(2).setId("js2").build())
|
||||||
|
.setServiceTime(600).setTimeWindow(TimeWindow.newInstance(5400, 7200)).addSizeDimension(0, 2).build();
|
||||||
|
Service s3 = Service.Builder.newInstance("3").setLocation(Location.Builder.newInstance().setIndex(3).setId("js5").build())
|
||||||
|
.setServiceTime(1800).setTimeWindow(TimeWindow.newInstance(17100, 18000)).addSizeDimension(0, 10).build();
|
||||||
|
Service s4 = Service.Builder.newInstance("4").setLocation(Location.Builder.newInstance().setIndex(4).setId("js4").build())
|
||||||
|
.setServiceTime(900).addSizeDimension(0, 2).build();
|
||||||
|
Service s5 = Service.Builder.newInstance("5").setLocation(Location.Builder.newInstance().setIndex(5).setId("js8").build())
|
||||||
|
.setServiceTime(600).addSizeDimension(0, 4).build();
|
||||||
|
Service s6 = Service.Builder.newInstance("6").setLocation(Location.Builder.newInstance().setIndex(6).setId("js10").build())
|
||||||
|
.setServiceTime(1500).setTimeWindow(TimeWindow.newInstance(29700,32400)).addSizeDimension(0, 10).build();
|
||||||
|
Service s7 = Service.Builder.newInstance("7").setLocation(Location.Builder.newInstance().setIndex(7).setId("jsp3").build())
|
||||||
|
.setServiceTime(5594).build();
|
||||||
|
|
||||||
|
Shipment shipment1 = Shipment.Builder.newInstance("shipment1")
|
||||||
|
.setPickupServiceTime(900)
|
||||||
|
.setPickupLocation(Location.Builder.newInstance().setId("jsp1").setIndex(1).build())
|
||||||
|
.setDeliveryLocation(Location.Builder.newInstance().setId("jsd1").setIndex(8).build())
|
||||||
|
.setDeliveryServiceTime(900).build();
|
||||||
|
|
||||||
|
Shipment shipment2 = Shipment.Builder.newInstance("shipment2")
|
||||||
|
.setPickupLocation(Location.Builder.newInstance().setId("jsp4").setIndex(9).build())
|
||||||
|
.setPickupServiceTime(1200)
|
||||||
|
.addPickupTimeWindow(21600,23400)
|
||||||
|
.setDeliveryLocation(Location.Builder.newInstance().setId("jsd4").setIndex(8).build())
|
||||||
|
.setDeliveryServiceTime(900)
|
||||||
|
.addDeliveryTimeWindow(25200,27000)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
Shipment shipment3 = Shipment.Builder.newInstance("shipment3")
|
||||||
|
.setPickupLocation(Location.Builder.newInstance().setId("jsp7").setIndex(9).build())
|
||||||
|
.setPickupServiceTime(1200)
|
||||||
|
.addPickupTimeWindow(37800,41400)
|
||||||
|
.setDeliveryLocation(Location.Builder.newInstance().setId("jsd7").setIndex(8).build())
|
||||||
|
.setDeliveryServiceTime(1800)
|
||||||
|
.addDeliveryTimeWindow(43200,45900)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
Shipment shipment4 = Shipment.Builder.newInstance("shipment4")
|
||||||
|
.setPickupLocation(Location.Builder.newInstance().setId("jsp9").setIndex(10).build())
|
||||||
|
.setPickupServiceTime(300)
|
||||||
|
.addPickupTimeWindow(45000,48600)
|
||||||
|
.setDeliveryLocation(Location.Builder.newInstance().setId("jsd9").setIndex(8).build())
|
||||||
|
.setDeliveryServiceTime(300)
|
||||||
|
.addDeliveryTimeWindow(50400,52200)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
FastVehicleRoutingTransportCostsMatrix matrix = createMatrix();
|
||||||
|
return VehicleRoutingProblem.Builder.newInstance().setFleetSize(VehicleRoutingProblem.FleetSize.FINITE)
|
||||||
|
.addJob(s1).addJob(s2).addJob(s3).addJob(s4).addJob(s5).addJob(s6).addJob(s7)
|
||||||
|
.addJob(shipment1).addJob(shipment2).addJob(shipment3).addJob(shipment4)
|
||||||
|
.addVehicle(v0).addVehicle(v1).addVehicle(v2).addVehicle(v3).addVehicle(v4)
|
||||||
|
.setRoutingCost(matrix).build();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,10 +20,9 @@ package com.graphhopper.jsprit.core.algorithm;
|
||||||
|
|
||||||
import com.graphhopper.jsprit.core.IntegrationTest;
|
import com.graphhopper.jsprit.core.IntegrationTest;
|
||||||
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLReader;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
|
import com.graphhopper.jsprit.core.util.LiLimReader;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.experimental.categories.Category;
|
import org.junit.experimental.categories.Category;
|
||||||
|
|
@ -38,22 +37,9 @@ public class PickupsAndDeliveries_IT {
|
||||||
@Category(IntegrationTest.class)
|
@Category(IntegrationTest.class)
|
||||||
public void whenSolvingLR101InstanceOfLiLim_solutionsMustNoBeWorseThan5PercentOfBestKnownSolution() {
|
public void whenSolvingLR101InstanceOfLiLim_solutionsMustNoBeWorseThan5PercentOfBestKnownSolution() {
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/lilim_lr101.xml");
|
new LiLimReader(vrpBuilder).read(getClass().getResourceAsStream("lr101.txt"));
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
VehicleRoutingProblem vrp = vrpBuilder.build();
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/lilim_algorithmConfig.xml");
|
VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp).setProperty(Jsprit.Parameter.FAST_REGRET,"true").buildAlgorithm();
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
assertEquals(1650.8, Solutions.bestOf(solutions).getCost(), 80.);
|
|
||||||
assertEquals(19, Solutions.bestOf(solutions).getRoutes().size(), 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Category(IntegrationTest.class)
|
|
||||||
public void whenSolvingLR101InstanceOfLiLim_withJsprit_solutionsMustNoBeWorseThan5PercentOfBestKnownSolution() {
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/lilim_lr101.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
|
||||||
vra.setMaxIterations(1000);
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
assertEquals(1650.8, Solutions.bestOf(solutions).getCost(), 80.);
|
assertEquals(1650.8, Solutions.bestOf(solutions).getCost(), 80.);
|
||||||
assertEquals(19, Solutions.bestOf(solutions).getRoutes().size(), 1);
|
assertEquals(19, Solutions.bestOf(solutions).getRoutes().size(), 1);
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,10 @@ import com.graphhopper.jsprit.core.util.VehicleRoutingTransportCostsMatrix;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.experimental.categories.Category;
|
import org.junit.experimental.categories.Category;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.BufferedReader;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
@ -39,65 +42,6 @@ import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
public class RefuseCollectionWithCostsHigherThanTimesAndFiniteFleet_IT {
|
public class RefuseCollectionWithCostsHigherThanTimesAndFiniteFleet_IT {
|
||||||
|
|
||||||
static class RelationKey {
|
|
||||||
|
|
||||||
static RelationKey newKey(String from, String to) {
|
|
||||||
int fromInt = Integer.parseInt(from);
|
|
||||||
int toInt = Integer.parseInt(to);
|
|
||||||
if (fromInt < toInt) {
|
|
||||||
return new RelationKey(from, to);
|
|
||||||
} else {
|
|
||||||
return new RelationKey(to, from);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
final String from;
|
|
||||||
final String to;
|
|
||||||
|
|
||||||
public RelationKey(String from, String to) {
|
|
||||||
super();
|
|
||||||
this.from = from;
|
|
||||||
this.to = to;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see java.lang.Object#hashCode()
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
final int prime = 31;
|
|
||||||
int result = 1;
|
|
||||||
result = prime * result + ((from == null) ? 0 : from.hashCode());
|
|
||||||
result = prime * result + ((to == null) ? 0 : to.hashCode());
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see java.lang.Object#equals(java.lang.Object)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object obj) {
|
|
||||||
if (this == obj)
|
|
||||||
return true;
|
|
||||||
if (obj == null)
|
|
||||||
return false;
|
|
||||||
if (getClass() != obj.getClass())
|
|
||||||
return false;
|
|
||||||
RelationKey other = (RelationKey) obj;
|
|
||||||
if (from == null) {
|
|
||||||
if (other.from != null)
|
|
||||||
return false;
|
|
||||||
} else if (!from.equals(other.from))
|
|
||||||
return false;
|
|
||||||
if (to == null) {
|
|
||||||
if (other.to != null)
|
|
||||||
return false;
|
|
||||||
} else if (!to.equals(other.to))
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Category(IntegrationTest.class)
|
@Category(IntegrationTest.class)
|
||||||
public void testAlgo() {
|
public void testAlgo() {
|
||||||
|
|
@ -152,8 +96,8 @@ public class RefuseCollectionWithCostsHigherThanTimesAndFiniteFleet_IT {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static void readDemandQuantities(VehicleRoutingProblem.Builder vrpBuilder) throws FileNotFoundException, IOException {
|
private void readDemandQuantities(VehicleRoutingProblem.Builder vrpBuilder) throws IOException {
|
||||||
BufferedReader reader = new BufferedReader(new FileReader(new File("src/test/resources/refuseCollectionExample_Quantities")));
|
BufferedReader reader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("refuseCollectionExample_Quantities")));
|
||||||
String line = null;
|
String line = null;
|
||||||
boolean firstLine = true;
|
boolean firstLine = true;
|
||||||
while ((line = reader.readLine()) != null) {
|
while ((line = reader.readLine()) != null) {
|
||||||
|
|
@ -176,8 +120,8 @@ public class RefuseCollectionWithCostsHigherThanTimesAndFiniteFleet_IT {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static void readDistances(VehicleRoutingTransportCostsMatrix.Builder matrixBuilder) throws IOException {
|
private void readDistances(VehicleRoutingTransportCostsMatrix.Builder matrixBuilder) throws IOException {
|
||||||
BufferedReader reader = new BufferedReader(new FileReader(new File("src/test/resources/refuseCollectionExample_Distances")));
|
BufferedReader reader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("refuseCollectionExample_Distances")));
|
||||||
String line = null;
|
String line = null;
|
||||||
boolean firstLine = true;
|
boolean firstLine = true;
|
||||||
while ((line = reader.readLine()) != null) {
|
while ((line = reader.readLine()) != null) {
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,10 @@ import com.graphhopper.jsprit.core.util.VehicleRoutingTransportCostsMatrix;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.experimental.categories.Category;
|
import org.junit.experimental.categories.Category;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.BufferedReader;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
@ -41,65 +44,6 @@ import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
public class RefuseCollectionWithCostsHigherThanTimesAndFiniteFleet_withTimeAndDistanceCosts_IT {
|
public class RefuseCollectionWithCostsHigherThanTimesAndFiniteFleet_withTimeAndDistanceCosts_IT {
|
||||||
|
|
||||||
static class RelationKey {
|
|
||||||
|
|
||||||
static RelationKey newKey(String from, String to) {
|
|
||||||
int fromInt = Integer.parseInt(from);
|
|
||||||
int toInt = Integer.parseInt(to);
|
|
||||||
if (fromInt < toInt) {
|
|
||||||
return new RelationKey(from, to);
|
|
||||||
} else {
|
|
||||||
return new RelationKey(to, from);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
final String from;
|
|
||||||
final String to;
|
|
||||||
|
|
||||||
public RelationKey(String from, String to) {
|
|
||||||
super();
|
|
||||||
this.from = from;
|
|
||||||
this.to = to;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see java.lang.Object#hashCode()
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
final int prime = 31;
|
|
||||||
int result = 1;
|
|
||||||
result = prime * result + ((from == null) ? 0 : from.hashCode());
|
|
||||||
result = prime * result + ((to == null) ? 0 : to.hashCode());
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see java.lang.Object#equals(java.lang.Object)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object obj) {
|
|
||||||
if (this == obj)
|
|
||||||
return true;
|
|
||||||
if (obj == null)
|
|
||||||
return false;
|
|
||||||
if (getClass() != obj.getClass())
|
|
||||||
return false;
|
|
||||||
RelationKey other = (RelationKey) obj;
|
|
||||||
if (from == null) {
|
|
||||||
if (other.from != null)
|
|
||||||
return false;
|
|
||||||
} else if (!from.equals(other.from))
|
|
||||||
return false;
|
|
||||||
if (to == null) {
|
|
||||||
if (other.to != null)
|
|
||||||
return false;
|
|
||||||
} else if (!to.equals(other.to))
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Category(IntegrationTest.class)
|
@Category(IntegrationTest.class)
|
||||||
public void testAlgo() {
|
public void testAlgo() {
|
||||||
|
|
@ -154,8 +98,8 @@ public class RefuseCollectionWithCostsHigherThanTimesAndFiniteFleet_withTimeAndD
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static void readDemandQuantities(VehicleRoutingProblem.Builder vrpBuilder) throws FileNotFoundException, IOException {
|
private void readDemandQuantities(VehicleRoutingProblem.Builder vrpBuilder) throws IOException {
|
||||||
BufferedReader reader = new BufferedReader(new FileReader(new File("src/test/resources/refuseCollectionExample_Quantities")));
|
BufferedReader reader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("refuseCollectionExample_Quantities")));
|
||||||
String line = null;
|
String line = null;
|
||||||
boolean firstLine = true;
|
boolean firstLine = true;
|
||||||
while ((line = reader.readLine()) != null) {
|
while ((line = reader.readLine()) != null) {
|
||||||
|
|
@ -178,8 +122,8 @@ public class RefuseCollectionWithCostsHigherThanTimesAndFiniteFleet_withTimeAndD
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static void readDistances(VehicleRoutingTransportCostsMatrix.Builder matrixBuilder) throws IOException {
|
private void readDistances(VehicleRoutingTransportCostsMatrix.Builder matrixBuilder) throws IOException {
|
||||||
BufferedReader reader = new BufferedReader(new FileReader(new File("src/test/resources/refuseCollectionExample_Distances")));
|
BufferedReader reader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("refuseCollectionExample_Distances")));
|
||||||
String line = null;
|
String line = null;
|
||||||
boolean firstLine = true;
|
boolean firstLine = true;
|
||||||
while ((line = reader.readLine()) != null) {
|
while ((line = reader.readLine()) != null) {
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,10 @@ import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.experimental.categories.Category;
|
import org.junit.experimental.categories.Category;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.Reader;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -223,8 +226,8 @@ public class RefuseCollection_IT {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static void readDemandQuantitiesAsServices(VehicleRoutingProblem.Builder vrpBuilder) {
|
private void readDemandQuantitiesAsServices(VehicleRoutingProblem.Builder vrpBuilder) {
|
||||||
BufferedReader reader = getBufferedReader("src/test/resources/refuseCollectionExample_Quantities");
|
BufferedReader reader = getBufferedReader("refuseCollectionExample_Quantities");
|
||||||
String line;
|
String line;
|
||||||
boolean firstLine = true;
|
boolean firstLine = true;
|
||||||
while ((line = readLine(reader)) != null) {
|
while ((line = readLine(reader)) != null) {
|
||||||
|
|
@ -246,18 +249,12 @@ public class RefuseCollection_IT {
|
||||||
close(reader);
|
close(reader);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static BufferedReader getBufferedReader(String s) {
|
private BufferedReader getBufferedReader(String s) {
|
||||||
BufferedReader reader = null;
|
return new BufferedReader(new InputStreamReader(getClass().getResourceAsStream(s)));
|
||||||
try {
|
|
||||||
reader = new BufferedReader(new FileReader(new File(s)));
|
|
||||||
} catch (FileNotFoundException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return reader;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void readDemandQuantitiesAsPickups(VehicleRoutingProblem.Builder vrpBuilder) {
|
private void readDemandQuantitiesAsPickups(VehicleRoutingProblem.Builder vrpBuilder) {
|
||||||
BufferedReader reader = getBufferedReader("src/test/resources/refuseCollectionExample_Quantities");
|
BufferedReader reader = getBufferedReader("refuseCollectionExample_Quantities");
|
||||||
String line;
|
String line;
|
||||||
boolean firstLine = true;
|
boolean firstLine = true;
|
||||||
while ((line = readLine(reader)) != null) {
|
while ((line = readLine(reader)) != null) {
|
||||||
|
|
@ -279,8 +276,8 @@ public class RefuseCollection_IT {
|
||||||
close(reader);
|
close(reader);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void readDemandQuantitiesAsDeliveries(VehicleRoutingProblem.Builder vrpBuilder) {
|
private void readDemandQuantitiesAsDeliveries(VehicleRoutingProblem.Builder vrpBuilder) {
|
||||||
BufferedReader reader = getBufferedReader("src/test/resources/refuseCollectionExample_Quantities");
|
BufferedReader reader = getBufferedReader("refuseCollectionExample_Quantities");
|
||||||
String line;
|
String line;
|
||||||
boolean firstLine = true;
|
boolean firstLine = true;
|
||||||
while ((line = readLine(reader)) != null) {
|
while ((line = readLine(reader)) != null) {
|
||||||
|
|
@ -321,8 +318,8 @@ public class RefuseCollection_IT {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static void readDistances(VehicleRoutingTransportCostsMatrix.Builder matrixBuilder) {
|
private void readDistances(VehicleRoutingTransportCostsMatrix.Builder matrixBuilder) {
|
||||||
BufferedReader reader = getBufferedReader("src/test/resources/refuseCollectionExample_Distances");
|
BufferedReader reader = getBufferedReader("refuseCollectionExample_Distances");
|
||||||
String line;
|
String line;
|
||||||
boolean firstLine = true;
|
boolean firstLine = true;
|
||||||
while ((line = readLine(reader)) != null) {
|
while ((line = readLine(reader)) != null) {
|
||||||
|
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
package com.graphhopper.jsprit.core.algorithm;
|
|
||||||
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLReader;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import static org.junit.Assert.fail;
|
|
||||||
|
|
||||||
public class SelectRandomlyTest {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void loadAnAlgorithmWithSelectRandomly() {
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/simpleProblem.xml");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
try {
|
|
||||||
VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/algorithmConfig_selectRandomly.xml");
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
fail("Should be able to load an algorithm that uses <selector name=\"selectRandomly\"/>: " + e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -18,12 +18,9 @@
|
||||||
package com.graphhopper.jsprit.core.algorithm;
|
package com.graphhopper.jsprit.core.algorithm;
|
||||||
|
|
||||||
import com.graphhopper.jsprit.core.IntegrationTest;
|
import com.graphhopper.jsprit.core.IntegrationTest;
|
||||||
import com.graphhopper.jsprit.core.algorithm.recreate.NoSolutionFoundException;
|
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
|
||||||
import com.graphhopper.jsprit.core.problem.Skills;
|
import com.graphhopper.jsprit.core.problem.Skills;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLReader;
|
|
||||||
import com.graphhopper.jsprit.core.problem.job.Job;
|
import com.graphhopper.jsprit.core.problem.job.Job;
|
||||||
import com.graphhopper.jsprit.core.problem.job.Service;
|
import com.graphhopper.jsprit.core.problem.job.Service;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
|
|
@ -31,6 +28,7 @@ import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.Vehicle;
|
import com.graphhopper.jsprit.core.problem.vehicle.Vehicle;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleType;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleType;
|
||||||
|
import com.graphhopper.jsprit.core.util.SolomonReader;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
import com.graphhopper.jsprit.core.util.TestUtils;
|
import com.graphhopper.jsprit.core.util.TestUtils;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
@ -49,7 +47,7 @@ public class SolomonSkills_IT {
|
||||||
@Category(IntegrationTest.class)
|
@Category(IntegrationTest.class)
|
||||||
public void itShouldMakeCorrectAssignmentAccordingToSkills() {
|
public void itShouldMakeCorrectAssignmentAccordingToSkills() {
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/solomon_c101.xml");
|
new SolomonReader(vrpBuilder).read(getClass().getResourceAsStream("C101.txt"));
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
VehicleRoutingProblem vrp = vrpBuilder.build();
|
||||||
|
|
||||||
//y >= 50 skill1 otherwise skill2
|
//y >= 50 skill1 otherwise skill2
|
||||||
|
|
@ -80,36 +78,21 @@ public class SolomonSkills_IT {
|
||||||
skillProblemBuilder.setFleetSize(VehicleRoutingProblem.FleetSize.FINITE);
|
skillProblemBuilder.setFleetSize(VehicleRoutingProblem.FleetSize.FINITE);
|
||||||
VehicleRoutingProblem skillProblem = skillProblemBuilder.build();
|
VehicleRoutingProblem skillProblem = skillProblemBuilder.build();
|
||||||
|
|
||||||
VehicleRoutingAlgorithmBuilder vraBuilder = new VehicleRoutingAlgorithmBuilder(skillProblem, "src/test/resources/algorithmConfig.xml");
|
VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(skillProblem).setProperty(Jsprit.Parameter.FAST_REGRET,"true").buildAlgorithm();
|
||||||
vraBuilder.addCoreConstraints();
|
|
||||||
vraBuilder.addDefaultCostCalculators();
|
|
||||||
|
|
||||||
StateManager stateManager = new StateManager(skillProblem);
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
stateManager.updateSkillStates();
|
VehicleRoutingProblemSolution solution = Solutions.bestOf(solutions);
|
||||||
|
assertEquals(828.94, solution.getCost(), 0.01);
|
||||||
ConstraintManager constraintManager = new ConstraintManager(skillProblem, stateManager);
|
for (VehicleRoute route : solution.getRoutes()) {
|
||||||
constraintManager.addSkillsConstraint();
|
Skills vehicleSkill = route.getVehicle().getSkills();
|
||||||
|
for (Job job : route.getTourActivities().getJobs()) {
|
||||||
VehicleRoutingAlgorithm vra = vraBuilder.build();
|
for (String skill : job.getRequiredSkills().values()) {
|
||||||
vra.setMaxIterations(2000);
|
if (!vehicleSkill.containsSkill(skill)) {
|
||||||
|
assertFalse(true);
|
||||||
try {
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
VehicleRoutingProblemSolution solution = Solutions.bestOf(solutions);
|
|
||||||
assertEquals(828.94, solution.getCost(), 0.01);
|
|
||||||
for (VehicleRoute route : solution.getRoutes()) {
|
|
||||||
Skills vehicleSkill = route.getVehicle().getSkills();
|
|
||||||
for (Job job : route.getTourActivities().getJobs()) {
|
|
||||||
for (String skill : job.getRequiredSkills().values()) {
|
|
||||||
if (!vehicleSkill.containsSkill(skill)) {
|
|
||||||
assertFalse(true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assertTrue(true);
|
|
||||||
} catch (NoSolutionFoundException e) {
|
|
||||||
assertFalse(true);
|
|
||||||
}
|
}
|
||||||
|
assertTrue(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,8 @@ package com.graphhopper.jsprit.core.algorithm;
|
||||||
import com.graphhopper.jsprit.core.IntegrationTest;
|
import com.graphhopper.jsprit.core.IntegrationTest;
|
||||||
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLReader;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
|
import com.graphhopper.jsprit.core.util.SolomonReader;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
@ -21,14 +21,10 @@ public class Solomon_IT {
|
||||||
@Category(IntegrationTest.class)
|
@Category(IntegrationTest.class)
|
||||||
public void itShouldFindTheBestKnownSolution() {
|
public void itShouldFindTheBestKnownSolution() {
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
||||||
new VrpXMLReader(vrpBuilder).read("src/test/resources/solomon_c101.xml");
|
new SolomonReader(vrpBuilder).read(getClass().getResourceAsStream("C101.txt"));
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
VehicleRoutingProblem vrp = vrpBuilder.build();
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp)
|
VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp).setProperty(Jsprit.Parameter.FAST_REGRET,"true").buildAlgorithm();
|
||||||
// .setProperty(Jsprit.Parameter.THREADS,"3")
|
|
||||||
// .setProperty(Jsprit.Parameter.FAST_REGRET,"true")
|
|
||||||
.buildAlgorithm();
|
|
||||||
// VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/algorithmConfig.xml");
|
|
||||||
vra.setMaxIterations(2000);
|
vra.setMaxIterations(2000);
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
Assert.assertEquals(828.94, Solutions.bestOf(solutions).getCost(), 0.01);
|
Assert.assertEquals(828.94, Solutions.bestOf(solutions).getCost(), 0.01);
|
||||||
|
|
|
||||||
|
|
@ -1,95 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2014 Stefan Schroeder
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 3.0 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
******************************************************************************/
|
|
||||||
package com.graphhopper.jsprit.core.algorithm.recreate;
|
|
||||||
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
|
||||||
import com.graphhopper.jsprit.core.problem.Location;
|
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem.FleetSize;
|
|
||||||
import com.graphhopper.jsprit.core.problem.cost.VehicleRoutingTransportCosts;
|
|
||||||
import com.graphhopper.jsprit.core.problem.driver.Driver;
|
|
||||||
import com.graphhopper.jsprit.core.problem.job.Service;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute;
|
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.Vehicle;
|
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
|
||||||
import com.graphhopper.jsprit.core.util.Coordinate;
|
|
||||||
import com.graphhopper.jsprit.core.util.CrowFlyCosts;
|
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
|
||||||
import com.graphhopper.jsprit.core.util.TestUtils;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
|
|
||||||
|
|
||||||
public class CalcWithTimeSchedulingTest {
|
|
||||||
|
|
||||||
|
|
||||||
public void timeScheduler() {
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
VehicleImpl vehicle = VehicleImpl.Builder.newInstance("myVehicle").setEarliestStart(0.0).setLatestArrival(100.0).
|
|
||||||
setStartLocation(TestUtils.loc("0,0", Coordinate.newInstance(0, 0)))
|
|
||||||
.setType(VehicleTypeImpl.Builder.newInstance("myType").addCapacityDimension(0, 20).setCostPerDistance(1.0).build()).build();
|
|
||||||
vrpBuilder.addVehicle(vehicle);
|
|
||||||
vrpBuilder.addJob(Service.Builder.newInstance("myService").addSizeDimension(0, 2)
|
|
||||||
.setLocation(TestUtils.loc("0,20", Coordinate.newInstance(0, 20))).build());
|
|
||||||
vrpBuilder.setFleetSize(FleetSize.INFINITE);
|
|
||||||
vrpBuilder.setRoutingCost(getTpCosts(new CrowFlyCosts(vrpBuilder.getLocations())));
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/testConfig.xml");
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
|
|
||||||
VehicleRoutingProblemSolution sol = Solutions.bestOf(solutions);
|
|
||||||
assertEquals(40.0, sol.getCost(), 0.01);
|
|
||||||
assertEquals(1, sol.getRoutes().size());
|
|
||||||
VehicleRoute route = sol.getRoutes().iterator().next();
|
|
||||||
assertEquals(50.0, route.getStart().getEndTime(), 0.01);
|
|
||||||
}
|
|
||||||
|
|
||||||
private VehicleRoutingTransportCosts getTpCosts(final VehicleRoutingTransportCosts baseCosts) {
|
|
||||||
return new VehicleRoutingTransportCosts() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getBackwardTransportCost(Location from, Location to, double arrivalTime, Driver driver, Vehicle vehicle) {
|
|
||||||
return getTransportCost(from, to, arrivalTime, driver, vehicle);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getTransportCost(Location from, Location to, double departureTime, Driver driver, Vehicle vehicle) {
|
|
||||||
if (departureTime < 50) {
|
|
||||||
return baseCosts.getTransportCost(from, to, departureTime, driver, vehicle) * 2.0;
|
|
||||||
}
|
|
||||||
return baseCosts.getTransportCost(from, to, departureTime, driver, vehicle);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getBackwardTransportTime(Location from, Location to, double arrivalTime, Driver driver, Vehicle vehicle) {
|
|
||||||
return getTransportTime(from, to, arrivalTime, driver, vehicle);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getTransportTime(Location from, Location to, double departureTime, Driver driver, Vehicle vehicle) {
|
|
||||||
return getTransportCost(from, to, departureTime, driver, vehicle);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,249 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2013 Stefan Schroeder
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 3.0 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
******************************************************************************/
|
|
||||||
package com.graphhopper.jsprit.core.algorithm.recreate;
|
|
||||||
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
|
||||||
import com.graphhopper.jsprit.core.problem.Location;
|
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
|
||||||
import com.graphhopper.jsprit.core.problem.cost.VehicleRoutingActivityCosts;
|
|
||||||
import com.graphhopper.jsprit.core.problem.driver.Driver;
|
|
||||||
import com.graphhopper.jsprit.core.problem.job.Service;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.route.activity.TimeWindow;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.route.activity.TourActivity;
|
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.Vehicle;
|
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
|
||||||
import com.graphhopper.jsprit.core.util.Coordinate;
|
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
|
||||||
import com.graphhopper.jsprit.core.util.TestUtils;
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Ignore;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
@Ignore
|
|
||||||
public class TestDepartureTimeOpt {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenSettingOneCustWithTWAnd_NO_DepTimeChoice_totalCostsShouldBe50() {
|
|
||||||
TimeWindow timeWindow = TimeWindow.newInstance(40, 45);
|
|
||||||
Service service = Service.Builder.newInstance("s").setLocation(TestUtils.loc("servLoc", Coordinate.newInstance(0, 10))).setTimeWindow(timeWindow).build();
|
|
||||||
Vehicle vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(TestUtils.loc("vehLoc", Coordinate.newInstance(0, 0)))
|
|
||||||
.setType(VehicleTypeImpl.Builder.newInstance("vType").build()).build();
|
|
||||||
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
vrpBuilder.setActivityCosts(new VehicleRoutingActivityCosts() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getActivityCost(TourActivity tourAct, double arrivalTime, Driver driver, Vehicle vehicle) {
|
|
||||||
double waiting = Math.max(0, tourAct.getTheoreticalEarliestOperationStartTime() - arrivalTime) * 1;
|
|
||||||
double late = Math.max(0, arrivalTime - tourAct.getTheoreticalLatestOperationStartTime()) * 100;
|
|
||||||
return waiting + late;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getActivityDuration(TourActivity tourAct, double arrivalTime, Driver driver, Vehicle vehicle) {
|
|
||||||
return tourAct.getOperationTime();
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.addJob(service).addVehicle(vehicle).build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/algorithmConfig.xml");
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
|
|
||||||
Assert.assertEquals(20.0 + 30.0, Solutions.bestOf(solutions).getCost(), 0.1);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenSettingOneCustWithTWAnd_NO_DepTimeChoice_depTimeShouldBe0() {
|
|
||||||
TimeWindow timeWindow = TimeWindow.newInstance(40, 45);
|
|
||||||
Service service = Service.Builder.newInstance("s")
|
|
||||||
.setLocation(TestUtils.loc("servLoc", Coordinate.newInstance(0, 10))).setTimeWindow(timeWindow).build();
|
|
||||||
Vehicle vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.Builder.newInstance().setId("vehLoc").setCoordinate(Coordinate.newInstance(0, 0)).build())
|
|
||||||
.setType(VehicleTypeImpl.Builder.newInstance("vType").build()).build();
|
|
||||||
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
vrpBuilder.setActivityCosts(new VehicleRoutingActivityCosts() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getActivityCost(TourActivity tourAct, double arrivalTime, Driver driver, Vehicle vehicle) {
|
|
||||||
double waiting = Math.max(0, tourAct.getTheoreticalEarliestOperationStartTime() - arrivalTime) * 1;
|
|
||||||
double late = Math.max(0, arrivalTime - tourAct.getTheoreticalLatestOperationStartTime()) * 100;
|
|
||||||
return waiting + late;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getActivityDuration(TourActivity tourAct, double arrivalTime, Driver driver, Vehicle vehicle) {
|
|
||||||
return tourAct.getOperationTime();
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.addJob(service).addVehicle(vehicle).build();
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/algorithmConfig.xml");
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
|
|
||||||
Assert.assertEquals(0.0, Solutions.bestOf(solutions).getRoutes().iterator().next().getStart().getEndTime(), 0.1);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenSettingOneCustWithTWAndDepTimeChoice_totalCostsShouldBe50() {
|
|
||||||
TimeWindow timeWindow = TimeWindow.newInstance(40, 45);
|
|
||||||
Service service = Service.Builder.newInstance("s").setLocation(TestUtils.loc("servLoc", Coordinate.newInstance(0, 10))).setTimeWindow(timeWindow).build();
|
|
||||||
Vehicle vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(TestUtils.loc("vehLoc", Coordinate.newInstance(0, 0)))
|
|
||||||
.setType(VehicleTypeImpl.Builder.newInstance("vType").build()).build();
|
|
||||||
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
vrpBuilder.setActivityCosts(new VehicleRoutingActivityCosts() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getActivityCost(TourActivity tourAct, double arrivalTime, Driver driver, Vehicle vehicle) {
|
|
||||||
double waiting = Math.max(0, tourAct.getTheoreticalEarliestOperationStartTime() - arrivalTime) * 1;
|
|
||||||
double late = Math.max(0, arrivalTime - tourAct.getTheoreticalLatestOperationStartTime()) * 100;
|
|
||||||
return waiting + late;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getActivityDuration(TourActivity tourAct, double arrivalTime, Driver driver, Vehicle vehicle) {
|
|
||||||
return tourAct.getOperationTime();
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.addJob(service).addVehicle(vehicle).build();
|
|
||||||
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/algorithmConfigWithDepartureTimeChoice.xml");
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
|
|
||||||
Assert.assertEquals(20.0, Solutions.bestOf(solutions).getCost(), 0.1);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenSettingOneCustWithTWAndDepTimeChoice_depTimeShouldBe0() {
|
|
||||||
TimeWindow timeWindow = TimeWindow.newInstance(40, 45);
|
|
||||||
Service service = Service.Builder.newInstance("s").setLocation(TestUtils.loc("servLoc", Coordinate.newInstance(0, 10))).setTimeWindow(timeWindow).build();
|
|
||||||
Vehicle vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(TestUtils.loc("vehLoc", Coordinate.newInstance(0, 0)))
|
|
||||||
.setType(VehicleTypeImpl.Builder.newInstance("vType").build()).build();
|
|
||||||
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
vrpBuilder.setActivityCosts(new VehicleRoutingActivityCosts() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getActivityCost(TourActivity tourAct, double arrivalTime, Driver driver, Vehicle vehicle) {
|
|
||||||
double waiting = Math.max(0, tourAct.getTheoreticalEarliestOperationStartTime() - arrivalTime) * 1;
|
|
||||||
double late = Math.max(0, arrivalTime - tourAct.getTheoreticalLatestOperationStartTime()) * 100;
|
|
||||||
return waiting + late;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getActivityDuration(TourActivity tourAct, double arrivalTime, Driver driver, Vehicle vehicle) {
|
|
||||||
return tourAct.getOperationTime();
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.addJob(service).addVehicle(vehicle).build();
|
|
||||||
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/algorithmConfigWithDepartureTimeChoice.xml");
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
|
|
||||||
Assert.assertEquals(30.0, Solutions.bestOf(solutions).getRoutes().iterator().next().getStart().getEndTime(), 0.1);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenSettingTwoCustWithTWAndDepTimeChoice_totalCostsShouldBe50() {
|
|
||||||
TimeWindow timeWindow = TimeWindow.newInstance(40, 45);
|
|
||||||
Service service = Service.Builder.newInstance("s").setLocation(TestUtils.loc("servLoc", Coordinate.newInstance(0, 10))).setTimeWindow(timeWindow).build();
|
|
||||||
|
|
||||||
Service service2 = Service.Builder.newInstance("s2").setLocation(TestUtils.loc("servLoc2", Coordinate.newInstance(0, 20))).
|
|
||||||
setTimeWindow(TimeWindow.newInstance(30, 40)).build();
|
|
||||||
|
|
||||||
Vehicle vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(TestUtils.loc("vehLoc", Coordinate.newInstance(0, 0)))
|
|
||||||
.setType(VehicleTypeImpl.Builder.newInstance("vType").build()).build();
|
|
||||||
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
vrpBuilder.setActivityCosts(new VehicleRoutingActivityCosts() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getActivityCost(TourActivity tourAct, double arrivalTime, Driver driver, Vehicle vehicle) {
|
|
||||||
double waiting = Math.max(0, tourAct.getTheoreticalEarliestOperationStartTime() - arrivalTime) * 1;
|
|
||||||
double late = Math.max(0, arrivalTime - tourAct.getTheoreticalLatestOperationStartTime()) * 100;
|
|
||||||
return waiting + late;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getActivityDuration(TourActivity tourAct, double arrivalTime, Driver driver, Vehicle vehicle) {
|
|
||||||
return tourAct.getOperationTime();
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.addJob(service).addJob(service2).addVehicle(vehicle).build();
|
|
||||||
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/algorithmConfigWithDepartureTimeChoice.xml");
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
|
|
||||||
Assert.assertEquals(40.0, Solutions.bestOf(solutions).getCost(), 0.1);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void whenSettingTwoCustWithTWAndDepTimeChoice_depTimeShouldBe10() {
|
|
||||||
TimeWindow timeWindow = TimeWindow.newInstance(40, 45);
|
|
||||||
Service service = Service.Builder.newInstance("s").setLocation(TestUtils.loc("servLoc", Coordinate.newInstance(0, 10))).setTimeWindow(timeWindow).build();
|
|
||||||
|
|
||||||
Service service2 = Service.Builder.newInstance("s2").setLocation(TestUtils.loc("servLoc2", Coordinate.newInstance(0, 20))).
|
|
||||||
setTimeWindow(TimeWindow.newInstance(30, 40)).build();
|
|
||||||
|
|
||||||
Vehicle vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(TestUtils.loc("vehLoc", Coordinate.newInstance(0, 0)))
|
|
||||||
.setType(VehicleTypeImpl.Builder.newInstance("vType").build()).build();
|
|
||||||
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
vrpBuilder.setActivityCosts(new VehicleRoutingActivityCosts() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getActivityCost(TourActivity tourAct, double arrivalTime, Driver driver, Vehicle vehicle) {
|
|
||||||
double waiting = Math.max(0, tourAct.getTheoreticalEarliestOperationStartTime() - arrivalTime) * 1;
|
|
||||||
double late = Math.max(0, arrivalTime - tourAct.getTheoreticalLatestOperationStartTime()) * 100;
|
|
||||||
return waiting + late;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getActivityDuration(TourActivity tourAct, double arrivalTime, Driver driver, Vehicle vehicle) {
|
|
||||||
return tourAct.getOperationTime();
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.addJob(service).addJob(service2).addVehicle(vehicle).build();
|
|
||||||
|
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/algorithmConfigWithDepartureTimeChoice.xml");
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
|
|
||||||
Assert.assertEquals(10.0, Solutions.bestOf(solutions).getRoutes().iterator().next().getStart().getEndTime(), 0.1);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,149 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (C) 2013 Stefan Schroeder
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 3.0 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
******************************************************************************/
|
||||||
|
package com.graphhopper.jsprit.core.util;
|
||||||
|
|
||||||
|
|
||||||
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem.FleetSize;
|
||||||
|
import com.graphhopper.jsprit.core.problem.job.Delivery;
|
||||||
|
import com.graphhopper.jsprit.core.problem.job.Pickup;
|
||||||
|
import com.graphhopper.jsprit.core.problem.job.Service;
|
||||||
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
||||||
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reader that reads Christophides, Mingozzi and Toth instances.
|
||||||
|
* <p>
|
||||||
|
* <p>Files and file-description can be found <a href="http://neo.lcc.uma.es/vrp/vrp-instances/capacitated-vrp-instances/">here</a>.
|
||||||
|
*
|
||||||
|
* @author stefan schroeder
|
||||||
|
*/
|
||||||
|
public class ChristofidesReader {
|
||||||
|
|
||||||
|
private static Logger logger = LoggerFactory.getLogger(ChristofidesReader.class);
|
||||||
|
|
||||||
|
private final VehicleRoutingProblem.Builder vrpBuilder;
|
||||||
|
|
||||||
|
private double coordProjectionFactor = 1;
|
||||||
|
|
||||||
|
private JobType jobType = JobType.SERVICE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs the reader.
|
||||||
|
*
|
||||||
|
* @param vrpBuilder the builder
|
||||||
|
*/
|
||||||
|
public ChristofidesReader(VehicleRoutingProblem.Builder vrpBuilder) {
|
||||||
|
super();
|
||||||
|
this.vrpBuilder = vrpBuilder;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads instance-file and memorizes vehicles, customers and so forth in
|
||||||
|
* {@link com.graphhopper.jsprit.core.problem.VehicleRoutingProblem.Builder}.
|
||||||
|
*
|
||||||
|
* @param inputStream
|
||||||
|
*/
|
||||||
|
public void read(InputStream inputStream) {
|
||||||
|
vrpBuilder.setFleetSize(FleetSize.INFINITE);
|
||||||
|
BufferedReader reader = getReader(inputStream);
|
||||||
|
int vehicleCapacity = 0;
|
||||||
|
double serviceTime = 0.0;
|
||||||
|
double endTime = Double.MAX_VALUE;
|
||||||
|
int counter = 0;
|
||||||
|
String line;
|
||||||
|
while ((line = readLine(reader)) != null) {
|
||||||
|
line = line.replace("\r", "");
|
||||||
|
line = line.trim();
|
||||||
|
String[] tokens = line.split(" ");
|
||||||
|
if (counter == 0) {
|
||||||
|
vehicleCapacity = Integer.parseInt(tokens[1].trim());
|
||||||
|
endTime = Double.parseDouble(tokens[2].trim());
|
||||||
|
serviceTime = Double.parseDouble(tokens[3].trim());
|
||||||
|
} else if (counter == 1) {
|
||||||
|
Coordinate depotCoord = makeCoord(tokens[0].trim(), tokens[1].trim());
|
||||||
|
VehicleTypeImpl vehicleType = VehicleTypeImpl.Builder.newInstance("christophidesType").addCapacityDimension(0, vehicleCapacity).
|
||||||
|
setCostPerDistance(1.0).build();
|
||||||
|
VehicleImpl vehicle = VehicleImpl.Builder.newInstance("christophidesVehicle").setLatestArrival(endTime).setStartLocation(Location.newInstance(depotCoord.getX(), depotCoord.getY())).
|
||||||
|
setType(vehicleType).build();
|
||||||
|
vrpBuilder.addVehicle(vehicle);
|
||||||
|
} else {
|
||||||
|
Coordinate customerCoord = makeCoord(tokens[0].trim(), tokens[1].trim());
|
||||||
|
int demand = Integer.parseInt(tokens[2].trim());
|
||||||
|
String customer = Integer.valueOf(counter - 1).toString();
|
||||||
|
if(jobType.equals(JobType.SERVICE)) {
|
||||||
|
Service service = Service.Builder.newInstance(customer).addSizeDimension(0, demand).setServiceTime(serviceTime).setLocation(Location.newInstance(customerCoord.getX(), customerCoord.getY())).build();
|
||||||
|
vrpBuilder.addJob(service);
|
||||||
|
}
|
||||||
|
else if(jobType.equals(JobType.DELIVERY)){
|
||||||
|
Delivery service = Delivery.Builder.newInstance(customer).addSizeDimension(0, demand).setServiceTime(serviceTime).setLocation(Location.newInstance(customerCoord.getX(), customerCoord.getY())).build();
|
||||||
|
vrpBuilder.addJob(service);
|
||||||
|
}
|
||||||
|
else if(jobType.equals(JobType.PICKUP)){
|
||||||
|
Pickup service = Pickup.Builder.newInstance(customer).addSizeDimension(0, demand).setServiceTime(serviceTime).setLocation(Location.newInstance(customerCoord.getX(), customerCoord.getY())).build();
|
||||||
|
vrpBuilder.addJob(service);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
|
close(reader);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCoordProjectionFactor(double coordProjectionFactor) {
|
||||||
|
this.coordProjectionFactor = coordProjectionFactor;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void close(BufferedReader reader) {
|
||||||
|
try {
|
||||||
|
reader.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String readLine(BufferedReader reader) {
|
||||||
|
try {
|
||||||
|
return reader.readLine();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Coordinate makeCoord(String xString, String yString) {
|
||||||
|
double x = Double.parseDouble(xString);
|
||||||
|
double y = Double.parseDouble(yString);
|
||||||
|
return new Coordinate(x * coordProjectionFactor, y * coordProjectionFactor);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BufferedReader getReader(InputStream inputStream) {
|
||||||
|
return new BufferedReader(new InputStreamReader(inputStream));
|
||||||
|
}
|
||||||
|
|
||||||
|
public ChristofidesReader setJobType(JobType jobType) {
|
||||||
|
this.jobType = jobType;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
package com.graphhopper.jsprit.core.util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by schroeder on 27/07/16.
|
||||||
|
*/
|
||||||
|
public enum JobType {
|
||||||
|
|
||||||
|
SERVICE, PICKUP, DELIVERY
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,197 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (C) 2013 Stefan Schroeder
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 3.0 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
******************************************************************************/
|
||||||
|
package com.graphhopper.jsprit.core.util;
|
||||||
|
|
||||||
|
|
||||||
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem.Builder;
|
||||||
|
import com.graphhopper.jsprit.core.problem.job.Shipment;
|
||||||
|
import com.graphhopper.jsprit.core.problem.solution.route.activity.TimeWindow;
|
||||||
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
||||||
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test instances for the capacitated vrp with pickup and deliveries and time windows.
|
||||||
|
* instances are from li and lim and can be found at:
|
||||||
|
* http://www.top.sintef.no/vrp/benchmarks.html
|
||||||
|
*
|
||||||
|
* @author stefan schroeder
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
public class LiLimReader {
|
||||||
|
|
||||||
|
static class CustomerData {
|
||||||
|
public Coordinate coord;
|
||||||
|
public double start;
|
||||||
|
public double end;
|
||||||
|
public double serviceTime;
|
||||||
|
|
||||||
|
public CustomerData(Coordinate coord, double start, double end, double serviceTime) {
|
||||||
|
super();
|
||||||
|
this.coord = coord;
|
||||||
|
this.start = start;
|
||||||
|
this.end = end;
|
||||||
|
this.serviceTime = serviceTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class Relation {
|
||||||
|
public String from;
|
||||||
|
public String to;
|
||||||
|
public int demand;
|
||||||
|
|
||||||
|
public Relation(String from, String to, int demand) {
|
||||||
|
super();
|
||||||
|
this.from = from;
|
||||||
|
this.to = to;
|
||||||
|
this.demand = demand;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Logger logger = LoggerFactory.getLogger(LiLimReader.class);
|
||||||
|
|
||||||
|
private Builder vrpBuilder;
|
||||||
|
|
||||||
|
private int vehicleCapacity;
|
||||||
|
|
||||||
|
private String depotId;
|
||||||
|
|
||||||
|
private Map<String, CustomerData> customers;
|
||||||
|
|
||||||
|
private Collection<Relation> relations;
|
||||||
|
|
||||||
|
private double depotOpeningTime;
|
||||||
|
|
||||||
|
private double depotClosingTime;
|
||||||
|
|
||||||
|
private int fixCosts = 0;
|
||||||
|
|
||||||
|
public LiLimReader(Builder vrpBuilder) {
|
||||||
|
customers = new HashMap<String, CustomerData>();
|
||||||
|
relations = new ArrayList<Relation>();
|
||||||
|
this.vrpBuilder = vrpBuilder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LiLimReader(Builder builder, int fixCosts) {
|
||||||
|
customers = new HashMap<String, CustomerData>();
|
||||||
|
relations = new ArrayList<Relation>();
|
||||||
|
this.vrpBuilder = builder;
|
||||||
|
this.fixCosts = fixCosts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void read(InputStream inputStream) {
|
||||||
|
readShipments(inputStream);
|
||||||
|
buildShipments();
|
||||||
|
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("type").addCapacityDimension(0, vehicleCapacity)
|
||||||
|
.setCostPerDistance(1.0).setFixedCost(fixCosts).build();
|
||||||
|
VehicleImpl vehicle = VehicleImpl.Builder.newInstance("vehicle")
|
||||||
|
.setEarliestStart(depotOpeningTime).setLatestArrival(depotClosingTime)
|
||||||
|
.setStartLocation(Location.Builder.newInstance().setCoordinate(customers.get(depotId).coord).build()).setType(type).build();
|
||||||
|
vrpBuilder.addVehicle(vehicle);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void buildShipments() {
|
||||||
|
Integer counter = 0;
|
||||||
|
for (Relation rel : relations) {
|
||||||
|
counter++;
|
||||||
|
String from = rel.from;
|
||||||
|
String to = rel.to;
|
||||||
|
int demand = rel.demand;
|
||||||
|
Shipment s = Shipment.Builder.newInstance(counter.toString()).addSizeDimension(0, demand)
|
||||||
|
.setPickupLocation(Location.Builder.newInstance().setCoordinate(customers.get(from).coord).build()).setPickupServiceTime(customers.get(from).serviceTime)
|
||||||
|
.setPickupTimeWindow(TimeWindow.newInstance(customers.get(from).start, customers.get(from).end))
|
||||||
|
.setDeliveryLocation(Location.Builder.newInstance().setCoordinate(customers.get(to).coord).build()).setDeliveryServiceTime(customers.get(to).serviceTime)
|
||||||
|
.setDeliveryTimeWindow(TimeWindow.newInstance(customers.get(to).start, customers.get(to).end)).build();
|
||||||
|
vrpBuilder.addJob(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private BufferedReader getReader(InputStream inputStream) {
|
||||||
|
return new BufferedReader(new InputStreamReader(inputStream));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void readShipments(InputStream inputStream) {
|
||||||
|
BufferedReader reader = getReader(inputStream);
|
||||||
|
String line = null;
|
||||||
|
boolean firstLine = true;
|
||||||
|
try {
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
line = line.replace("\r", "");
|
||||||
|
line = line.trim();
|
||||||
|
String[] tokens = line.split("\t");
|
||||||
|
if (firstLine) {
|
||||||
|
int vehicleCapacity = getInt(tokens[1]);
|
||||||
|
this.vehicleCapacity = vehicleCapacity;
|
||||||
|
firstLine = false;
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
String customerId = tokens[0];
|
||||||
|
Coordinate coord = makeCoord(tokens[1], tokens[2]);
|
||||||
|
int demand = getInt(tokens[3]);
|
||||||
|
double startTimeWindow = getDouble(tokens[4]);
|
||||||
|
double endTimeWindow = getDouble(tokens[5]);
|
||||||
|
double serviceTime = getDouble(tokens[6]);
|
||||||
|
// vrpBuilder.addLocation(customerId, coord);
|
||||||
|
customers.put(customerId, new CustomerData(coord, startTimeWindow, endTimeWindow, serviceTime));
|
||||||
|
if (customerId.equals("0")) {
|
||||||
|
depotId = customerId;
|
||||||
|
depotOpeningTime = startTimeWindow;
|
||||||
|
depotClosingTime = endTimeWindow;
|
||||||
|
}
|
||||||
|
if (demand > 0) {
|
||||||
|
relations.add(new Relation(customerId, tokens[8], demand));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reader.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private Coordinate makeCoord(String xString, String yString) {
|
||||||
|
double x = Double.parseDouble(xString);
|
||||||
|
double y = Double.parseDouble(yString);
|
||||||
|
return new Coordinate(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
private double getDouble(String string) {
|
||||||
|
return Double.parseDouble(string);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getInt(String string) {
|
||||||
|
return Integer.parseInt(string);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,155 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (C) 2014 Stefan Schroeder
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 3.0 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
******************************************************************************/
|
||||||
|
package com.graphhopper.jsprit.core.util;
|
||||||
|
|
||||||
|
|
||||||
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem.FleetSize;
|
||||||
|
import com.graphhopper.jsprit.core.problem.job.Service;
|
||||||
|
import com.graphhopper.jsprit.core.problem.solution.route.activity.TimeWindow;
|
||||||
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
||||||
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reader that reads the well-known solomon-instances.
|
||||||
|
* <p>
|
||||||
|
* <p>See: <a href="http://neo.lcc.uma.es/vrp/vrp-instances/capacitated-vrp-with-time-windows-instances/">neo.org</a>
|
||||||
|
*
|
||||||
|
* @author stefan
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class SolomonReader {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param costProjectionFactor the costProjectionFactor to set
|
||||||
|
*/
|
||||||
|
public void setVariableCostProjectionFactor(double costProjectionFactor) {
|
||||||
|
this.variableCostProjectionFactor = costProjectionFactor;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Logger logger = LoggerFactory.getLogger(SolomonReader.class);
|
||||||
|
|
||||||
|
private final VehicleRoutingProblem.Builder vrpBuilder;
|
||||||
|
|
||||||
|
private double coordProjectionFactor = 1;
|
||||||
|
|
||||||
|
private double timeProjectionFactor = 1;
|
||||||
|
|
||||||
|
private double variableCostProjectionFactor = 1;
|
||||||
|
|
||||||
|
private double fixedCostPerVehicle = 0.0;
|
||||||
|
|
||||||
|
public SolomonReader(VehicleRoutingProblem.Builder vrpBuilder) {
|
||||||
|
super();
|
||||||
|
this.vrpBuilder = vrpBuilder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SolomonReader(VehicleRoutingProblem.Builder vrpBuilder, double fixedCostPerVehicle) {
|
||||||
|
super();
|
||||||
|
this.vrpBuilder = vrpBuilder;
|
||||||
|
this.fixedCostPerVehicle = fixedCostPerVehicle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void read(InputStream inputStream) {
|
||||||
|
vrpBuilder.setFleetSize(FleetSize.INFINITE);
|
||||||
|
BufferedReader reader = getReader(inputStream);
|
||||||
|
int vehicleCapacity = 0;
|
||||||
|
|
||||||
|
int counter = 0;
|
||||||
|
String line;
|
||||||
|
while ((line = readLine(reader)) != null) {
|
||||||
|
line = line.replace("\r", "");
|
||||||
|
line = line.trim();
|
||||||
|
String[] tokens = line.split(" +");
|
||||||
|
counter++;
|
||||||
|
if (counter == 5) {
|
||||||
|
vehicleCapacity = Integer.parseInt(tokens[1]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (counter > 9) {
|
||||||
|
if (tokens.length < 7) continue;
|
||||||
|
Coordinate coord = makeCoord(tokens[1], tokens[2]);
|
||||||
|
String customerId = tokens[0];
|
||||||
|
int demand = Integer.parseInt(tokens[3]);
|
||||||
|
double start = Double.parseDouble(tokens[4]) * timeProjectionFactor;
|
||||||
|
double end = Double.parseDouble(tokens[5]) * timeProjectionFactor;
|
||||||
|
double serviceTime = Double.parseDouble(tokens[6]) * timeProjectionFactor;
|
||||||
|
if (counter == 10) {
|
||||||
|
VehicleTypeImpl.Builder typeBuilder = VehicleTypeImpl.Builder.newInstance("solomonType").addCapacityDimension(0, vehicleCapacity);
|
||||||
|
typeBuilder.setCostPerDistance(1.0 * variableCostProjectionFactor).setFixedCost(fixedCostPerVehicle);
|
||||||
|
VehicleTypeImpl vehicleType = typeBuilder.build();
|
||||||
|
|
||||||
|
VehicleImpl vehicle = VehicleImpl.Builder.newInstance("solomonVehicle").setEarliestStart(start).setLatestArrival(end)
|
||||||
|
.setStartLocation(Location.Builder.newInstance().setId(customerId)
|
||||||
|
.setCoordinate(coord).build()).setType(vehicleType).build();
|
||||||
|
vrpBuilder.addVehicle(vehicle);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
Service service = Service.Builder.newInstance(customerId).addSizeDimension(0, demand)
|
||||||
|
.setLocation(Location.Builder.newInstance().setCoordinate(coord).setId(customerId).build()).setServiceTime(serviceTime)
|
||||||
|
.setTimeWindow(TimeWindow.newInstance(start, end)).build();
|
||||||
|
vrpBuilder.addJob(service);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(reader);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCoordProjectionFactor(double coordProjectionFactor) {
|
||||||
|
this.coordProjectionFactor = coordProjectionFactor;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void close(BufferedReader reader) {
|
||||||
|
try {
|
||||||
|
reader.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String readLine(BufferedReader reader) {
|
||||||
|
try {
|
||||||
|
return reader.readLine();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Coordinate makeCoord(String xString, String yString) {
|
||||||
|
double x = Double.parseDouble(xString);
|
||||||
|
double y = Double.parseDouble(yString);
|
||||||
|
return new Coordinate(x * coordProjectionFactor, y * coordProjectionFactor);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BufferedReader getReader(InputStream inputStream) {
|
||||||
|
return new BufferedReader(new InputStreamReader(inputStream));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTimeProjectionFactor(double timeProjection) {
|
||||||
|
this.timeProjectionFactor = timeProjection;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,66 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<algorithm xmlns="http://www.w3schools.com"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.w3schools.com algorithm_schema.xsd">
|
|
||||||
|
|
||||||
<iterations>2000</iterations>
|
|
||||||
|
|
||||||
<construction>
|
|
||||||
<insertion name="bestInsertion"/>
|
|
||||||
</construction>
|
|
||||||
|
|
||||||
<strategy>
|
|
||||||
<memory>1</memory>
|
|
||||||
<searchStrategies>
|
|
||||||
<searchStrategy name="randomRuinAndRecreate">
|
|
||||||
<selector name="selectBest"/>
|
|
||||||
<acceptor name="acceptNewRemoveWorst"/>
|
|
||||||
<modules>
|
|
||||||
<module name="ruin_and_recreate">
|
|
||||||
<ruin name="randomRuin">
|
|
||||||
<share>0.5</share>
|
|
||||||
</ruin>
|
|
||||||
<insertion name="bestInsertion"/>
|
|
||||||
</module>
|
|
||||||
|
|
||||||
</modules>
|
|
||||||
<probability>0.4</probability>
|
|
||||||
</searchStrategy>
|
|
||||||
|
|
||||||
<searchStrategy name="radialRuinAndRecreate">
|
|
||||||
<selector name="selectBest"/>
|
|
||||||
<acceptor name="acceptNewRemoveWorst"/>
|
|
||||||
<modules>
|
|
||||||
<module name="ruin_and_recreate">
|
|
||||||
<ruin name="radialRuin">
|
|
||||||
<share>0.3</share>
|
|
||||||
</ruin>
|
|
||||||
<insertion name="bestInsertion"/>
|
|
||||||
</module>
|
|
||||||
|
|
||||||
</modules>
|
|
||||||
<probability>0.4</probability>
|
|
||||||
</searchStrategy>
|
|
||||||
|
|
||||||
<searchStrategy name="radialRuinAndRecreate">
|
|
||||||
<selector name="selectBest"/>
|
|
||||||
<acceptor name="acceptNewRemoveWorst"/>
|
|
||||||
<modules>
|
|
||||||
<module name="ruin_and_recreate">
|
|
||||||
<ruin id="1" name="radialRuin">
|
|
||||||
<share>0.1</share>
|
|
||||||
</ruin>
|
|
||||||
<insertion id="1" name="bestInsertion">
|
|
||||||
<experimental timeSlice="10" neighboringSlices="3"/>
|
|
||||||
</insertion>
|
|
||||||
</module>
|
|
||||||
|
|
||||||
</modules>
|
|
||||||
<probability>0.2</probability>
|
|
||||||
</searchStrategy>
|
|
||||||
</searchStrategies>
|
|
||||||
</strategy>
|
|
||||||
|
|
||||||
|
|
||||||
</algorithm>
|
|
||||||
|
|
@ -1,67 +0,0 @@
|
||||||
<?xml version="1.0" ?>
|
|
||||||
|
|
||||||
<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
~ Copyright (C) 2014 Stefan Schroeder
|
|
||||||
~
|
|
||||||
~ This library is free software; you can redistribute it and/or
|
|
||||||
~ modify it under the terms of the GNU Lesser General Public
|
|
||||||
~ License as published by the Free Software Foundation; either
|
|
||||||
~ version 3.0 of the License, or (at your option) any later version.
|
|
||||||
~
|
|
||||||
~ This library is distributed in the hope that it will be useful,
|
|
||||||
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
~ Lesser General Public License for more details.
|
|
||||||
~
|
|
||||||
~ You should have received a copy of the GNU Lesser General Public
|
|
||||||
~ License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
|
|
||||||
|
|
||||||
<algorithm xmlns="http://www.w3schools.com"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.w3schools.com algorithm_schema.xsd">
|
|
||||||
|
|
||||||
<iterations>2000</iterations>
|
|
||||||
|
|
||||||
<construction>
|
|
||||||
<insertion name="regretInsertion">
|
|
||||||
|
|
||||||
</insertion>
|
|
||||||
</construction>
|
|
||||||
|
|
||||||
<strategy>
|
|
||||||
<memory>1</memory>
|
|
||||||
<searchStrategies>
|
|
||||||
|
|
||||||
<searchStrategy name="randomRuinAndRecreate">
|
|
||||||
<selector name="selectBest"/>
|
|
||||||
<acceptor name="greedyAcceptance"/>
|
|
||||||
<modules>
|
|
||||||
<module name="ruin_and_recreate">
|
|
||||||
<ruin name="randomRuin">
|
|
||||||
<share>0.5</share>
|
|
||||||
</ruin>
|
|
||||||
<insertion name="bestInsertion"/>
|
|
||||||
</module>
|
|
||||||
</modules>
|
|
||||||
<probability>0.5</probability>
|
|
||||||
</searchStrategy>
|
|
||||||
|
|
||||||
<searchStrategy name="radialRuinAndRecreate">
|
|
||||||
<selector name="selectBest"/>
|
|
||||||
<acceptor name="greedyAcceptance"/>
|
|
||||||
<modules>
|
|
||||||
<module name="ruin_and_recreate">
|
|
||||||
<ruin name="radialRuin">
|
|
||||||
<share>0.3</share>
|
|
||||||
</ruin>
|
|
||||||
<insertion name="bestInsertion"/>
|
|
||||||
</module>
|
|
||||||
</modules>
|
|
||||||
<probability>0.5</probability>
|
|
||||||
</searchStrategy>
|
|
||||||
</searchStrategies>
|
|
||||||
</strategy>
|
|
||||||
|
|
||||||
|
|
||||||
</algorithm>
|
|
||||||
|
|
@ -1,67 +0,0 @@
|
||||||
<?xml version="1.0" ?>
|
|
||||||
|
|
||||||
<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
~ Copyright (C) 2014 Stefan Schroeder
|
|
||||||
~
|
|
||||||
~ This library is free software; you can redistribute it and/or
|
|
||||||
~ modify it under the terms of the GNU Lesser General Public
|
|
||||||
~ License as published by the Free Software Foundation; either
|
|
||||||
~ version 3.0 of the License, or (at your option) any later version.
|
|
||||||
~
|
|
||||||
~ This library is distributed in the hope that it will be useful,
|
|
||||||
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
~ Lesser General Public License for more details.
|
|
||||||
~
|
|
||||||
~ You should have received a copy of the GNU Lesser General Public
|
|
||||||
~ License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
|
|
||||||
|
|
||||||
<algorithm xmlns="http://www.w3schools.com"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.w3schools.com algorithm_schema.xsd">
|
|
||||||
|
|
||||||
<iterations>2000</iterations>
|
|
||||||
|
|
||||||
<construction>
|
|
||||||
<insertion name="regretInsertion">
|
|
||||||
|
|
||||||
</insertion>
|
|
||||||
</construction>
|
|
||||||
|
|
||||||
<strategy>
|
|
||||||
<memory>1</memory>
|
|
||||||
<searchStrategies>
|
|
||||||
|
|
||||||
<searchStrategy name="randomRuinAndRecreate">
|
|
||||||
<selector name="selectBest"/>
|
|
||||||
<acceptor name="greedyAcceptance"/>
|
|
||||||
<modules>
|
|
||||||
<module name="ruin_and_recreate">
|
|
||||||
<ruin name="randomRuin">
|
|
||||||
<share>0.5</share>
|
|
||||||
</ruin>
|
|
||||||
<insertion name="bestInsertion"/>
|
|
||||||
</module>
|
|
||||||
</modules>
|
|
||||||
<probability>0.5</probability>
|
|
||||||
</searchStrategy>
|
|
||||||
|
|
||||||
<searchStrategy name="radialRuinAndRecreate">
|
|
||||||
<selector name="selectBest"/>
|
|
||||||
<acceptor name="greedyAcceptance"/>
|
|
||||||
<modules>
|
|
||||||
<module name="ruin_and_recreate">
|
|
||||||
<ruin name="radialRuin">
|
|
||||||
<share>0.3</share>
|
|
||||||
</ruin>
|
|
||||||
<insertion name="regretInsertion"/>
|
|
||||||
</module>
|
|
||||||
</modules>
|
|
||||||
<probability>0.5</probability>
|
|
||||||
</searchStrategy>
|
|
||||||
</searchStrategies>
|
|
||||||
</strategy>
|
|
||||||
|
|
||||||
|
|
||||||
</algorithm>
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<algorithm xmlns="http://www.w3schools.com"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.w3schools.com algorithm_schema.xsd">
|
|
||||||
|
|
||||||
<iterations>2000</iterations>
|
|
||||||
|
|
||||||
<construction>
|
|
||||||
<insertion name="bestInsertion"/>
|
|
||||||
</construction>
|
|
||||||
|
|
||||||
<strategy>
|
|
||||||
|
|
||||||
<memory>1</memory>
|
|
||||||
|
|
||||||
<searchStrategies>
|
|
||||||
<searchStrategy name="selectRandomlyRandomRuinAndRecreate">
|
|
||||||
<selector name="selectRandomly"/>
|
|
||||||
<acceptor name="acceptNewRemoveWorst"/>
|
|
||||||
<modules>
|
|
||||||
<module name="ruin_and_recreate">
|
|
||||||
<ruin name="randomRuin">
|
|
||||||
<share>0.5</share>
|
|
||||||
</ruin>
|
|
||||||
<insertion name="bestInsertion"/>
|
|
||||||
</module>
|
|
||||||
</modules>
|
|
||||||
<probability>1</probability>
|
|
||||||
</searchStrategy>
|
|
||||||
</searchStrategies>
|
|
||||||
|
|
||||||
</strategy>
|
|
||||||
|
|
||||||
</algorithm>
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<algorithm xmlns="http://www.w3schools.com"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.w3schools.com algorithm_schema.xsd">
|
|
||||||
|
|
||||||
<iterations>2000</iterations>
|
|
||||||
|
|
||||||
<strategy>
|
|
||||||
<memory>1</memory>
|
|
||||||
<searchStrategies>
|
|
||||||
<searchStrategy name="randomRuinAndRecreate">
|
|
||||||
<selector name="selectBest"/>
|
|
||||||
<acceptor name="acceptNewRemoveWorst"/>
|
|
||||||
<modules>
|
|
||||||
<module name="ruin_and_recreate">
|
|
||||||
<ruin name="randomRuin">
|
|
||||||
<share>0.5</share>
|
|
||||||
</ruin>
|
|
||||||
<insertion name="bestInsertion"/>
|
|
||||||
</module>
|
|
||||||
|
|
||||||
</modules>
|
|
||||||
<probability>0.5</probability>
|
|
||||||
</searchStrategy>
|
|
||||||
|
|
||||||
<searchStrategy name="radialRuinAndRecreate">
|
|
||||||
<selector name="selectBest"/>
|
|
||||||
<acceptor name="acceptNewRemoveWorst"/>
|
|
||||||
<modules>
|
|
||||||
<module name="ruin_and_recreate">
|
|
||||||
<ruin name="radialRuin">
|
|
||||||
<share>0.3</share>
|
|
||||||
</ruin>
|
|
||||||
<insertion name="bestInsertion"/>
|
|
||||||
</module>
|
|
||||||
|
|
||||||
</modules>
|
|
||||||
<probability>0.5</probability>
|
|
||||||
</searchStrategy>
|
|
||||||
</searchStrategies>
|
|
||||||
</strategy>
|
|
||||||
|
|
||||||
|
|
||||||
</algorithm>
|
|
||||||
|
|
@ -0,0 +1,110 @@
|
||||||
|
C101
|
||||||
|
|
||||||
|
VEHICLE
|
||||||
|
NUMBER CAPACITY
|
||||||
|
25 200
|
||||||
|
|
||||||
|
CUSTOMER
|
||||||
|
CUST NO. XCOORD. YCOORD. DEMAND READY TIME DUE DATE SERVICE TIME
|
||||||
|
|
||||||
|
0 40 50 0 0 1236 0
|
||||||
|
1 45 68 10 912 967 90
|
||||||
|
2 45 70 30 825 870 90
|
||||||
|
3 42 66 10 65 146 90
|
||||||
|
4 42 68 10 727 782 90
|
||||||
|
5 42 65 10 15 67 90
|
||||||
|
6 40 69 20 621 702 90
|
||||||
|
7 40 66 20 170 225 90
|
||||||
|
8 38 68 20 255 324 90
|
||||||
|
9 38 70 10 534 605 90
|
||||||
|
10 35 66 10 357 410 90
|
||||||
|
11 35 69 10 448 505 90
|
||||||
|
12 25 85 20 652 721 90
|
||||||
|
13 22 75 30 30 92 90
|
||||||
|
14 22 85 10 567 620 90
|
||||||
|
15 20 80 40 384 429 90
|
||||||
|
16 20 85 40 475 528 90
|
||||||
|
17 18 75 20 99 148 90
|
||||||
|
18 15 75 20 179 254 90
|
||||||
|
19 15 80 10 278 345 90
|
||||||
|
20 30 50 10 10 73 90
|
||||||
|
21 30 52 20 914 965 90
|
||||||
|
22 28 52 20 812 883 90
|
||||||
|
23 28 55 10 732 777 90
|
||||||
|
24 25 50 10 65 144 90
|
||||||
|
25 25 52 40 169 224 90
|
||||||
|
26 25 55 10 622 701 90
|
||||||
|
27 23 52 10 261 316 90
|
||||||
|
28 23 55 20 546 593 90
|
||||||
|
29 20 50 10 358 405 90
|
||||||
|
30 20 55 10 449 504 90
|
||||||
|
31 10 35 20 200 237 90
|
||||||
|
32 10 40 30 31 100 90
|
||||||
|
33 8 40 40 87 158 90
|
||||||
|
34 8 45 20 751 816 90
|
||||||
|
35 5 35 10 283 344 90
|
||||||
|
36 5 45 10 665 716 90
|
||||||
|
37 2 40 20 383 434 90
|
||||||
|
38 0 40 30 479 522 90
|
||||||
|
39 0 45 20 567 624 90
|
||||||
|
40 35 30 10 264 321 90
|
||||||
|
41 35 32 10 166 235 90
|
||||||
|
42 33 32 20 68 149 90
|
||||||
|
43 33 35 10 16 80 90
|
||||||
|
44 32 30 10 359 412 90
|
||||||
|
45 30 30 10 541 600 90
|
||||||
|
46 30 32 30 448 509 90
|
||||||
|
47 30 35 10 1054 1127 90
|
||||||
|
48 28 30 10 632 693 90
|
||||||
|
49 28 35 10 1001 1066 90
|
||||||
|
50 26 32 10 815 880 90
|
||||||
|
51 25 30 10 725 786 90
|
||||||
|
52 25 35 10 912 969 90
|
||||||
|
53 44 5 20 286 347 90
|
||||||
|
54 42 10 40 186 257 90
|
||||||
|
55 42 15 10 95 158 90
|
||||||
|
56 40 5 30 385 436 90
|
||||||
|
57 40 15 40 35 87 90
|
||||||
|
58 38 5 30 471 534 90
|
||||||
|
59 38 15 10 651 740 90
|
||||||
|
60 35 5 20 562 629 90
|
||||||
|
61 50 30 10 531 610 90
|
||||||
|
62 50 35 20 262 317 90
|
||||||
|
63 50 40 50 171 218 90
|
||||||
|
64 48 30 10 632 693 90
|
||||||
|
65 48 40 10 76 129 90
|
||||||
|
66 47 35 10 826 875 90
|
||||||
|
67 47 40 10 12 77 90
|
||||||
|
68 45 30 10 734 777 90
|
||||||
|
69 45 35 10 916 969 90
|
||||||
|
70 95 30 30 387 456 90
|
||||||
|
71 95 35 20 293 360 90
|
||||||
|
72 53 30 10 450 505 90
|
||||||
|
73 92 30 10 478 551 90
|
||||||
|
74 53 35 50 353 412 90
|
||||||
|
75 45 65 20 997 1068 90
|
||||||
|
76 90 35 10 203 260 90
|
||||||
|
77 88 30 10 574 643 90
|
||||||
|
78 88 35 20 109 170 90
|
||||||
|
79 87 30 10 668 731 90
|
||||||
|
80 85 25 10 769 820 90
|
||||||
|
81 85 35 30 47 124 90
|
||||||
|
82 75 55 20 369 420 90
|
||||||
|
83 72 55 10 265 338 90
|
||||||
|
84 70 58 20 458 523 90
|
||||||
|
85 68 60 30 555 612 90
|
||||||
|
86 66 55 10 173 238 90
|
||||||
|
87 65 55 20 85 144 90
|
||||||
|
88 65 60 30 645 708 90
|
||||||
|
89 63 58 10 737 802 90
|
||||||
|
90 60 55 10 20 84 90
|
||||||
|
91 60 60 10 836 889 90
|
||||||
|
92 67 85 20 368 441 90
|
||||||
|
93 65 85 40 475 518 90
|
||||||
|
94 65 82 10 285 336 90
|
||||||
|
95 62 80 30 196 239 90
|
||||||
|
96 60 80 10 95 156 90
|
||||||
|
97 60 85 30 561 622 90
|
||||||
|
98 58 75 20 30 84 90
|
||||||
|
99 55 80 10 743 820 90
|
||||||
|
100 55 85 20 647 726 90
|
||||||
|
|
@ -0,0 +1,108 @@
|
||||||
|
25 200 1
|
||||||
|
0 35 35 0 0 230 0 0 0
|
||||||
|
1 41 49 -25 161 171 10 66 0
|
||||||
|
2 35 17 7 50 60 10 0 73
|
||||||
|
3 55 45 -6 116 126 10 69 0
|
||||||
|
4 55 20 -6 149 159 10 56 0
|
||||||
|
5 15 30 26 34 44 10 0 85
|
||||||
|
6 25 30 -9 99 109 10 52 0
|
||||||
|
7 20 50 -9 81 91 10 88 0
|
||||||
|
8 10 43 9 95 105 10 0 17
|
||||||
|
9 55 60 -21 97 107 10 30 0
|
||||||
|
10 30 60 -27 124 134 10 31 0
|
||||||
|
11 20 65 12 67 77 10 0 20
|
||||||
|
12 50 35 -16 63 73 10 28 0
|
||||||
|
13 30 25 -7 159 169 10 43 0
|
||||||
|
14 15 10 20 32 42 10 0 38
|
||||||
|
15 30 5 8 61 71 10 0 97
|
||||||
|
16 10 20 19 75 85 10 0 91
|
||||||
|
17 5 30 -9 157 167 10 8 0
|
||||||
|
18 20 40 12 87 97 10 0 89
|
||||||
|
19 15 60 -5 76 86 10 36 0
|
||||||
|
20 45 65 -12 126 136 10 11 0
|
||||||
|
21 45 20 11 62 72 10 0 41
|
||||||
|
22 45 10 -18 97 107 10 75 0
|
||||||
|
23 55 5 29 68 78 0 0 104
|
||||||
|
24 65 35 3 153 163 10 0 80
|
||||||
|
25 65 20 -2 172 182 10 55 0
|
||||||
|
26 45 30 -9 132 142 10 40 0
|
||||||
|
27 35 40 16 37 47 10 0 79
|
||||||
|
28 41 37 16 39 49 10 0 12
|
||||||
|
29 64 42 9 63 73 10 0 78
|
||||||
|
30 40 60 21 71 81 10 0 9
|
||||||
|
31 31 52 27 50 60 10 0 10
|
||||||
|
32 35 69 -3 141 151 10 90 0
|
||||||
|
33 53 52 11 37 47 10 0 34
|
||||||
|
34 65 55 -11 117 127 10 33 0
|
||||||
|
35 63 65 8 143 153 10 0 77
|
||||||
|
36 2 60 5 41 51 10 0 19
|
||||||
|
37 20 20 -11 134 144 10 83 0
|
||||||
|
38 5 5 -20 83 93 10 14 0
|
||||||
|
39 60 12 31 44 54 10 0 67
|
||||||
|
40 40 25 9 85 95 10 0 26
|
||||||
|
41 42 7 -11 97 107 10 21 0
|
||||||
|
42 24 12 5 31 41 10 0 87
|
||||||
|
43 23 3 7 132 142 10 0 13
|
||||||
|
44 11 14 18 69 79 0 0 105
|
||||||
|
45 6 38 16 32 42 10 0 84
|
||||||
|
46 2 48 -27 117 127 10 47 0
|
||||||
|
47 8 56 27 51 61 10 0 46
|
||||||
|
48 13 52 -9 165 175 10 64 0
|
||||||
|
49 6 68 -10 108 118 10 63 0
|
||||||
|
50 47 47 -15 124 134 10 71 0
|
||||||
|
51 49 58 10 88 98 0 0 101
|
||||||
|
52 27 43 9 52 62 10 0 6
|
||||||
|
53 37 31 14 95 105 0 0 106
|
||||||
|
54 57 29 -13 140 150 10 76 0
|
||||||
|
55 63 23 2 136 146 10 0 25
|
||||||
|
56 53 12 6 130 140 10 0 4
|
||||||
|
57 32 12 -2 101 111 10 92 0
|
||||||
|
58 36 26 -25 200 210 10 72 0
|
||||||
|
59 21 24 28 18 28 10 0 96
|
||||||
|
60 17 34 -16 162 172 10 82 0
|
||||||
|
61 12 24 13 76 86 10 0 93
|
||||||
|
62 24 58 19 58 68 10 0 70
|
||||||
|
63 27 69 10 34 44 10 0 49
|
||||||
|
64 15 77 9 73 83 10 0 48
|
||||||
|
65 62 77 20 51 61 10 0 81
|
||||||
|
66 49 73 25 127 137 10 0 1
|
||||||
|
67 67 5 -31 83 93 10 39 0
|
||||||
|
68 56 39 36 142 152 0 0 103
|
||||||
|
69 37 47 6 50 60 10 0 3
|
||||||
|
70 37 56 -19 182 192 10 62 0
|
||||||
|
71 57 68 15 77 87 10 0 50
|
||||||
|
72 47 16 25 35 45 10 0 58
|
||||||
|
73 44 17 -7 78 88 10 2 0
|
||||||
|
74 46 13 8 149 159 0 0 102
|
||||||
|
75 49 11 18 69 79 10 0 22
|
||||||
|
76 49 42 13 73 83 10 0 54
|
||||||
|
77 53 43 -8 179 189 10 35 0
|
||||||
|
78 61 52 -9 96 106 10 29 0
|
||||||
|
79 57 48 -16 92 102 10 27 0
|
||||||
|
80 56 37 -3 182 192 10 24 0
|
||||||
|
81 55 54 -20 94 104 10 65 0
|
||||||
|
82 15 47 16 55 65 10 0 60
|
||||||
|
83 14 37 11 44 54 10 0 37
|
||||||
|
84 11 31 -16 101 111 10 45 0
|
||||||
|
85 16 22 -26 91 101 10 5 0
|
||||||
|
86 4 18 -10 94 104 10 98 0
|
||||||
|
87 28 18 -5 93 103 10 42 0
|
||||||
|
88 26 52 9 74 84 10 0 7
|
||||||
|
89 26 35 -12 176 186 10 18 0
|
||||||
|
90 31 67 3 95 105 10 0 32
|
||||||
|
91 15 19 -19 160 170 10 16 0
|
||||||
|
92 22 22 2 18 28 10 0 57
|
||||||
|
93 18 24 -13 188 198 10 61 0
|
||||||
|
94 26 27 -9 100 110 10 99 0
|
||||||
|
95 25 24 20 39 49 10 0 100
|
||||||
|
96 22 27 -28 135 145 10 59 0
|
||||||
|
97 25 21 -8 133 143 10 15 0
|
||||||
|
98 19 21 10 58 68 10 0 86
|
||||||
|
99 20 26 9 83 93 10 0 94
|
||||||
|
100 18 18 -20 185 195 10 95 0
|
||||||
|
101 49 58 -10 88 98 10 51 0
|
||||||
|
102 46 13 -8 149 159 10 74 0
|
||||||
|
103 56 39 -36 142 152 10 68 0
|
||||||
|
104 55 5 -29 68 78 10 23 0
|
||||||
|
105 11 14 -18 69 79 10 44 0
|
||||||
|
106 37 31 -14 95 105 10 53 0
|
||||||
|
|
@ -0,0 +1,52 @@
|
||||||
|
50 160 999999 0
|
||||||
|
30 40
|
||||||
|
37 52 7
|
||||||
|
49 49 30
|
||||||
|
52 64 16
|
||||||
|
20 26 9
|
||||||
|
40 30 21
|
||||||
|
21 47 15
|
||||||
|
17 63 19
|
||||||
|
31 62 23
|
||||||
|
52 33 11
|
||||||
|
51 21 5
|
||||||
|
42 41 19
|
||||||
|
31 32 29
|
||||||
|
5 25 23
|
||||||
|
12 42 21
|
||||||
|
36 16 10
|
||||||
|
52 41 15
|
||||||
|
27 23 3
|
||||||
|
17 33 41
|
||||||
|
13 13 9
|
||||||
|
57 58 28
|
||||||
|
62 42 8
|
||||||
|
42 57 8
|
||||||
|
16 57 16
|
||||||
|
8 52 10
|
||||||
|
7 38 28
|
||||||
|
27 68 7
|
||||||
|
30 48 15
|
||||||
|
43 67 14
|
||||||
|
58 48 6
|
||||||
|
58 27 19
|
||||||
|
37 69 11
|
||||||
|
38 46 12
|
||||||
|
46 10 23
|
||||||
|
61 33 26
|
||||||
|
62 63 17
|
||||||
|
63 69 6
|
||||||
|
32 22 9
|
||||||
|
45 35 15
|
||||||
|
59 15 14
|
||||||
|
5 6 7
|
||||||
|
10 17 27
|
||||||
|
21 10 13
|
||||||
|
5 64 11
|
||||||
|
30 15 16
|
||||||
|
39 10 10
|
||||||
|
32 39 5
|
||||||
|
25 32 25
|
||||||
|
25 55 17
|
||||||
|
48 28 18
|
||||||
|
56 37 10
|
||||||
|
|
@ -1,73 +0,0 @@
|
||||||
<?xml version="1.0" ?>
|
|
||||||
|
|
||||||
<algorithm xmlns="http://www.w3schools.com"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.w3schools.com algorithm_schema.xsd">
|
|
||||||
|
|
||||||
<iterations>10</iterations>
|
|
||||||
|
|
||||||
|
|
||||||
<construction>
|
|
||||||
<insertion name="bestInsertion"/>
|
|
||||||
</construction>
|
|
||||||
|
|
||||||
<strategy>
|
|
||||||
<memory>1</memory>
|
|
||||||
<searchStrategies>
|
|
||||||
<searchStrategy name="randomRuinAndRecreate">
|
|
||||||
<selector name="selectBest"/>
|
|
||||||
<acceptor name="acceptNewRemoveWorst"/>
|
|
||||||
<modules>
|
|
||||||
<module name="ruin_and_recreate">
|
|
||||||
<ruin name="randomRuin">
|
|
||||||
<share>0.5</share>
|
|
||||||
</ruin>
|
|
||||||
<insertion name="bestInsertion"/>
|
|
||||||
</module>
|
|
||||||
</modules>
|
|
||||||
<probability>0.4</probability>
|
|
||||||
</searchStrategy>
|
|
||||||
|
|
||||||
<searchStrategy name="randomRuinSmall">
|
|
||||||
<selector name="selectBest"/>
|
|
||||||
<acceptor name="acceptNewRemoveWorst"/>
|
|
||||||
<modules>
|
|
||||||
<module name="ruin_and_recreate">
|
|
||||||
<ruin name="randomRuin">
|
|
||||||
<share>0.1</share>
|
|
||||||
</ruin>
|
|
||||||
<insertion name="regretInsertion"/>
|
|
||||||
</module>
|
|
||||||
</modules>
|
|
||||||
<probability>0.4</probability>
|
|
||||||
</searchStrategy>
|
|
||||||
|
|
||||||
<searchStrategy name="radialRuinAndRecreate">
|
|
||||||
<selector name="selectBest"/>
|
|
||||||
<acceptor name="acceptNewRemoveWorst"/>
|
|
||||||
<modules>
|
|
||||||
<module name="ruin_and_recreate">
|
|
||||||
<ruin name="radialRuin">
|
|
||||||
<share>0.3</share>
|
|
||||||
</ruin>
|
|
||||||
<insertion name="bestInsertion" id="1"/>
|
|
||||||
</module>
|
|
||||||
</modules>
|
|
||||||
<probability>0.2</probability>
|
|
||||||
</searchStrategy>
|
|
||||||
|
|
||||||
<!-- <searchStrategy id="gendreauPostOpt"> -->
|
|
||||||
<!-- <modules number="1"> -->
|
|
||||||
<!-- <module name="gendreau"> -->
|
|
||||||
<!-- <iterations>200</iterations> -->
|
|
||||||
<!-- <share>0.2</share> -->
|
|
||||||
<!-- </module> -->
|
|
||||||
<!-- </modules> -->
|
|
||||||
<!-- <probability>0.1</probability> -->
|
|
||||||
<!-- </searchStrategy> -->
|
|
||||||
</searchStrategies>
|
|
||||||
|
|
||||||
</strategy>
|
|
||||||
|
|
||||||
|
|
||||||
</algorithm>
|
|
||||||
|
|
@ -1,261 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<problem xmlns="http://www.w3schools.com"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3schools.com vrp_xml_schema.xsd">
|
|
||||||
<problemType>
|
|
||||||
<fleetSize>FINITE</fleetSize>
|
|
||||||
</problemType>
|
|
||||||
<vehicles>
|
|
||||||
<vehicle>
|
|
||||||
<id>v1</id>
|
|
||||||
<typeId>vehType</typeId>
|
|
||||||
<startLocation>
|
|
||||||
<id>depotLoc2</id>
|
|
||||||
<coord x="100.0" y="100.0"/>
|
|
||||||
</startLocation>
|
|
||||||
<endLocation>
|
|
||||||
<id>depotLoc2</id>
|
|
||||||
<coord x="100.0" y="100.0"/>
|
|
||||||
</endLocation>
|
|
||||||
<timeSchedule>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1000.0</end>
|
|
||||||
</timeSchedule>
|
|
||||||
<returnToDepot>true</returnToDepot>
|
|
||||||
</vehicle>
|
|
||||||
<vehicle>
|
|
||||||
<id>v2</id>
|
|
||||||
<typeId>vehType2</typeId>
|
|
||||||
<startLocation>
|
|
||||||
<id>depotLoc</id>
|
|
||||||
<coord x="10.0" y="100.0"/>
|
|
||||||
</startLocation>
|
|
||||||
<endLocation>
|
|
||||||
<id>depotLoc</id>
|
|
||||||
<coord x="10.0" y="100.0"/>
|
|
||||||
</endLocation>
|
|
||||||
<timeSchedule>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1000.0</end>
|
|
||||||
</timeSchedule>
|
|
||||||
<returnToDepot>false</returnToDepot>
|
|
||||||
</vehicle>
|
|
||||||
<vehicle>
|
|
||||||
<id>v3</id>
|
|
||||||
<typeId>vehType2</typeId>
|
|
||||||
<startLocation>
|
|
||||||
<id>startLoc</id>
|
|
||||||
<coord x="10.0" y="100.0"/>
|
|
||||||
</startLocation>
|
|
||||||
<endLocation>
|
|
||||||
<id>endLoc</id>
|
|
||||||
<coord x="1000.0" y="2000.0"/>
|
|
||||||
</endLocation>
|
|
||||||
<timeSchedule>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1000.0</end>
|
|
||||||
</timeSchedule>
|
|
||||||
<returnToDepot>true</returnToDepot>
|
|
||||||
</vehicle>
|
|
||||||
<vehicle>
|
|
||||||
<id>v4</id>
|
|
||||||
<typeId>vehType2</typeId>
|
|
||||||
<startLocation>
|
|
||||||
<id>startLoc</id>
|
|
||||||
<coord x="10.0" y="100.0"/>
|
|
||||||
</startLocation>
|
|
||||||
<endLocation>
|
|
||||||
<id>endLoc</id>
|
|
||||||
<coord x="1000.0" y="2000.0"/>
|
|
||||||
</endLocation>
|
|
||||||
<timeSchedule>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1000.0</end>
|
|
||||||
</timeSchedule>
|
|
||||||
<returnToDepot>true</returnToDepot>
|
|
||||||
</vehicle>
|
|
||||||
<vehicle>
|
|
||||||
<id>v5</id>
|
|
||||||
<typeId>vehType3</typeId>
|
|
||||||
<startLocation>
|
|
||||||
<id>startLoc</id>
|
|
||||||
<coord x="10.0" y="100.0"/>
|
|
||||||
</startLocation>
|
|
||||||
<endLocation>
|
|
||||||
<id>endLoc</id>
|
|
||||||
<coord x="1000.0" y="2000.0"/>
|
|
||||||
</endLocation>
|
|
||||||
<timeSchedule>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1000.0</end>
|
|
||||||
</timeSchedule>
|
|
||||||
<returnToDepot>true</returnToDepot>
|
|
||||||
</vehicle>
|
|
||||||
</vehicles>
|
|
||||||
<vehicleTypes>
|
|
||||||
<type>
|
|
||||||
<id>vehType</id>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">20</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<costs>
|
|
||||||
<fixed>0.0</fixed>
|
|
||||||
<distance>0.0</distance>
|
|
||||||
<time>0.0</time>
|
|
||||||
<service>0.0</service>
|
|
||||||
<wait>0.0</wait>
|
|
||||||
</costs>
|
|
||||||
</type>
|
|
||||||
<type>
|
|
||||||
<id>vehType2</id>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">200</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<costs>
|
|
||||||
<fixed>0.0</fixed>
|
|
||||||
<distance>0.0</distance>
|
|
||||||
<time>0.0</time>
|
|
||||||
<service>0.0</service>
|
|
||||||
<wait>0.0</wait>
|
|
||||||
</costs>
|
|
||||||
</type>
|
|
||||||
<type>
|
|
||||||
<id>vehType3</id>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">100</dimension>
|
|
||||||
<dimension index="1">1000</dimension>
|
|
||||||
<dimension index="2">10000</dimension>
|
|
||||||
<dimension index="3">0</dimension>
|
|
||||||
<dimension index="4">0</dimension>
|
|
||||||
<dimension index="5">0</dimension>
|
|
||||||
<dimension index="6">0</dimension>
|
|
||||||
<dimension index="7">0</dimension>
|
|
||||||
<dimension index="8">0</dimension>
|
|
||||||
<dimension index="9">0</dimension>
|
|
||||||
<dimension index="10">100000</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<costs>
|
|
||||||
<fixed>0.0</fixed>
|
|
||||||
<distance>0.0</distance>
|
|
||||||
<time>0.0</time>
|
|
||||||
<service>0.0</service>
|
|
||||||
<wait>0.0</wait>
|
|
||||||
</costs>
|
|
||||||
</type>
|
|
||||||
</vehicleTypes>
|
|
||||||
<services>
|
|
||||||
<service id="1" type="service">
|
|
||||||
<location>
|
|
||||||
<id>j(1,5)</id>
|
|
||||||
<coord x="10.0" y="10.0"/>
|
|
||||||
</location>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">1</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<duration>10.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>4000.0</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="2" type="service">
|
|
||||||
<location>
|
|
||||||
<id>i(3,9)</id>
|
|
||||||
<coord x="10.0" y="10.0"/>
|
|
||||||
</location>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">1</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>4000.0</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
</services>
|
|
||||||
<shipments>
|
|
||||||
<shipment id="3">
|
|
||||||
<pickup>
|
|
||||||
<location>
|
|
||||||
<id>i(3,9)</id>
|
|
||||||
<coord x="10.0" y="10.0"/>
|
|
||||||
</location>
|
|
||||||
<duration>10.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>1000.0</start>
|
|
||||||
<end>4000.0</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<location>
|
|
||||||
<id>i(9,9)</id>
|
|
||||||
<coord x="10.0" y="0.0"/>
|
|
||||||
</location>
|
|
||||||
<duration>100.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>6000.0</start>
|
|
||||||
<end>10000.0</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">10</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
</shipment>
|
|
||||||
<shipment id="4">
|
|
||||||
<pickup>
|
|
||||||
<location>
|
|
||||||
<id>[x=10.0][y=10.0]</id>
|
|
||||||
<coord x="10.0" y="10.0"/>
|
|
||||||
</location>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>1000.0</start>
|
|
||||||
<end>4000.0</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<location>
|
|
||||||
<id>[x=10.0][y=0.0]</id>
|
|
||||||
<coord x="10.0" y="0.0"/>
|
|
||||||
</location>
|
|
||||||
<duration>100.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>6000.0</start>
|
|
||||||
<end>10000.0</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">10</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
</shipment>
|
|
||||||
</shipments>
|
|
||||||
<initialRoutes>
|
|
||||||
<route>
|
|
||||||
<driverId>noDriver</driverId>
|
|
||||||
<vehicleId>v1</vehicleId>
|
|
||||||
<start>10.0</start>
|
|
||||||
<act type="pickupShipment">
|
|
||||||
<shipmentId>4</shipmentId>
|
|
||||||
<arrTime>0.0</arrTime>
|
|
||||||
<endTime>0.0</endTime>
|
|
||||||
</act>
|
|
||||||
<act type="deliverShipment">
|
|
||||||
<shipmentId>4</shipmentId>
|
|
||||||
<arrTime>0.0</arrTime>
|
|
||||||
<endTime>0.0</endTime>
|
|
||||||
</act>
|
|
||||||
<end>0.0</end>
|
|
||||||
</route>
|
|
||||||
</initialRoutes>
|
|
||||||
</problem>
|
|
||||||
|
|
@ -1,207 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<problem xmlns="http://www.w3schools.com"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.w3schools.com vrp_xml_schema.xsd">
|
|
||||||
<problemType>
|
|
||||||
<fleetSize>FINITE</fleetSize>
|
|
||||||
<fleetComposition>HETEROGENEOUS</fleetComposition>
|
|
||||||
</problemType>
|
|
||||||
|
|
||||||
<vehicles>
|
|
||||||
<vehicle>
|
|
||||||
<id>v1</id>
|
|
||||||
<location>
|
|
||||||
<id>depotLoc2</id>
|
|
||||||
<coord x="100.0" y="100.0"/>
|
|
||||||
</location>
|
|
||||||
<typeId>vehType</typeId>
|
|
||||||
<timeSchedule>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1000.0</end>
|
|
||||||
</timeSchedule>
|
|
||||||
</vehicle>
|
|
||||||
<vehicle>
|
|
||||||
<id>v2</id>
|
|
||||||
<location>
|
|
||||||
<id>depotLoc</id>
|
|
||||||
<coord x="10.0" y="100.0"/>
|
|
||||||
</location>
|
|
||||||
<returnToDepot>false</returnToDepot>
|
|
||||||
<typeId>vehType2</typeId>
|
|
||||||
<timeSchedule>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1000.0</end>
|
|
||||||
</timeSchedule>
|
|
||||||
</vehicle>
|
|
||||||
<vehicle>
|
|
||||||
<id>v3</id>
|
|
||||||
<startLocation>
|
|
||||||
<id>startLoc</id>
|
|
||||||
<coord x="10.0" y="100.0"/>
|
|
||||||
</startLocation>
|
|
||||||
<endLocation>
|
|
||||||
<id>endLoc</id>
|
|
||||||
<coord x="1000.0" y="2000.0"/>
|
|
||||||
</endLocation>
|
|
||||||
<typeId>vehType2</typeId>
|
|
||||||
<timeSchedule>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1000.0</end>
|
|
||||||
</timeSchedule>
|
|
||||||
</vehicle>
|
|
||||||
<vehicle>
|
|
||||||
<id>v4</id>
|
|
||||||
<location>
|
|
||||||
<id>startLoc</id>
|
|
||||||
<coord x="10.0" y="100.0"/>
|
|
||||||
</location>
|
|
||||||
<endLocation>
|
|
||||||
<id>endLoc</id>
|
|
||||||
<coord x="1000.0" y="2000.0"/>
|
|
||||||
</endLocation>
|
|
||||||
<typeId>vehType2</typeId>
|
|
||||||
<timeSchedule>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1000.0</end>
|
|
||||||
</timeSchedule>
|
|
||||||
</vehicle>
|
|
||||||
<vehicle>
|
|
||||||
<id>v5</id>
|
|
||||||
<location>
|
|
||||||
<id>startLoc</id>
|
|
||||||
<coord x="10.0" y="100.0"/>
|
|
||||||
</location>
|
|
||||||
<endLocation>
|
|
||||||
<id>endLoc</id>
|
|
||||||
<coord x="1000.0" y="2000.0"/>
|
|
||||||
</endLocation>
|
|
||||||
<typeId>vehType3</typeId>
|
|
||||||
<timeSchedule>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1000.0</end>
|
|
||||||
</timeSchedule>
|
|
||||||
</vehicle>
|
|
||||||
</vehicles>
|
|
||||||
<vehicleTypes>
|
|
||||||
<type>
|
|
||||||
<id>vehType</id>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">20</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<costs>
|
|
||||||
<fixed>0.0</fixed>
|
|
||||||
<distance>0.0</distance>
|
|
||||||
<time>0.0</time>
|
|
||||||
</costs>
|
|
||||||
</type>
|
|
||||||
<type>
|
|
||||||
<id>vehType2</id>
|
|
||||||
<capacity>200</capacity>
|
|
||||||
<costs>
|
|
||||||
<fixed>0.0</fixed>
|
|
||||||
<distance>0.0</distance>
|
|
||||||
<time>0.0</time>
|
|
||||||
</costs>
|
|
||||||
</type>
|
|
||||||
<type>
|
|
||||||
<id>vehType3</id>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">100</dimension>
|
|
||||||
<dimension index="1">1000</dimension>
|
|
||||||
<dimension index="2">10000</dimension>
|
|
||||||
<dimension index="10">100000</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<costs>
|
|
||||||
<fixed>0.0</fixed>
|
|
||||||
<distance>0.0</distance>
|
|
||||||
<time>0.0</time>
|
|
||||||
</costs>
|
|
||||||
</type>
|
|
||||||
</vehicleTypes>
|
|
||||||
|
|
||||||
<services>
|
|
||||||
<service id="1" type="service">
|
|
||||||
<locationId>j(1,5)</locationId>
|
|
||||||
<coord x="10.0" y="10.0"/>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">1</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<duration>10.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>4000.0</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
|
|
||||||
<service id="2" type="service">
|
|
||||||
<locationId>i(3,9)</locationId>
|
|
||||||
<coord x="10.0" y="10.0"/>
|
|
||||||
<capacity-demand>1</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>4000.0</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
|
|
||||||
</services>
|
|
||||||
|
|
||||||
<shipments>
|
|
||||||
<shipment id="3">
|
|
||||||
<pickup>
|
|
||||||
<locationId>i(3,9)</locationId>
|
|
||||||
<coord x="10.0" y="10.0"/>
|
|
||||||
<duration>10.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>1000.0</start>
|
|
||||||
<end>4000.0</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<locationId>i(9,9)</locationId>
|
|
||||||
<coord x="10.0" y="0.0"/>
|
|
||||||
<duration>100.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>6000.0</start>
|
|
||||||
<end>10000.0</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-demand>10</capacity-demand>
|
|
||||||
</shipment>
|
|
||||||
|
|
||||||
<shipment id="4">
|
|
||||||
<pickup>
|
|
||||||
<coord x="10.0" y="10.0"/>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>1000.0</start>
|
|
||||||
<end>4000.0</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<coord x="10.0" y="0.0"/>
|
|
||||||
<duration>100.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>6000.0</start>
|
|
||||||
<end>10000.0</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">10</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
</shipment>
|
|
||||||
|
|
||||||
</shipments>
|
|
||||||
</problem>
|
|
||||||
|
|
@ -1,67 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<problem xmlns="http://www.w3schools.com"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3schools.com vrp_xml_schema.xsd">
|
|
||||||
<problemType>
|
|
||||||
<fleetSize>FINITE</fleetSize>
|
|
||||||
</problemType>
|
|
||||||
<vehicles>
|
|
||||||
<vehicle>
|
|
||||||
<id>v1</id>
|
|
||||||
<typeId>vehType</typeId>
|
|
||||||
<startLocation>
|
|
||||||
<id>loc</id>
|
|
||||||
</startLocation>
|
|
||||||
<endLocation>
|
|
||||||
<id>loc</id>
|
|
||||||
</endLocation>
|
|
||||||
<timeSchedule>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeSchedule>
|
|
||||||
<returnToDepot>true</returnToDepot>
|
|
||||||
</vehicle>
|
|
||||||
<vehicle>
|
|
||||||
<id>v2</id>
|
|
||||||
<typeId>vehType2</typeId>
|
|
||||||
<startLocation>
|
|
||||||
<id>loc</id>
|
|
||||||
</startLocation>
|
|
||||||
<endLocation>
|
|
||||||
<id>loc</id>
|
|
||||||
</endLocation>
|
|
||||||
<timeSchedule>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeSchedule>
|
|
||||||
<returnToDepot>true</returnToDepot>
|
|
||||||
</vehicle>
|
|
||||||
</vehicles>
|
|
||||||
<vehicleTypes>
|
|
||||||
<type>
|
|
||||||
<id>vehType</id>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">20</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<costs>
|
|
||||||
<fixed>0.0</fixed>
|
|
||||||
<distance>1.0</distance>
|
|
||||||
<time>0.0</time>
|
|
||||||
<service>0.0</service>
|
|
||||||
<wait>0.0</wait>
|
|
||||||
</costs>
|
|
||||||
</type>
|
|
||||||
<type>
|
|
||||||
<id>vehType2</id>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">200</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<costs>
|
|
||||||
<fixed>0.0</fixed>
|
|
||||||
<distance>1.0</distance>
|
|
||||||
<time>0.0</time>
|
|
||||||
<service>0.0</service>
|
|
||||||
<wait>0.0</wait>
|
|
||||||
</costs>
|
|
||||||
</type>
|
|
||||||
</vehicleTypes>
|
|
||||||
</problem>
|
|
||||||
|
|
@ -1,72 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
~ Copyright (C) 2014 Stefan Schroeder
|
|
||||||
~
|
|
||||||
~ This library is free software; you can redistribute it and/or
|
|
||||||
~ modify it under the terms of the GNU Lesser General Public
|
|
||||||
~ License as published by the Free Software Foundation; either
|
|
||||||
~ version 3.0 of the License, or (at your option) any later version.
|
|
||||||
~
|
|
||||||
~ This library is distributed in the hope that it will be useful,
|
|
||||||
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
~ Lesser General Public License for more details.
|
|
||||||
~
|
|
||||||
~ You should have received a copy of the GNU Lesser General Public
|
|
||||||
~ License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
|
|
||||||
|
|
||||||
<algorithm xmlns="http://www.w3schools.com"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.w3schools.com algorithm_schema.xsd">
|
|
||||||
|
|
||||||
<iterations>2000</iterations>
|
|
||||||
|
|
||||||
<construction>
|
|
||||||
<insertion name="bestInsertion">
|
|
||||||
</insertion>
|
|
||||||
</construction>
|
|
||||||
|
|
||||||
<strategy>
|
|
||||||
<memory>1</memory>
|
|
||||||
<searchStrategies>
|
|
||||||
<searchStrategy name="randomStrategy">
|
|
||||||
<selector name="selectBest"/>
|
|
||||||
<acceptor name="schrimpfAcceptance">
|
|
||||||
<alpha>0.1</alpha>
|
|
||||||
<warmup>20</warmup>
|
|
||||||
</acceptor>
|
|
||||||
<modules>
|
|
||||||
<module name="ruin_and_recreate">
|
|
||||||
<ruin name="randomRuin">
|
|
||||||
<share>0.4</share>
|
|
||||||
</ruin>
|
|
||||||
<insertion name="bestInsertion"/>
|
|
||||||
</module>
|
|
||||||
|
|
||||||
</modules>
|
|
||||||
<probability>0.5</probability>
|
|
||||||
</searchStrategy>
|
|
||||||
|
|
||||||
<searchStrategy name="radialStrategy">
|
|
||||||
<selector name="selectBest"/>
|
|
||||||
<acceptor name="schrimpfAcceptance"/>
|
|
||||||
|
|
||||||
<modules>
|
|
||||||
<module name="ruin_and_recreate">
|
|
||||||
<ruin name="radialRuin">
|
|
||||||
<share>0.3</share>
|
|
||||||
</ruin>
|
|
||||||
<insertion name="bestInsertion"/>
|
|
||||||
</module>
|
|
||||||
|
|
||||||
</modules>
|
|
||||||
<probability>.5</probability>
|
|
||||||
</searchStrategy>
|
|
||||||
|
|
||||||
</searchStrategies>
|
|
||||||
</strategy>
|
|
||||||
|
|
||||||
|
|
||||||
</algorithm>
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,636 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<problem xmlns="http://www.w3schools.com"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.w3schools.com vrp_xml_schema.xsd">
|
|
||||||
<problemType>
|
|
||||||
<fleetSize>INFINITE</fleetSize>
|
|
||||||
<fleetComposition>HOMOGENEOUS</fleetComposition>
|
|
||||||
</problemType>
|
|
||||||
<vehicles>
|
|
||||||
<vehicle>
|
|
||||||
<id>christophidesVehicle</id>
|
|
||||||
<typeId>christophidesType</typeId>
|
|
||||||
<location>
|
|
||||||
<id>[x=30.0][y=40.0]</id>
|
|
||||||
<coord x="30.0" y="40.0"/>
|
|
||||||
</location>
|
|
||||||
<timeSchedule>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>999999.0</end>
|
|
||||||
</timeSchedule>
|
|
||||||
</vehicle>
|
|
||||||
</vehicles>
|
|
||||||
<vehicleTypes>
|
|
||||||
<type>
|
|
||||||
<id>christophidesType</id>
|
|
||||||
<capacity>50</capacity>
|
|
||||||
<costs>
|
|
||||||
<fixed>0.0</fixed>
|
|
||||||
<distance>1.0</distance>
|
|
||||||
<time>0.0</time>
|
|
||||||
</costs>
|
|
||||||
</type>
|
|
||||||
</vehicleTypes>
|
|
||||||
<services>
|
|
||||||
<service id="35" type="delivery">
|
|
||||||
<locationId>[x=62.0][y=63.0]</locationId>
|
|
||||||
<coord x="62.0" y="63.0"/>
|
|
||||||
<capacity-demand>17</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="36" type="pickup">
|
|
||||||
<locationId>[x=63.0][y=69.0]</locationId>
|
|
||||||
<coord x="63.0" y="69.0"/>
|
|
||||||
<capacity-demand>6</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="33" type="pickup">
|
|
||||||
<locationId>[x=46.0][y=10.0]</locationId>
|
|
||||||
<coord x="46.0" y="10.0"/>
|
|
||||||
<capacity-demand>23</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="34" type="pickup">
|
|
||||||
<locationId>[x=61.0][y=33.0]</locationId>
|
|
||||||
<coord x="61.0" y="33.0"/>
|
|
||||||
<capacity-demand>26</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="39" type="pickup">
|
|
||||||
<locationId>[x=59.0][y=15.0]</locationId>
|
|
||||||
<coord x="59.0" y="15.0"/>
|
|
||||||
<capacity-demand>14</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="37" type="delivery">
|
|
||||||
<locationId>[x=32.0][y=22.0]</locationId>
|
|
||||||
<coord x="32.0" y="22.0"/>
|
|
||||||
<capacity-demand>9</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="38" type="delivery">
|
|
||||||
<locationId>[x=45.0][y=35.0]</locationId>
|
|
||||||
<coord x="45.0" y="35.0"/>
|
|
||||||
<capacity-demand>15</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="43" type="delivery">
|
|
||||||
<locationId>[x=5.0][y=64.0]</locationId>
|
|
||||||
<coord x="5.0" y="64.0"/>
|
|
||||||
<capacity-demand>11</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="42" type="delivery">
|
|
||||||
<locationId>[x=21.0][y=10.0]</locationId>
|
|
||||||
<coord x="21.0" y="10.0"/>
|
|
||||||
<capacity-demand>13</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="41" type="delivery">
|
|
||||||
<locationId>[x=10.0][y=17.0]</locationId>
|
|
||||||
<coord x="10.0" y="17.0"/>
|
|
||||||
<capacity-demand>27</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="40" type="delivery">
|
|
||||||
<locationId>[x=5.0][y=6.0]</locationId>
|
|
||||||
<coord x="5.0" y="6.0"/>
|
|
||||||
<capacity-demand>7</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="22" type="pickup">
|
|
||||||
<locationId>[x=42.0][y=57.0]</locationId>
|
|
||||||
<coord x="42.0" y="57.0"/>
|
|
||||||
<capacity-demand>8</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="23" type="delivery">
|
|
||||||
<locationId>[x=16.0][y=57.0]</locationId>
|
|
||||||
<coord x="16.0" y="57.0"/>
|
|
||||||
<capacity-demand>16</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="24" type="delivery">
|
|
||||||
<locationId>[x=8.0][y=52.0]</locationId>
|
|
||||||
<coord x="8.0" y="52.0"/>
|
|
||||||
<capacity-demand>10</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="25" type="pickup">
|
|
||||||
<locationId>[x=7.0][y=38.0]</locationId>
|
|
||||||
<coord x="7.0" y="38.0"/>
|
|
||||||
<capacity-demand>28</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="26" type="delivery">
|
|
||||||
<locationId>[x=27.0][y=68.0]</locationId>
|
|
||||||
<coord x="27.0" y="68.0"/>
|
|
||||||
<capacity-demand>7</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="27" type="pickup">
|
|
||||||
<locationId>[x=30.0][y=48.0]</locationId>
|
|
||||||
<coord x="30.0" y="48.0"/>
|
|
||||||
<capacity-demand>15</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="28" type="pickup">
|
|
||||||
<locationId>[x=43.0][y=67.0]</locationId>
|
|
||||||
<coord x="43.0" y="67.0"/>
|
|
||||||
<capacity-demand>14</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="29" type="delivery">
|
|
||||||
<locationId>[x=58.0][y=48.0]</locationId>
|
|
||||||
<coord x="58.0" y="48.0"/>
|
|
||||||
<capacity-demand>6</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="3" type="delivery">
|
|
||||||
<locationId>[x=52.0][y=64.0]</locationId>
|
|
||||||
<coord x="52.0" y="64.0"/>
|
|
||||||
<capacity-demand>16</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="2" type="delivery">
|
|
||||||
<locationId>[x=49.0][y=49.0]</locationId>
|
|
||||||
<coord x="49.0" y="49.0"/>
|
|
||||||
<capacity-demand>30</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="1" type="delivery">
|
|
||||||
<locationId>[x=37.0][y=52.0]</locationId>
|
|
||||||
<coord x="37.0" y="52.0"/>
|
|
||||||
<capacity-demand>7</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="7" type="pickup">
|
|
||||||
<locationId>[x=17.0][y=63.0]</locationId>
|
|
||||||
<coord x="17.0" y="63.0"/>
|
|
||||||
<capacity-demand>19</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="30" type="delivery">
|
|
||||||
<locationId>[x=58.0][y=27.0]</locationId>
|
|
||||||
<coord x="58.0" y="27.0"/>
|
|
||||||
<capacity-demand>19</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="6" type="pickup">
|
|
||||||
<locationId>[x=21.0][y=47.0]</locationId>
|
|
||||||
<coord x="21.0" y="47.0"/>
|
|
||||||
<capacity-demand>15</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="5" type="delivery">
|
|
||||||
<locationId>[x=40.0][y=30.0]</locationId>
|
|
||||||
<coord x="40.0" y="30.0"/>
|
|
||||||
<capacity-demand>21</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="32" type="pickup">
|
|
||||||
<locationId>[x=38.0][y=46.0]</locationId>
|
|
||||||
<coord x="38.0" y="46.0"/>
|
|
||||||
<capacity-demand>12</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="4" type="delivery">
|
|
||||||
<locationId>[x=20.0][y=26.0]</locationId>
|
|
||||||
<coord x="20.0" y="26.0"/>
|
|
||||||
<capacity-demand>9</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="31" type="delivery">
|
|
||||||
<locationId>[x=37.0][y=69.0]</locationId>
|
|
||||||
<coord x="37.0" y="69.0"/>
|
|
||||||
<capacity-demand>11</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="9" type="pickup">
|
|
||||||
<locationId>[x=52.0][y=33.0]</locationId>
|
|
||||||
<coord x="52.0" y="33.0"/>
|
|
||||||
<capacity-demand>11</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="8" type="pickup">
|
|
||||||
<locationId>[x=31.0][y=62.0]</locationId>
|
|
||||||
<coord x="31.0" y="62.0"/>
|
|
||||||
<capacity-demand>23</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="19" type="delivery">
|
|
||||||
<locationId>[x=13.0][y=13.0]</locationId>
|
|
||||||
<coord x="13.0" y="13.0"/>
|
|
||||||
<capacity-demand>9</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="17" type="pickup">
|
|
||||||
<locationId>[x=27.0][y=23.0]</locationId>
|
|
||||||
<coord x="27.0" y="23.0"/>
|
|
||||||
<capacity-demand>3</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="18" type="delivery">
|
|
||||||
<locationId>[x=17.0][y=33.0]</locationId>
|
|
||||||
<coord x="17.0" y="33.0"/>
|
|
||||||
<capacity-demand>41</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="15" type="pickup">
|
|
||||||
<locationId>[x=36.0][y=16.0]</locationId>
|
|
||||||
<coord x="36.0" y="16.0"/>
|
|
||||||
<capacity-demand>10</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="16" type="delivery">
|
|
||||||
<locationId>[x=52.0][y=41.0]</locationId>
|
|
||||||
<coord x="52.0" y="41.0"/>
|
|
||||||
<capacity-demand>15</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="13" type="delivery">
|
|
||||||
<locationId>[x=5.0][y=25.0]</locationId>
|
|
||||||
<coord x="5.0" y="25.0"/>
|
|
||||||
<capacity-demand>23</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="14" type="pickup">
|
|
||||||
<locationId>[x=12.0][y=42.0]</locationId>
|
|
||||||
<coord x="12.0" y="42.0"/>
|
|
||||||
<capacity-demand>21</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="11" type="delivery">
|
|
||||||
<locationId>[x=42.0][y=41.0]</locationId>
|
|
||||||
<coord x="42.0" y="41.0"/>
|
|
||||||
<capacity-demand>19</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="12" type="pickup">
|
|
||||||
<locationId>[x=31.0][y=32.0]</locationId>
|
|
||||||
<coord x="31.0" y="32.0"/>
|
|
||||||
<capacity-demand>29</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="21" type="delivery">
|
|
||||||
<locationId>[x=62.0][y=42.0]</locationId>
|
|
||||||
<coord x="62.0" y="42.0"/>
|
|
||||||
<capacity-demand>8</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="20" type="delivery">
|
|
||||||
<locationId>[x=57.0][y=58.0]</locationId>
|
|
||||||
<coord x="57.0" y="58.0"/>
|
|
||||||
<capacity-demand>28</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="49" type="pickup">
|
|
||||||
<locationId>[x=48.0][y=28.0]</locationId>
|
|
||||||
<coord x="48.0" y="28.0"/>
|
|
||||||
<capacity-demand>18</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="48" type="pickup">
|
|
||||||
<locationId>[x=25.0][y=55.0]</locationId>
|
|
||||||
<coord x="25.0" y="55.0"/>
|
|
||||||
<capacity-demand>17</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="45" type="pickup">
|
|
||||||
<locationId>[x=39.0][y=10.0]</locationId>
|
|
||||||
<coord x="39.0" y="10.0"/>
|
|
||||||
<capacity-demand>10</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="44" type="pickup">
|
|
||||||
<locationId>[x=30.0][y=15.0]</locationId>
|
|
||||||
<coord x="30.0" y="15.0"/>
|
|
||||||
<capacity-demand>16</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="47" type="pickup">
|
|
||||||
<locationId>[x=25.0][y=32.0]</locationId>
|
|
||||||
<coord x="25.0" y="32.0"/>
|
|
||||||
<capacity-demand>25</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="46" type="pickup">
|
|
||||||
<locationId>[x=32.0][y=39.0]</locationId>
|
|
||||||
<coord x="32.0" y="39.0"/>
|
|
||||||
<capacity-demand>5</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="10" type="delivery">
|
|
||||||
<locationId>[x=51.0][y=21.0]</locationId>
|
|
||||||
<coord x="51.0" y="21.0"/>
|
|
||||||
<capacity-demand>5</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="50" type="pickup">
|
|
||||||
<locationId>[x=56.0][y=37.0]</locationId>
|
|
||||||
<coord x="56.0" y="37.0"/>
|
|
||||||
<capacity-demand>10</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
</services>
|
|
||||||
</problem>
|
|
||||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -1,512 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<problem xmlns="http://www.w3schools.com"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.w3schools.com vrp_xml_schema.xsd">
|
|
||||||
<problemType>
|
|
||||||
<fleetSize>INFINITE</fleetSize>
|
|
||||||
<fleetComposition>HOMOGENEOUS</fleetComposition>
|
|
||||||
</problemType>
|
|
||||||
<vehicles>
|
|
||||||
<vehicle>
|
|
||||||
<id>v</id>
|
|
||||||
<typeId>t</typeId>
|
|
||||||
<location>
|
|
||||||
<id>[x=10.0][y=10.0]</id>
|
|
||||||
<coord x="10.0" y="10.0"/>
|
|
||||||
</location>
|
|
||||||
<timeSchedule>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>500.0</end>
|
|
||||||
</timeSchedule>
|
|
||||||
</vehicle>
|
|
||||||
</vehicles>
|
|
||||||
<vehicleTypes>
|
|
||||||
<type>
|
|
||||||
<id>t</id>
|
|
||||||
<capacity>5</capacity>
|
|
||||||
<costs>
|
|
||||||
<fixed>0.0</fixed>
|
|
||||||
<distance>1.0</distance>
|
|
||||||
<time>0.0</time>
|
|
||||||
</costs>
|
|
||||||
</type>
|
|
||||||
</vehicleTypes>
|
|
||||||
<shipments>
|
|
||||||
<shipment id="s437">
|
|
||||||
<pickup>
|
|
||||||
<locationId>[x=77.0][y=23.0]</locationId>
|
|
||||||
<coord x="77.0" y="23.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<locationId>[x=20.0][y=39.0]</locationId>
|
|
||||||
<coord x="20.0" y="39.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-demand>1</capacity-demand>
|
|
||||||
</shipment>
|
|
||||||
<shipment id="s436">
|
|
||||||
<pickup>
|
|
||||||
<locationId>[x=67.0][y=1.0]</locationId>
|
|
||||||
<coord x="67.0" y="1.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<locationId>[x=41.0][y=7.0]</locationId>
|
|
||||||
<coord x="41.0" y="7.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-demand>1</capacity-demand>
|
|
||||||
</shipment>
|
|
||||||
<shipment id="s439">
|
|
||||||
<pickup>
|
|
||||||
<locationId>[x=57.0][y=96.0]</locationId>
|
|
||||||
<coord x="57.0" y="96.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<locationId>[x=36.0][y=97.0]</locationId>
|
|
||||||
<coord x="36.0" y="97.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-demand>1</capacity-demand>
|
|
||||||
</shipment>
|
|
||||||
<shipment id="s438">
|
|
||||||
<pickup>
|
|
||||||
<locationId>[x=28.0][y=84.0]</locationId>
|
|
||||||
<coord x="28.0" y="84.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<locationId>[x=93.0][y=44.0]</locationId>
|
|
||||||
<coord x="93.0" y="44.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-demand>1</capacity-demand>
|
|
||||||
</shipment>
|
|
||||||
<shipment id="s433">
|
|
||||||
<pickup>
|
|
||||||
<locationId>[x=3.0][y=36.0]</locationId>
|
|
||||||
<coord x="3.0" y="36.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<locationId>[x=77.0][y=6.0]</locationId>
|
|
||||||
<coord x="77.0" y="6.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-demand>1</capacity-demand>
|
|
||||||
</shipment>
|
|
||||||
<shipment id="s432">
|
|
||||||
<pickup>
|
|
||||||
<locationId>[x=45.0][y=11.0]</locationId>
|
|
||||||
<coord x="45.0" y="11.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<locationId>[x=63.0][y=80.0]</locationId>
|
|
||||||
<coord x="63.0" y="80.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-demand>1</capacity-demand>
|
|
||||||
</shipment>
|
|
||||||
<shipment id="s435">
|
|
||||||
<pickup>
|
|
||||||
<locationId>[x=4.0][y=84.0]</locationId>
|
|
||||||
<coord x="4.0" y="84.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<locationId>[x=93.0][y=23.0]</locationId>
|
|
||||||
<coord x="93.0" y="23.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-demand>1</capacity-demand>
|
|
||||||
</shipment>
|
|
||||||
<shipment id="s434">
|
|
||||||
<pickup>
|
|
||||||
<locationId>[x=80.0][y=9.0]</locationId>
|
|
||||||
<coord x="80.0" y="9.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<locationId>[x=19.0][y=76.0]</locationId>
|
|
||||||
<coord x="19.0" y="76.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-demand>1</capacity-demand>
|
|
||||||
</shipment>
|
|
||||||
<shipment id="s931">
|
|
||||||
<pickup>
|
|
||||||
<locationId>[x=8.0][y=23.0]</locationId>
|
|
||||||
<coord x="8.0" y="23.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<locationId>[x=84.0][y=33.0]</locationId>
|
|
||||||
<coord x="84.0" y="33.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-demand>1</capacity-demand>
|
|
||||||
</shipment>
|
|
||||||
<shipment id="s932">
|
|
||||||
<pickup>
|
|
||||||
<locationId>[x=26.0][y=89.0]</locationId>
|
|
||||||
<coord x="26.0" y="89.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<locationId>[x=48.0][y=55.0]</locationId>
|
|
||||||
<coord x="48.0" y="55.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-demand>1</capacity-demand>
|
|
||||||
</shipment>
|
|
||||||
<shipment id="s933">
|
|
||||||
<pickup>
|
|
||||||
<locationId>[x=78.0][y=43.0]</locationId>
|
|
||||||
<coord x="78.0" y="43.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<locationId>[x=66.0][y=44.0]</locationId>
|
|
||||||
<coord x="66.0" y="44.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-demand>1</capacity-demand>
|
|
||||||
</shipment>
|
|
||||||
<shipment id="s934">
|
|
||||||
<pickup>
|
|
||||||
<locationId>[x=73.0][y=38.0]</locationId>
|
|
||||||
<coord x="73.0" y="38.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<locationId>[x=89.0][y=40.0]</locationId>
|
|
||||||
<coord x="89.0" y="40.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-demand>1</capacity-demand>
|
|
||||||
</shipment>
|
|
||||||
<shipment id="s930">
|
|
||||||
<pickup>
|
|
||||||
<locationId>[x=22.0][y=62.0]</locationId>
|
|
||||||
<coord x="22.0" y="62.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<locationId>[x=6.0][y=60.0]</locationId>
|
|
||||||
<coord x="6.0" y="60.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-demand>1</capacity-demand>
|
|
||||||
</shipment>
|
|
||||||
<shipment id="s939">
|
|
||||||
<pickup>
|
|
||||||
<locationId>[x=56.0][y=17.0]</locationId>
|
|
||||||
<coord x="56.0" y="17.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<locationId>[x=84.0][y=71.0]</locationId>
|
|
||||||
<coord x="84.0" y="71.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-demand>1</capacity-demand>
|
|
||||||
</shipment>
|
|
||||||
<shipment id="s440">
|
|
||||||
<pickup>
|
|
||||||
<locationId>[x=26.0][y=60.0]</locationId>
|
|
||||||
<coord x="26.0" y="60.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<locationId>[x=37.0][y=25.0]</locationId>
|
|
||||||
<coord x="37.0" y="25.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-demand>1</capacity-demand>
|
|
||||||
</shipment>
|
|
||||||
<shipment id="s441">
|
|
||||||
<pickup>
|
|
||||||
<locationId>[x=96.0][y=35.0]</locationId>
|
|
||||||
<coord x="96.0" y="35.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<locationId>[x=93.0][y=20.0]</locationId>
|
|
||||||
<coord x="93.0" y="20.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-demand>1</capacity-demand>
|
|
||||||
</shipment>
|
|
||||||
<shipment id="s442">
|
|
||||||
<pickup>
|
|
||||||
<locationId>[x=1.0][y=18.0]</locationId>
|
|
||||||
<coord x="1.0" y="18.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<locationId>[x=56.0][y=33.0]</locationId>
|
|
||||||
<coord x="56.0" y="33.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-demand>1</capacity-demand>
|
|
||||||
</shipment>
|
|
||||||
<shipment id="s935">
|
|
||||||
<pickup>
|
|
||||||
<locationId>[x=93.0][y=44.0]</locationId>
|
|
||||||
<coord x="93.0" y="44.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<locationId>[x=5.0][y=90.0]</locationId>
|
|
||||||
<coord x="5.0" y="90.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-demand>1</capacity-demand>
|
|
||||||
</shipment>
|
|
||||||
<shipment id="s936">
|
|
||||||
<pickup>
|
|
||||||
<locationId>[x=31.0][y=63.0]</locationId>
|
|
||||||
<coord x="31.0" y="63.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<locationId>[x=12.0][y=56.0]</locationId>
|
|
||||||
<coord x="12.0" y="56.0"/>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-demand>1</capacity-demand>
|
|
||||||
</shipment>
|
|
||||||
|
|
||||||
</shipments>
|
|
||||||
</problem>
|
|
||||||
|
|
@ -1,73 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
~ Copyright (C) 2014 Stefan Schroeder
|
|
||||||
~
|
|
||||||
~ This library is free software; you can redistribute it and/or
|
|
||||||
~ modify it under the terms of the GNU Lesser General Public
|
|
||||||
~ License as published by the Free Software Foundation; either
|
|
||||||
~ version 3.0 of the License, or (at your option) any later version.
|
|
||||||
~
|
|
||||||
~ This library is distributed in the hope that it will be useful,
|
|
||||||
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
~ Lesser General Public License for more details.
|
|
||||||
~
|
|
||||||
~ You should have received a copy of the GNU Lesser General Public
|
|
||||||
~ License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
|
|
||||||
|
|
||||||
<algorithm xmlns="http://www.w3schools.com"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.w3schools.com algorithm_schema.xsd">
|
|
||||||
|
|
||||||
<iterations>2000</iterations>
|
|
||||||
|
|
||||||
<construction>
|
|
||||||
<insertion name="bestInsertion">
|
|
||||||
<allowVehicleSwitch>false</allowVehicleSwitch>
|
|
||||||
</insertion>
|
|
||||||
</construction>
|
|
||||||
|
|
||||||
<strategy>
|
|
||||||
<memory>1</memory>
|
|
||||||
<searchStrategies>
|
|
||||||
<searchStrategy name="randomStrategy">
|
|
||||||
<selector name="selectBest"/>
|
|
||||||
<acceptor name="schrimpfAcceptance">
|
|
||||||
<alpha>0.1</alpha>
|
|
||||||
<warmup>20</warmup>
|
|
||||||
</acceptor>
|
|
||||||
<modules>
|
|
||||||
<module name="ruin_and_recreate">
|
|
||||||
<ruin name="randomRuin">
|
|
||||||
<share>0.3</share>
|
|
||||||
</ruin>
|
|
||||||
<insertion name="bestInsertion"/>
|
|
||||||
</module>
|
|
||||||
|
|
||||||
</modules>
|
|
||||||
<probability>0.5</probability>
|
|
||||||
</searchStrategy>
|
|
||||||
|
|
||||||
<searchStrategy name="radialStrategy">
|
|
||||||
<selector name="selectBest"/>
|
|
||||||
<acceptor name="schrimpfAcceptance"/>
|
|
||||||
|
|
||||||
<modules>
|
|
||||||
<module name="ruin_and_recreate">
|
|
||||||
<ruin name="radialRuin">
|
|
||||||
<share>0.1</share>
|
|
||||||
</ruin>
|
|
||||||
<insertion name="bestInsertion"/>
|
|
||||||
</module>
|
|
||||||
|
|
||||||
</modules>
|
|
||||||
<probability>.5</probability>
|
|
||||||
</searchStrategy>
|
|
||||||
|
|
||||||
</searchStrategies>
|
|
||||||
</strategy>
|
|
||||||
|
|
||||||
|
|
||||||
</algorithm>
|
|
||||||
|
|
@ -1,99 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<problem xmlns="http://www.w3schools.com"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.w3schools.com vrp_xml_schema.xsd">
|
|
||||||
<problemType>
|
|
||||||
<fleetSize>FINITE</fleetSize>
|
|
||||||
<fleetComposition>HOMOGENEOUS</fleetComposition>
|
|
||||||
</problemType>
|
|
||||||
<vehicles>
|
|
||||||
<vehicle>
|
|
||||||
<id>21</id>
|
|
||||||
<typeId>5</typeId>
|
|
||||||
<startLocation>
|
|
||||||
<id>[x=0.0][y=0.0]</id>
|
|
||||||
<coord x="0.0" y="0.0"/>
|
|
||||||
</startLocation>
|
|
||||||
<endLocation>
|
|
||||||
<id>[x=0.0][y=0.0]</id>
|
|
||||||
<coord x="0.0" y="0.0"/>
|
|
||||||
</endLocation>
|
|
||||||
<timeSchedule>
|
|
||||||
<start>14400.0</start>
|
|
||||||
<end>46800.0</end>
|
|
||||||
</timeSchedule>
|
|
||||||
<returnToDepot>true</returnToDepot>
|
|
||||||
</vehicle>
|
|
||||||
<vehicle>
|
|
||||||
<id>19</id>
|
|
||||||
<typeId>3.5</typeId>
|
|
||||||
<startLocation>
|
|
||||||
<id>[x=0.0][y=0.0]</id>
|
|
||||||
<coord x="0.0" y="0.0"/>
|
|
||||||
</startLocation>
|
|
||||||
<endLocation>
|
|
||||||
<id>[x=0.0][y=0.0]</id>
|
|
||||||
<coord x="0.0" y="0.0"/>
|
|
||||||
</endLocation>
|
|
||||||
<timeSchedule>
|
|
||||||
<start>39600.0</start>
|
|
||||||
<end>64800.0</end>
|
|
||||||
</timeSchedule>
|
|
||||||
<returnToDepot>true</returnToDepot>
|
|
||||||
</vehicle>
|
|
||||||
</vehicles>
|
|
||||||
<vehicleTypes>
|
|
||||||
<type>
|
|
||||||
<id>5</id>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">0</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<costs>
|
|
||||||
<fixed>0.0</fixed>
|
|
||||||
<distance>1.0</distance>
|
|
||||||
<time>0.0</time>
|
|
||||||
</costs>
|
|
||||||
</type>
|
|
||||||
<type>
|
|
||||||
<id>3.5</id>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">0</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<costs>
|
|
||||||
<fixed>0.0</fixed>
|
|
||||||
<distance>1.0</distance>
|
|
||||||
<time>0.0</time>
|
|
||||||
</costs>
|
|
||||||
</type>
|
|
||||||
</vehicleTypes>
|
|
||||||
<services>
|
|
||||||
<service id="2" type="service">
|
|
||||||
<locationId>[x=2000.0][y=0.0]</locationId>
|
|
||||||
<coord x="2000.0" y="0.0"/>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">0</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>54000.0</start>
|
|
||||||
<end>64800.0</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="1" type="service">
|
|
||||||
<locationId>[x=1000.0][y=1000.0]</locationId>
|
|
||||||
<coord x="1000.0" y="1000.0"/>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">0</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>19800.0</start>
|
|
||||||
<end>21600.0</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
</services>
|
|
||||||
</problem>
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,66 +0,0 @@
|
||||||
<?xml version="1.0" ?>
|
|
||||||
|
|
||||||
<config>
|
|
||||||
|
|
||||||
<iterations>10</iterations>
|
|
||||||
|
|
||||||
<construction>
|
|
||||||
<insertion name="bestInsertion"/>
|
|
||||||
</construction>
|
|
||||||
|
|
||||||
<strategy>
|
|
||||||
<memory>1</memory>
|
|
||||||
<searchStrategies>
|
|
||||||
<searchStrategy name="randomRuinAndRecreate">
|
|
||||||
<selector name="selectBest"/>
|
|
||||||
<acceptor name="acceptNewRemoveWorst"/>
|
|
||||||
<modules>
|
|
||||||
<module name="randomRuin">
|
|
||||||
<share>0.5</share>
|
|
||||||
</module>
|
|
||||||
<module name="bestInsertion">
|
|
||||||
</module>
|
|
||||||
</modules>
|
|
||||||
<probability>0.4</probability>
|
|
||||||
</searchStrategy>
|
|
||||||
|
|
||||||
<searchStrategy name="randomRuinSmall">
|
|
||||||
<selector name="selectBest"/>
|
|
||||||
<acceptor name="acceptNewRemoveWorst"/>
|
|
||||||
<modules>
|
|
||||||
<module name="randomRuin">
|
|
||||||
<share>0.1</share>
|
|
||||||
</module>
|
|
||||||
<module name="bestInsertion"></module>
|
|
||||||
</modules>
|
|
||||||
<probability>0.4</probability>
|
|
||||||
</searchStrategy>
|
|
||||||
|
|
||||||
<searchStrategy name="radialRuinAndRecreate">
|
|
||||||
<selector name="selectBest"/>
|
|
||||||
<acceptor name="acceptNewRemoveWorst"/>
|
|
||||||
<modules>
|
|
||||||
<module name="radialRuin">
|
|
||||||
<share>0.3</share>
|
|
||||||
<distanceMeasure>euclid</distanceMeasure>
|
|
||||||
</module>
|
|
||||||
<module name="bestInsertion" id="1"></module>
|
|
||||||
</modules>
|
|
||||||
<probability>0.2</probability>
|
|
||||||
</searchStrategy>
|
|
||||||
|
|
||||||
<!-- <searchStrategy id="gendreauPostOpt"> -->
|
|
||||||
<!-- <modules number="1"> -->
|
|
||||||
<!-- <module name="gendreau"> -->
|
|
||||||
<!-- <iterations>200</iterations> -->
|
|
||||||
<!-- <share>0.2</share> -->
|
|
||||||
<!-- </module> -->
|
|
||||||
<!-- </modules> -->
|
|
||||||
<!-- <probability>0.1</probability> -->
|
|
||||||
<!-- </searchStrategy> -->
|
|
||||||
</searchStrategies>
|
|
||||||
|
|
||||||
</strategy>
|
|
||||||
|
|
||||||
|
|
||||||
</config>
|
|
||||||
|
|
@ -1,407 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<problem xmlns="http://www.w3schools.com"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3schools.com vrp_xml_schema.xsd">
|
|
||||||
<problemType>
|
|
||||||
<fleetSize>FINITE</fleetSize>
|
|
||||||
</problemType>
|
|
||||||
<vehicles>
|
|
||||||
<vehicle>
|
|
||||||
<id>vehicle0</id>
|
|
||||||
<typeId>vehicle_type_0</typeId>
|
|
||||||
<startLocation>
|
|
||||||
<id>v0_start</id>
|
|
||||||
<index>0</index>
|
|
||||||
</startLocation>
|
|
||||||
<endLocation>
|
|
||||||
<id>v0_start</id>
|
|
||||||
<index>0</index>
|
|
||||||
</endLocation>
|
|
||||||
<timeSchedule>
|
|
||||||
<start>60.0</start>
|
|
||||||
<end>18060.0</end>
|
|
||||||
</timeSchedule>
|
|
||||||
<returnToDepot>true</returnToDepot>
|
|
||||||
<skills>primemover</skills>
|
|
||||||
</vehicle>
|
|
||||||
<vehicle>
|
|
||||||
<id>vehicle1</id>
|
|
||||||
<typeId>vehicle_type_1</typeId>
|
|
||||||
<startLocation>
|
|
||||||
<id>v1_start</id>
|
|
||||||
<index>0</index>
|
|
||||||
</startLocation>
|
|
||||||
<endLocation>
|
|
||||||
<id>v1_start</id>
|
|
||||||
<index>0</index>
|
|
||||||
</endLocation>
|
|
||||||
<timeSchedule>
|
|
||||||
<start>60.0</start>
|
|
||||||
<end>18060.0</end>
|
|
||||||
</timeSchedule>
|
|
||||||
<returnToDepot>true</returnToDepot>
|
|
||||||
<skills>primemover</skills>
|
|
||||||
</vehicle>
|
|
||||||
<vehicle>
|
|
||||||
<id>vehicle2</id>
|
|
||||||
<typeId>vehicle_type_2</typeId>
|
|
||||||
<startLocation>
|
|
||||||
<id>v2_start</id>
|
|
||||||
<index>0</index>
|
|
||||||
</startLocation>
|
|
||||||
<endLocation>
|
|
||||||
<id>v2_start</id>
|
|
||||||
<index>0</index>
|
|
||||||
</endLocation>
|
|
||||||
<timeSchedule>
|
|
||||||
<start>7200.0</start>
|
|
||||||
<end>36060.0</end>
|
|
||||||
</timeSchedule>
|
|
||||||
<returnToDepot>true</returnToDepot>
|
|
||||||
<skills>primemover</skills>
|
|
||||||
</vehicle>
|
|
||||||
<vehicle>
|
|
||||||
<id>vehicle3</id>
|
|
||||||
<typeId>vehicle_type_3</typeId>
|
|
||||||
<startLocation>
|
|
||||||
<id>v3_start</id>
|
|
||||||
<index>0</index>
|
|
||||||
</startLocation>
|
|
||||||
<endLocation>
|
|
||||||
<id>v3_start</id>
|
|
||||||
<index>0</index>
|
|
||||||
</endLocation>
|
|
||||||
<timeSchedule>
|
|
||||||
<start>36000.0</start>
|
|
||||||
<end>54060.0</end>
|
|
||||||
</timeSchedule>
|
|
||||||
<returnToDepot>true</returnToDepot>
|
|
||||||
<skills>primemover</skills>
|
|
||||||
</vehicle>
|
|
||||||
<vehicle>
|
|
||||||
<id>vehicle4</id>
|
|
||||||
<typeId>vehicle_type_4</typeId>
|
|
||||||
<startLocation>
|
|
||||||
<id>v4_start</id>
|
|
||||||
<index>0</index>
|
|
||||||
</startLocation>
|
|
||||||
<endLocation>
|
|
||||||
<id>v4_start</id>
|
|
||||||
<index>0</index>
|
|
||||||
</endLocation>
|
|
||||||
<timeSchedule>
|
|
||||||
<start>36000.0</start>
|
|
||||||
<end>54060.0</end>
|
|
||||||
</timeSchedule>
|
|
||||||
<returnToDepot>true</returnToDepot>
|
|
||||||
<skills>primemover</skills>
|
|
||||||
</vehicle>
|
|
||||||
</vehicles>
|
|
||||||
<vehicleTypes>
|
|
||||||
<type>
|
|
||||||
<id>vehicle_type_0</id>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">20</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<costs>
|
|
||||||
<fixed>0.0</fixed>
|
|
||||||
<distance>0.0</distance>
|
|
||||||
<time>1.0</time>
|
|
||||||
</costs>
|
|
||||||
</type>
|
|
||||||
<type>
|
|
||||||
<id>vehicle_type_1</id>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">20</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<costs>
|
|
||||||
<fixed>0.0</fixed>
|
|
||||||
<distance>0.0</distance>
|
|
||||||
<time>1.0</time>
|
|
||||||
</costs>
|
|
||||||
</type>
|
|
||||||
<type>
|
|
||||||
<id>vehicle_type_2</id>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">20</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<costs>
|
|
||||||
<fixed>0.0</fixed>
|
|
||||||
<distance>0.0</distance>
|
|
||||||
<time>1.0</time>
|
|
||||||
</costs>
|
|
||||||
</type>
|
|
||||||
<type>
|
|
||||||
<id>vehicle_type_3</id>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">20</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<costs>
|
|
||||||
<fixed>0.0</fixed>
|
|
||||||
<distance>0.0</distance>
|
|
||||||
<time>1.0</time>
|
|
||||||
</costs>
|
|
||||||
</type>
|
|
||||||
<type>
|
|
||||||
<id>vehicle_type_4</id>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">20</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<costs>
|
|
||||||
<fixed>0.0</fixed>
|
|
||||||
<distance>0.0</distance>
|
|
||||||
<time>1.0</time>
|
|
||||||
</costs>
|
|
||||||
</type>
|
|
||||||
</vehicleTypes>
|
|
||||||
<services>
|
|
||||||
<service id="1" type="service">
|
|
||||||
<location>
|
|
||||||
<id>js0</id>
|
|
||||||
<index>1</index>
|
|
||||||
</location>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">1</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<duration>600.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1800.0</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
<name>Test</name>
|
|
||||||
</service>
|
|
||||||
<service id="2" type="service">
|
|
||||||
<location>
|
|
||||||
<id>js2</id>
|
|
||||||
<index>2</index>
|
|
||||||
</location>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">2</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<duration>600.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>5400.0</start>
|
|
||||||
<end>7200.0</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
<name>Test</name>
|
|
||||||
</service>
|
|
||||||
<service id="3" type="service">
|
|
||||||
<location>
|
|
||||||
<id>js5</id>
|
|
||||||
<index>3</index>
|
|
||||||
</location>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">10</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<duration>1800.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>17100.0</start>
|
|
||||||
<end>18000.0</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
<name>Test</name>
|
|
||||||
</service>
|
|
||||||
<service id="4" type="service">
|
|
||||||
<location>
|
|
||||||
<id>js6</id>
|
|
||||||
<index>4</index>
|
|
||||||
</location>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">2</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<duration>900.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
<name>Test</name>
|
|
||||||
</service>
|
|
||||||
<service id="5" type="service">
|
|
||||||
<location>
|
|
||||||
<id>js8</id>
|
|
||||||
<index>5</index>
|
|
||||||
</location>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">4</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<duration>600.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
<name>Test</name>
|
|
||||||
</service>
|
|
||||||
<service id="6" type="service">
|
|
||||||
<location>
|
|
||||||
<id>js10</id>
|
|
||||||
<index>6</index>
|
|
||||||
</location>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">10</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<duration>1500.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>29700.0</start>
|
|
||||||
<end>32400.0</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
<name>Test</name>
|
|
||||||
</service>
|
|
||||||
<service id="7" type="service">
|
|
||||||
<location>
|
|
||||||
<id>jsp3</id>
|
|
||||||
<index>7</index>
|
|
||||||
</location>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">0</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<duration>5594.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
<name>Test</name>
|
|
||||||
</service>
|
|
||||||
</services>
|
|
||||||
<shipments>
|
|
||||||
<shipment id="shipment1">
|
|
||||||
<pickup>
|
|
||||||
<location>
|
|
||||||
<id>jsp1</id>
|
|
||||||
<index>1</index>
|
|
||||||
</location>
|
|
||||||
<duration>900.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<location>
|
|
||||||
<id>jsd1</id>
|
|
||||||
<index>8</index>
|
|
||||||
</location>
|
|
||||||
<duration>900.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">0</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<name>Test</name>
|
|
||||||
</shipment>
|
|
||||||
<shipment id="shipment2">
|
|
||||||
<pickup>
|
|
||||||
<location>
|
|
||||||
<id>jsp4</id>
|
|
||||||
<index>9</index>
|
|
||||||
</location>
|
|
||||||
<duration>1200.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>21600.0</start>
|
|
||||||
<end>23400.0</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<location>
|
|
||||||
<id>jsd4</id>
|
|
||||||
<index>8</index>
|
|
||||||
</location>
|
|
||||||
<duration>900.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>25200.0</start>
|
|
||||||
<end>27000.0</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">0</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<name>Test</name>
|
|
||||||
</shipment>
|
|
||||||
<shipment id="shipment3">
|
|
||||||
<pickup>
|
|
||||||
<location>
|
|
||||||
<id>jsp7</id>
|
|
||||||
<index>9</index>
|
|
||||||
</location>
|
|
||||||
<duration>1200.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>37800.0</start>
|
|
||||||
<end>41400.0</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<location>
|
|
||||||
<id>jsd7</id>
|
|
||||||
<index>8</index>
|
|
||||||
</location>
|
|
||||||
<duration>1800.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>43200.0</start>
|
|
||||||
<end>45900.0</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">0</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<name>Test</name>
|
|
||||||
</shipment>
|
|
||||||
<shipment id="shipment4">
|
|
||||||
<pickup>
|
|
||||||
<location>
|
|
||||||
<id>jsp9</id>
|
|
||||||
<index>10</index>
|
|
||||||
</location>
|
|
||||||
<duration>300.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>45000.0</start>
|
|
||||||
<end>48600.0</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</pickup>
|
|
||||||
<delivery>
|
|
||||||
<location>
|
|
||||||
<id>jsd9</id>
|
|
||||||
<index>8</index>
|
|
||||||
</location>
|
|
||||||
<duration>300.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>50400.0</start>
|
|
||||||
<end>52200.0</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</delivery>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">0</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<name>Test</name>
|
|
||||||
</shipment>
|
|
||||||
</shipments>
|
|
||||||
</problem>
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
||||||
{
|
|
||||||
"solution": {
|
|
||||||
"costs": 84.7213595499958,
|
|
||||||
"fixed_costs": 0.0,
|
|
||||||
"variable_costs": 84.7213595499958,
|
|
||||||
"distance": 84.7213595499958,
|
|
||||||
"time": 84.7213595499958,
|
|
||||||
"no_routes": 1,
|
|
||||||
"no_unassigned_jobs": 0,
|
|
||||||
"routes": [
|
|
||||||
{
|
|
||||||
"fixed_costs": 0.0,
|
|
||||||
"variable_costs": 84.7213595499958,
|
|
||||||
"no_activities": 1,
|
|
||||||
"start_time": 0.0,
|
|
||||||
"act": {
|
|
||||||
"type": "service",
|
|
||||||
"job_id": "s",
|
|
||||||
"arr_time": 44.721359549995796,
|
|
||||||
"end_time": 44.721359549995796
|
|
||||||
},
|
|
||||||
"end_time": 84.7213595499958
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"unassigned_jobs": []
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,106 +0,0 @@
|
||||||
{
|
|
||||||
"meta-info": {
|
|
||||||
"distance-unit": "m",
|
|
||||||
"time-unit": "sec"
|
|
||||||
},
|
|
||||||
"vrp": {
|
|
||||||
"fleet_size": "FINITE",
|
|
||||||
"vehicles": [
|
|
||||||
{
|
|
||||||
"id": "v1",
|
|
||||||
"start_address": {
|
|
||||||
"id": "startLoc",
|
|
||||||
"lon": 0.0,
|
|
||||||
"lat": 0.0
|
|
||||||
},
|
|
||||||
"return_to_depot": true,
|
|
||||||
"end_address": {
|
|
||||||
"id": "endLoc",
|
|
||||||
"lon": 12.0,
|
|
||||||
"lat": 13.0
|
|
||||||
},
|
|
||||||
"earliest_start": 0.0,
|
|
||||||
"latest_end": 1000.0,
|
|
||||||
"type_id": "small",
|
|
||||||
"skills": ["screw-driver"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "v2",
|
|
||||||
"start_address": {
|
|
||||||
"id": "startLoc",
|
|
||||||
"lon": 0.0,
|
|
||||||
"lat": 0.0
|
|
||||||
},
|
|
||||||
"return_to_depot": false,
|
|
||||||
"earliest_start": 0.0,
|
|
||||||
"latest_end": 1.7976931348623157E308,
|
|
||||||
"type_id": "medium",
|
|
||||||
"skills": ["joo"]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"vehicle_types": [
|
|
||||||
{
|
|
||||||
"id": "medium",
|
|
||||||
"capacity": [
|
|
||||||
1000,
|
|
||||||
4000
|
|
||||||
],
|
|
||||||
"fixed_costs": 1000.0,
|
|
||||||
"distance_dependent_costs": 1.0,
|
|
||||||
"time_dependent_costs": 200.0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "small",
|
|
||||||
"capacity": [
|
|
||||||
100,
|
|
||||||
400
|
|
||||||
],
|
|
||||||
"fixed_costs": 0.0,
|
|
||||||
"distance_dependent_costs": 1.0,
|
|
||||||
"time_dependent_costs": 20.0
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"services": [
|
|
||||||
{
|
|
||||||
"id": "s1",
|
|
||||||
"type": "service",
|
|
||||||
"name": "no-name",
|
|
||||||
"address": {
|
|
||||||
"id": "s1_loc",
|
|
||||||
"lon": 40.0,
|
|
||||||
"lat": 10.0
|
|
||||||
},
|
|
||||||
"service_duration": 1.0,
|
|
||||||
"time_window": {
|
|
||||||
"start": 0.0,
|
|
||||||
"end": 1.7976931348623157E308
|
|
||||||
},
|
|
||||||
"size": [
|
|
||||||
20,
|
|
||||||
40
|
|
||||||
],
|
|
||||||
"required_skills": ["joo-foo"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "pickup2",
|
|
||||||
"type": "pickup",
|
|
||||||
"name": "no-name",
|
|
||||||
"address": {
|
|
||||||
"id": "s2_loc",
|
|
||||||
"lon": 40.0,
|
|
||||||
"lat": 10.0
|
|
||||||
},
|
|
||||||
"service_duration": 2.0,
|
|
||||||
"time_window": {
|
|
||||||
"start": 10.0,
|
|
||||||
"end": 200.0
|
|
||||||
},
|
|
||||||
"size": [
|
|
||||||
10,
|
|
||||||
30
|
|
||||||
],
|
|
||||||
"required_skills": ["screw-driver"]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,653 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
~ Copyright (C) 2014 Stefan Schroeder
|
|
||||||
~
|
|
||||||
~ This library is free software; you can redistribute it and/or
|
|
||||||
~ modify it under the terms of the GNU Lesser General Public
|
|
||||||
~ License as published by the Free Software Foundation; either
|
|
||||||
~ version 3.0 of the License, or (at your option) any later version.
|
|
||||||
~
|
|
||||||
~ This library is distributed in the hope that it will be useful,
|
|
||||||
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
~ Lesser General Public License for more details.
|
|
||||||
~
|
|
||||||
~ You should have received a copy of the GNU Lesser General Public
|
|
||||||
~ License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
|
|
||||||
|
|
||||||
<problem xmlns="http://www.w3schools.com"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.w3schools.com vrp_xml_schema.xsd">
|
|
||||||
<problemType>
|
|
||||||
<fleetSize>INFINITE</fleetSize>
|
|
||||||
<fleetComposition>HOMOGENEOUS</fleetComposition>
|
|
||||||
</problemType>
|
|
||||||
<vehicles>
|
|
||||||
<vehicle>
|
|
||||||
<id>christophidesVehicle</id>
|
|
||||||
<typeId>christophidesType</typeId>
|
|
||||||
<location>
|
|
||||||
<id>[x=30.0][y=40.0]</id>
|
|
||||||
<coord x="30.0" y="40.0"/>
|
|
||||||
</location>
|
|
||||||
<timeSchedule>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>999999.0</end>
|
|
||||||
</timeSchedule>
|
|
||||||
</vehicle>
|
|
||||||
</vehicles>
|
|
||||||
<vehicleTypes>
|
|
||||||
<type>
|
|
||||||
<id>christophidesType</id>
|
|
||||||
<capacity>160</capacity>
|
|
||||||
<costs>
|
|
||||||
<fixed>0.0</fixed>
|
|
||||||
<distance>1.0</distance>
|
|
||||||
<time>0.0</time>
|
|
||||||
</costs>
|
|
||||||
</type>
|
|
||||||
</vehicleTypes>
|
|
||||||
<services>
|
|
||||||
<service id="35" type="delivery">
|
|
||||||
<locationId>[x=62.0][y=63.0]</locationId>
|
|
||||||
<coord x="62.0" y="63.0"/>
|
|
||||||
<capacity-demand>17</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="36" type="delivery">
|
|
||||||
<locationId>[x=63.0][y=69.0]</locationId>
|
|
||||||
<coord x="63.0" y="69.0"/>
|
|
||||||
<capacity-demand>6</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="33" type="delivery">
|
|
||||||
<locationId>[x=46.0][y=10.0]</locationId>
|
|
||||||
<coord x="46.0" y="10.0"/>
|
|
||||||
<capacity-demand>23</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="34" type="delivery">
|
|
||||||
<locationId>[x=61.0][y=33.0]</locationId>
|
|
||||||
<coord x="61.0" y="33.0"/>
|
|
||||||
<capacity-demand>26</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="39" type="delivery">
|
|
||||||
<locationId>[x=59.0][y=15.0]</locationId>
|
|
||||||
<coord x="59.0" y="15.0"/>
|
|
||||||
<capacity-demand>14</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="37" type="delivery">
|
|
||||||
<locationId>[x=32.0][y=22.0]</locationId>
|
|
||||||
<coord x="32.0" y="22.0"/>
|
|
||||||
<capacity-demand>9</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="38" type="delivery">
|
|
||||||
<locationId>[x=45.0][y=35.0]</locationId>
|
|
||||||
<coord x="45.0" y="35.0"/>
|
|
||||||
<capacity-demand>15</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="43" type="delivery">
|
|
||||||
<locationId>[x=5.0][y=64.0]</locationId>
|
|
||||||
<coord x="5.0" y="64.0"/>
|
|
||||||
<capacity-demand>11</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="42" type="delivery">
|
|
||||||
<locationId>[x=21.0][y=10.0]</locationId>
|
|
||||||
<coord x="21.0" y="10.0"/>
|
|
||||||
<capacity-demand>13</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="41" type="delivery">
|
|
||||||
<locationId>[x=10.0][y=17.0]</locationId>
|
|
||||||
<coord x="10.0" y="17.0"/>
|
|
||||||
<capacity-demand>27</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="40" type="delivery">
|
|
||||||
<locationId>[x=5.0][y=6.0]</locationId>
|
|
||||||
<coord x="5.0" y="6.0"/>
|
|
||||||
<capacity-demand>7</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="22" type="delivery">
|
|
||||||
<locationId>[x=42.0][y=57.0]</locationId>
|
|
||||||
<coord x="42.0" y="57.0"/>
|
|
||||||
<capacity-demand>8</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="23" type="delivery">
|
|
||||||
<locationId>[x=16.0][y=57.0]</locationId>
|
|
||||||
<coord x="16.0" y="57.0"/>
|
|
||||||
<capacity-demand>16</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="24" type="delivery">
|
|
||||||
<locationId>[x=8.0][y=52.0]</locationId>
|
|
||||||
<coord x="8.0" y="52.0"/>
|
|
||||||
<capacity-demand>10</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="25" type="delivery">
|
|
||||||
<locationId>[x=7.0][y=38.0]</locationId>
|
|
||||||
<coord x="7.0" y="38.0"/>
|
|
||||||
<capacity-demand>28</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="26" type="delivery">
|
|
||||||
<locationId>[x=27.0][y=68.0]</locationId>
|
|
||||||
<coord x="27.0" y="68.0"/>
|
|
||||||
<capacity-demand>7</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="27" type="delivery">
|
|
||||||
<locationId>[x=30.0][y=48.0]</locationId>
|
|
||||||
<coord x="30.0" y="48.0"/>
|
|
||||||
<capacity-demand>15</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="28" type="delivery">
|
|
||||||
<locationId>[x=43.0][y=67.0]</locationId>
|
|
||||||
<coord x="43.0" y="67.0"/>
|
|
||||||
<capacity-demand>14</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="29" type="delivery">
|
|
||||||
<locationId>[x=58.0][y=48.0]</locationId>
|
|
||||||
<coord x="58.0" y="48.0"/>
|
|
||||||
<capacity-demand>6</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="3" type="delivery">
|
|
||||||
<locationId>[x=52.0][y=64.0]</locationId>
|
|
||||||
<coord x="52.0" y="64.0"/>
|
|
||||||
<capacity-demand>16</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="2" type="delivery">
|
|
||||||
<locationId>[x=49.0][y=49.0]</locationId>
|
|
||||||
<coord x="49.0" y="49.0"/>
|
|
||||||
<capacity-demand>30</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="1" type="delivery">
|
|
||||||
<locationId>[x=37.0][y=52.0]</locationId>
|
|
||||||
<coord x="37.0" y="52.0"/>
|
|
||||||
<capacity-demand>7</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="7" type="delivery">
|
|
||||||
<locationId>[x=17.0][y=63.0]</locationId>
|
|
||||||
<coord x="17.0" y="63.0"/>
|
|
||||||
<capacity-demand>19</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="30" type="delivery">
|
|
||||||
<locationId>[x=58.0][y=27.0]</locationId>
|
|
||||||
<coord x="58.0" y="27.0"/>
|
|
||||||
<capacity-demand>19</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="6" type="delivery">
|
|
||||||
<locationId>[x=21.0][y=47.0]</locationId>
|
|
||||||
<coord x="21.0" y="47.0"/>
|
|
||||||
<capacity-demand>15</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="5" type="delivery">
|
|
||||||
<locationId>[x=40.0][y=30.0]</locationId>
|
|
||||||
<coord x="40.0" y="30.0"/>
|
|
||||||
<capacity-demand>21</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="32" type="delivery">
|
|
||||||
<locationId>[x=38.0][y=46.0]</locationId>
|
|
||||||
<coord x="38.0" y="46.0"/>
|
|
||||||
<capacity-demand>12</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="4" type="delivery">
|
|
||||||
<locationId>[x=20.0][y=26.0]</locationId>
|
|
||||||
<coord x="20.0" y="26.0"/>
|
|
||||||
<capacity-demand>9</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="31" type="delivery">
|
|
||||||
<locationId>[x=37.0][y=69.0]</locationId>
|
|
||||||
<coord x="37.0" y="69.0"/>
|
|
||||||
<capacity-demand>11</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="9" type="delivery">
|
|
||||||
<locationId>[x=52.0][y=33.0]</locationId>
|
|
||||||
<coord x="52.0" y="33.0"/>
|
|
||||||
<capacity-demand>11</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="8" type="delivery">
|
|
||||||
<locationId>[x=31.0][y=62.0]</locationId>
|
|
||||||
<coord x="31.0" y="62.0"/>
|
|
||||||
<capacity-demand>23</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="19" type="delivery">
|
|
||||||
<locationId>[x=13.0][y=13.0]</locationId>
|
|
||||||
<coord x="13.0" y="13.0"/>
|
|
||||||
<capacity-demand>9</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="17" type="delivery">
|
|
||||||
<locationId>[x=27.0][y=23.0]</locationId>
|
|
||||||
<coord x="27.0" y="23.0"/>
|
|
||||||
<capacity-demand>3</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="18" type="delivery">
|
|
||||||
<locationId>[x=17.0][y=33.0]</locationId>
|
|
||||||
<coord x="17.0" y="33.0"/>
|
|
||||||
<capacity-demand>41</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="15" type="delivery">
|
|
||||||
<locationId>[x=36.0][y=16.0]</locationId>
|
|
||||||
<coord x="36.0" y="16.0"/>
|
|
||||||
<capacity-demand>10</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="16" type="delivery">
|
|
||||||
<locationId>[x=52.0][y=41.0]</locationId>
|
|
||||||
<coord x="52.0" y="41.0"/>
|
|
||||||
<capacity-demand>15</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="13" type="delivery">
|
|
||||||
<locationId>[x=5.0][y=25.0]</locationId>
|
|
||||||
<coord x="5.0" y="25.0"/>
|
|
||||||
<capacity-demand>23</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="14" type="delivery">
|
|
||||||
<locationId>[x=12.0][y=42.0]</locationId>
|
|
||||||
<coord x="12.0" y="42.0"/>
|
|
||||||
<capacity-demand>21</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="11" type="delivery">
|
|
||||||
<locationId>[x=42.0][y=41.0]</locationId>
|
|
||||||
<coord x="42.0" y="41.0"/>
|
|
||||||
<capacity-demand>19</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="12" type="delivery">
|
|
||||||
<locationId>[x=31.0][y=32.0]</locationId>
|
|
||||||
<coord x="31.0" y="32.0"/>
|
|
||||||
<capacity-demand>29</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="21" type="delivery">
|
|
||||||
<locationId>[x=62.0][y=42.0]</locationId>
|
|
||||||
<coord x="62.0" y="42.0"/>
|
|
||||||
<capacity-demand>8</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="20" type="delivery">
|
|
||||||
<locationId>[x=57.0][y=58.0]</locationId>
|
|
||||||
<coord x="57.0" y="58.0"/>
|
|
||||||
<capacity-demand>28</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="49" type="delivery">
|
|
||||||
<locationId>[x=48.0][y=28.0]</locationId>
|
|
||||||
<coord x="48.0" y="28.0"/>
|
|
||||||
<capacity-demand>18</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="48" type="delivery">
|
|
||||||
<locationId>[x=25.0][y=55.0]</locationId>
|
|
||||||
<coord x="25.0" y="55.0"/>
|
|
||||||
<capacity-demand>17</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="45" type="delivery">
|
|
||||||
<locationId>[x=39.0][y=10.0]</locationId>
|
|
||||||
<coord x="39.0" y="10.0"/>
|
|
||||||
<capacity-demand>10</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="44" type="delivery">
|
|
||||||
<locationId>[x=30.0][y=15.0]</locationId>
|
|
||||||
<coord x="30.0" y="15.0"/>
|
|
||||||
<capacity-demand>16</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="47" type="delivery">
|
|
||||||
<locationId>[x=25.0][y=32.0]</locationId>
|
|
||||||
<coord x="25.0" y="32.0"/>
|
|
||||||
<capacity-demand>25</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="46" type="delivery">
|
|
||||||
<locationId>[x=32.0][y=39.0]</locationId>
|
|
||||||
<coord x="32.0" y="39.0"/>
|
|
||||||
<capacity-demand>5</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="10" type="delivery">
|
|
||||||
<locationId>[x=51.0][y=21.0]</locationId>
|
|
||||||
<coord x="51.0" y="21.0"/>
|
|
||||||
<capacity-demand>5</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="50" type="delivery">
|
|
||||||
<locationId>[x=56.0][y=37.0]</locationId>
|
|
||||||
<coord x="56.0" y="37.0"/>
|
|
||||||
<capacity-demand>10</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
</services>
|
|
||||||
</problem>
|
|
||||||
|
|
@ -1,653 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
~ Copyright (C) 2014 Stefan Schroeder
|
|
||||||
~
|
|
||||||
~ This library is free software; you can redistribute it and/or
|
|
||||||
~ modify it under the terms of the GNU Lesser General Public
|
|
||||||
~ License as published by the Free Software Foundation; either
|
|
||||||
~ version 3.0 of the License, or (at your option) any later version.
|
|
||||||
~
|
|
||||||
~ This library is distributed in the hope that it will be useful,
|
|
||||||
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
~ Lesser General Public License for more details.
|
|
||||||
~
|
|
||||||
~ You should have received a copy of the GNU Lesser General Public
|
|
||||||
~ License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
|
|
||||||
|
|
||||||
<problem xmlns="http://www.w3schools.com"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.w3schools.com vrp_xml_schema.xsd">
|
|
||||||
<problemType>
|
|
||||||
<fleetSize>INFINITE</fleetSize>
|
|
||||||
<fleetComposition>HOMOGENEOUS</fleetComposition>
|
|
||||||
</problemType>
|
|
||||||
<vehicles>
|
|
||||||
<vehicle>
|
|
||||||
<id>christophidesVehicle</id>
|
|
||||||
<typeId>christophidesType</typeId>
|
|
||||||
<location>
|
|
||||||
<id>[x=30.0][y=40.0]</id>
|
|
||||||
<coord x="30.0" y="40.0"/>
|
|
||||||
</location>
|
|
||||||
<timeSchedule>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>999999.0</end>
|
|
||||||
</timeSchedule>
|
|
||||||
</vehicle>
|
|
||||||
</vehicles>
|
|
||||||
<vehicleTypes>
|
|
||||||
<type>
|
|
||||||
<id>christophidesType</id>
|
|
||||||
<capacity>160</capacity>
|
|
||||||
<costs>
|
|
||||||
<fixed>0.0</fixed>
|
|
||||||
<distance>1.0</distance>
|
|
||||||
<time>0.0</time>
|
|
||||||
</costs>
|
|
||||||
</type>
|
|
||||||
</vehicleTypes>
|
|
||||||
<services>
|
|
||||||
<service id="35" type="pickup">
|
|
||||||
<locationId>[x=62.0][y=63.0]</locationId>
|
|
||||||
<coord x="62.0" y="63.0"/>
|
|
||||||
<capacity-demand>17</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="36" type="pickup">
|
|
||||||
<locationId>[x=63.0][y=69.0]</locationId>
|
|
||||||
<coord x="63.0" y="69.0"/>
|
|
||||||
<capacity-demand>6</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="33" type="pickup">
|
|
||||||
<locationId>[x=46.0][y=10.0]</locationId>
|
|
||||||
<coord x="46.0" y="10.0"/>
|
|
||||||
<capacity-demand>23</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="34" type="pickup">
|
|
||||||
<locationId>[x=61.0][y=33.0]</locationId>
|
|
||||||
<coord x="61.0" y="33.0"/>
|
|
||||||
<capacity-demand>26</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="39" type="pickup">
|
|
||||||
<locationId>[x=59.0][y=15.0]</locationId>
|
|
||||||
<coord x="59.0" y="15.0"/>
|
|
||||||
<capacity-demand>14</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="37" type="pickup">
|
|
||||||
<locationId>[x=32.0][y=22.0]</locationId>
|
|
||||||
<coord x="32.0" y="22.0"/>
|
|
||||||
<capacity-demand>9</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="38" type="pickup">
|
|
||||||
<locationId>[x=45.0][y=35.0]</locationId>
|
|
||||||
<coord x="45.0" y="35.0"/>
|
|
||||||
<capacity-demand>15</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="43" type="pickup">
|
|
||||||
<locationId>[x=5.0][y=64.0]</locationId>
|
|
||||||
<coord x="5.0" y="64.0"/>
|
|
||||||
<capacity-demand>11</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="42" type="pickup">
|
|
||||||
<locationId>[x=21.0][y=10.0]</locationId>
|
|
||||||
<coord x="21.0" y="10.0"/>
|
|
||||||
<capacity-demand>13</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="41" type="pickup">
|
|
||||||
<locationId>[x=10.0][y=17.0]</locationId>
|
|
||||||
<coord x="10.0" y="17.0"/>
|
|
||||||
<capacity-demand>27</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="40" type="pickup">
|
|
||||||
<locationId>[x=5.0][y=6.0]</locationId>
|
|
||||||
<coord x="5.0" y="6.0"/>
|
|
||||||
<capacity-demand>7</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="22" type="pickup">
|
|
||||||
<locationId>[x=42.0][y=57.0]</locationId>
|
|
||||||
<coord x="42.0" y="57.0"/>
|
|
||||||
<capacity-demand>8</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="23" type="pickup">
|
|
||||||
<locationId>[x=16.0][y=57.0]</locationId>
|
|
||||||
<coord x="16.0" y="57.0"/>
|
|
||||||
<capacity-demand>16</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="24" type="pickup">
|
|
||||||
<locationId>[x=8.0][y=52.0]</locationId>
|
|
||||||
<coord x="8.0" y="52.0"/>
|
|
||||||
<capacity-demand>10</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="25" type="pickup">
|
|
||||||
<locationId>[x=7.0][y=38.0]</locationId>
|
|
||||||
<coord x="7.0" y="38.0"/>
|
|
||||||
<capacity-demand>28</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="26" type="pickup">
|
|
||||||
<locationId>[x=27.0][y=68.0]</locationId>
|
|
||||||
<coord x="27.0" y="68.0"/>
|
|
||||||
<capacity-demand>7</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="27" type="pickup">
|
|
||||||
<locationId>[x=30.0][y=48.0]</locationId>
|
|
||||||
<coord x="30.0" y="48.0"/>
|
|
||||||
<capacity-demand>15</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="28" type="pickup">
|
|
||||||
<locationId>[x=43.0][y=67.0]</locationId>
|
|
||||||
<coord x="43.0" y="67.0"/>
|
|
||||||
<capacity-demand>14</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="29" type="pickup">
|
|
||||||
<locationId>[x=58.0][y=48.0]</locationId>
|
|
||||||
<coord x="58.0" y="48.0"/>
|
|
||||||
<capacity-demand>6</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="3" type="pickup">
|
|
||||||
<locationId>[x=52.0][y=64.0]</locationId>
|
|
||||||
<coord x="52.0" y="64.0"/>
|
|
||||||
<capacity-demand>16</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="2" type="pickup">
|
|
||||||
<locationId>[x=49.0][y=49.0]</locationId>
|
|
||||||
<coord x="49.0" y="49.0"/>
|
|
||||||
<capacity-demand>30</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="1" type="pickup">
|
|
||||||
<locationId>[x=37.0][y=52.0]</locationId>
|
|
||||||
<coord x="37.0" y="52.0"/>
|
|
||||||
<capacity-demand>7</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="7" type="pickup">
|
|
||||||
<locationId>[x=17.0][y=63.0]</locationId>
|
|
||||||
<coord x="17.0" y="63.0"/>
|
|
||||||
<capacity-demand>19</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="30" type="pickup">
|
|
||||||
<locationId>[x=58.0][y=27.0]</locationId>
|
|
||||||
<coord x="58.0" y="27.0"/>
|
|
||||||
<capacity-demand>19</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="6" type="pickup">
|
|
||||||
<locationId>[x=21.0][y=47.0]</locationId>
|
|
||||||
<coord x="21.0" y="47.0"/>
|
|
||||||
<capacity-demand>15</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="5" type="pickup">
|
|
||||||
<locationId>[x=40.0][y=30.0]</locationId>
|
|
||||||
<coord x="40.0" y="30.0"/>
|
|
||||||
<capacity-demand>21</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="32" type="pickup">
|
|
||||||
<locationId>[x=38.0][y=46.0]</locationId>
|
|
||||||
<coord x="38.0" y="46.0"/>
|
|
||||||
<capacity-demand>12</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="4" type="pickup">
|
|
||||||
<locationId>[x=20.0][y=26.0]</locationId>
|
|
||||||
<coord x="20.0" y="26.0"/>
|
|
||||||
<capacity-demand>9</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="31" type="pickup">
|
|
||||||
<locationId>[x=37.0][y=69.0]</locationId>
|
|
||||||
<coord x="37.0" y="69.0"/>
|
|
||||||
<capacity-demand>11</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="9" type="pickup">
|
|
||||||
<locationId>[x=52.0][y=33.0]</locationId>
|
|
||||||
<coord x="52.0" y="33.0"/>
|
|
||||||
<capacity-demand>11</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="8" type="pickup">
|
|
||||||
<locationId>[x=31.0][y=62.0]</locationId>
|
|
||||||
<coord x="31.0" y="62.0"/>
|
|
||||||
<capacity-demand>23</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="19" type="pickup">
|
|
||||||
<locationId>[x=13.0][y=13.0]</locationId>
|
|
||||||
<coord x="13.0" y="13.0"/>
|
|
||||||
<capacity-demand>9</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="17" type="pickup">
|
|
||||||
<locationId>[x=27.0][y=23.0]</locationId>
|
|
||||||
<coord x="27.0" y="23.0"/>
|
|
||||||
<capacity-demand>3</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="18" type="pickup">
|
|
||||||
<locationId>[x=17.0][y=33.0]</locationId>
|
|
||||||
<coord x="17.0" y="33.0"/>
|
|
||||||
<capacity-demand>41</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="15" type="pickup">
|
|
||||||
<locationId>[x=36.0][y=16.0]</locationId>
|
|
||||||
<coord x="36.0" y="16.0"/>
|
|
||||||
<capacity-demand>10</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="16" type="pickup">
|
|
||||||
<locationId>[x=52.0][y=41.0]</locationId>
|
|
||||||
<coord x="52.0" y="41.0"/>
|
|
||||||
<capacity-demand>15</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="13" type="pickup">
|
|
||||||
<locationId>[x=5.0][y=25.0]</locationId>
|
|
||||||
<coord x="5.0" y="25.0"/>
|
|
||||||
<capacity-demand>23</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="14" type="pickup">
|
|
||||||
<locationId>[x=12.0][y=42.0]</locationId>
|
|
||||||
<coord x="12.0" y="42.0"/>
|
|
||||||
<capacity-demand>21</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="11" type="pickup">
|
|
||||||
<locationId>[x=42.0][y=41.0]</locationId>
|
|
||||||
<coord x="42.0" y="41.0"/>
|
|
||||||
<capacity-demand>19</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="12" type="pickup">
|
|
||||||
<locationId>[x=31.0][y=32.0]</locationId>
|
|
||||||
<coord x="31.0" y="32.0"/>
|
|
||||||
<capacity-demand>29</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="21" type="pickup">
|
|
||||||
<locationId>[x=62.0][y=42.0]</locationId>
|
|
||||||
<coord x="62.0" y="42.0"/>
|
|
||||||
<capacity-demand>8</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="20" type="pickup">
|
|
||||||
<locationId>[x=57.0][y=58.0]</locationId>
|
|
||||||
<coord x="57.0" y="58.0"/>
|
|
||||||
<capacity-demand>28</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="49" type="pickup">
|
|
||||||
<locationId>[x=48.0][y=28.0]</locationId>
|
|
||||||
<coord x="48.0" y="28.0"/>
|
|
||||||
<capacity-demand>18</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="48" type="pickup">
|
|
||||||
<locationId>[x=25.0][y=55.0]</locationId>
|
|
||||||
<coord x="25.0" y="55.0"/>
|
|
||||||
<capacity-demand>17</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="45" type="pickup">
|
|
||||||
<locationId>[x=39.0][y=10.0]</locationId>
|
|
||||||
<coord x="39.0" y="10.0"/>
|
|
||||||
<capacity-demand>10</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="44" type="pickup">
|
|
||||||
<locationId>[x=30.0][y=15.0]</locationId>
|
|
||||||
<coord x="30.0" y="15.0"/>
|
|
||||||
<capacity-demand>16</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="47" type="pickup">
|
|
||||||
<locationId>[x=25.0][y=32.0]</locationId>
|
|
||||||
<coord x="25.0" y="32.0"/>
|
|
||||||
<capacity-demand>25</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="46" type="pickup">
|
|
||||||
<locationId>[x=32.0][y=39.0]</locationId>
|
|
||||||
<coord x="32.0" y="39.0"/>
|
|
||||||
<capacity-demand>5</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="10" type="pickup">
|
|
||||||
<locationId>[x=51.0][y=21.0]</locationId>
|
|
||||||
<coord x="51.0" y="21.0"/>
|
|
||||||
<capacity-demand>5</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="50" type="pickup">
|
|
||||||
<locationId>[x=56.0][y=37.0]</locationId>
|
|
||||||
<coord x="56.0" y="37.0"/>
|
|
||||||
<capacity-demand>10</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
</services>
|
|
||||||
</problem>
|
|
||||||
|
|
@ -1,636 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<problem xmlns="http://www.w3schools.com"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.w3schools.com vrp_xml_schema.xsd">
|
|
||||||
<problemType>
|
|
||||||
<fleetSize>INFINITE</fleetSize>
|
|
||||||
<fleetComposition>HOMOGENEOUS</fleetComposition>
|
|
||||||
</problemType>
|
|
||||||
<vehicles>
|
|
||||||
<vehicle>
|
|
||||||
<id>christophidesVehicle</id>
|
|
||||||
<typeId>christophidesType</typeId>
|
|
||||||
<location>
|
|
||||||
<id>[x=30.0][y=40.0]</id>
|
|
||||||
<coord x="30.0" y="40.0"/>
|
|
||||||
</location>
|
|
||||||
<timeSchedule>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>999999.0</end>
|
|
||||||
</timeSchedule>
|
|
||||||
</vehicle>
|
|
||||||
</vehicles>
|
|
||||||
<vehicleTypes>
|
|
||||||
<type>
|
|
||||||
<id>christophidesType</id>
|
|
||||||
<capacity>160</capacity>
|
|
||||||
<costs>
|
|
||||||
<fixed>0.0</fixed>
|
|
||||||
<distance>1.0</distance>
|
|
||||||
<time>0.0</time>
|
|
||||||
</costs>
|
|
||||||
</type>
|
|
||||||
</vehicleTypes>
|
|
||||||
<services>
|
|
||||||
<service id="35" type="service">
|
|
||||||
<locationId>[x=62.0][y=63.0]</locationId>
|
|
||||||
<coord x="62.0" y="63.0"/>
|
|
||||||
<capacity-demand>17</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="36" type="service">
|
|
||||||
<locationId>[x=63.0][y=69.0]</locationId>
|
|
||||||
<coord x="63.0" y="69.0"/>
|
|
||||||
<capacity-demand>6</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="33" type="service">
|
|
||||||
<locationId>[x=46.0][y=10.0]</locationId>
|
|
||||||
<coord x="46.0" y="10.0"/>
|
|
||||||
<capacity-demand>23</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="34" type="service">
|
|
||||||
<locationId>[x=61.0][y=33.0]</locationId>
|
|
||||||
<coord x="61.0" y="33.0"/>
|
|
||||||
<capacity-demand>26</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="39" type="service">
|
|
||||||
<locationId>[x=59.0][y=15.0]</locationId>
|
|
||||||
<coord x="59.0" y="15.0"/>
|
|
||||||
<capacity-demand>14</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="37" type="service">
|
|
||||||
<locationId>[x=32.0][y=22.0]</locationId>
|
|
||||||
<coord x="32.0" y="22.0"/>
|
|
||||||
<capacity-demand>9</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="38" type="service">
|
|
||||||
<locationId>[x=45.0][y=35.0]</locationId>
|
|
||||||
<coord x="45.0" y="35.0"/>
|
|
||||||
<capacity-demand>15</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="43" type="service">
|
|
||||||
<locationId>[x=5.0][y=64.0]</locationId>
|
|
||||||
<coord x="5.0" y="64.0"/>
|
|
||||||
<capacity-demand>11</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="42" type="service">
|
|
||||||
<locationId>[x=21.0][y=10.0]</locationId>
|
|
||||||
<coord x="21.0" y="10.0"/>
|
|
||||||
<capacity-demand>13</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="41" type="service">
|
|
||||||
<locationId>[x=10.0][y=17.0]</locationId>
|
|
||||||
<coord x="10.0" y="17.0"/>
|
|
||||||
<capacity-demand>27</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="40" type="service">
|
|
||||||
<locationId>[x=5.0][y=6.0]</locationId>
|
|
||||||
<coord x="5.0" y="6.0"/>
|
|
||||||
<capacity-demand>7</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="22" type="service">
|
|
||||||
<locationId>[x=42.0][y=57.0]</locationId>
|
|
||||||
<coord x="42.0" y="57.0"/>
|
|
||||||
<capacity-demand>8</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="23" type="service">
|
|
||||||
<locationId>[x=16.0][y=57.0]</locationId>
|
|
||||||
<coord x="16.0" y="57.0"/>
|
|
||||||
<capacity-demand>16</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="24" type="service">
|
|
||||||
<locationId>[x=8.0][y=52.0]</locationId>
|
|
||||||
<coord x="8.0" y="52.0"/>
|
|
||||||
<capacity-demand>10</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="25" type="service">
|
|
||||||
<locationId>[x=7.0][y=38.0]</locationId>
|
|
||||||
<coord x="7.0" y="38.0"/>
|
|
||||||
<capacity-demand>28</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="26" type="service">
|
|
||||||
<locationId>[x=27.0][y=68.0]</locationId>
|
|
||||||
<coord x="27.0" y="68.0"/>
|
|
||||||
<capacity-demand>7</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="27" type="service">
|
|
||||||
<locationId>[x=30.0][y=48.0]</locationId>
|
|
||||||
<coord x="30.0" y="48.0"/>
|
|
||||||
<capacity-demand>15</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="28" type="service">
|
|
||||||
<locationId>[x=43.0][y=67.0]</locationId>
|
|
||||||
<coord x="43.0" y="67.0"/>
|
|
||||||
<capacity-demand>14</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="29" type="service">
|
|
||||||
<locationId>[x=58.0][y=48.0]</locationId>
|
|
||||||
<coord x="58.0" y="48.0"/>
|
|
||||||
<capacity-demand>6</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="3" type="service">
|
|
||||||
<locationId>[x=52.0][y=64.0]</locationId>
|
|
||||||
<coord x="52.0" y="64.0"/>
|
|
||||||
<capacity-demand>16</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="2" type="service">
|
|
||||||
<locationId>[x=49.0][y=49.0]</locationId>
|
|
||||||
<coord x="49.0" y="49.0"/>
|
|
||||||
<capacity-demand>30</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="1" type="service">
|
|
||||||
<locationId>[x=37.0][y=52.0]</locationId>
|
|
||||||
<coord x="37.0" y="52.0"/>
|
|
||||||
<capacity-demand>7</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="7" type="service">
|
|
||||||
<locationId>[x=17.0][y=63.0]</locationId>
|
|
||||||
<coord x="17.0" y="63.0"/>
|
|
||||||
<capacity-demand>19</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="30" type="service">
|
|
||||||
<locationId>[x=58.0][y=27.0]</locationId>
|
|
||||||
<coord x="58.0" y="27.0"/>
|
|
||||||
<capacity-demand>19</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="6" type="service">
|
|
||||||
<locationId>[x=21.0][y=47.0]</locationId>
|
|
||||||
<coord x="21.0" y="47.0"/>
|
|
||||||
<capacity-demand>15</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="5" type="service">
|
|
||||||
<locationId>[x=40.0][y=30.0]</locationId>
|
|
||||||
<coord x="40.0" y="30.0"/>
|
|
||||||
<capacity-demand>21</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="32" type="service">
|
|
||||||
<locationId>[x=38.0][y=46.0]</locationId>
|
|
||||||
<coord x="38.0" y="46.0"/>
|
|
||||||
<capacity-demand>12</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="4" type="service">
|
|
||||||
<locationId>[x=20.0][y=26.0]</locationId>
|
|
||||||
<coord x="20.0" y="26.0"/>
|
|
||||||
<capacity-demand>9</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="31" type="service">
|
|
||||||
<locationId>[x=37.0][y=69.0]</locationId>
|
|
||||||
<coord x="37.0" y="69.0"/>
|
|
||||||
<capacity-demand>11</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="9" type="service">
|
|
||||||
<locationId>[x=52.0][y=33.0]</locationId>
|
|
||||||
<coord x="52.0" y="33.0"/>
|
|
||||||
<capacity-demand>11</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="8" type="service">
|
|
||||||
<locationId>[x=31.0][y=62.0]</locationId>
|
|
||||||
<coord x="31.0" y="62.0"/>
|
|
||||||
<capacity-demand>23</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="19" type="service">
|
|
||||||
<locationId>[x=13.0][y=13.0]</locationId>
|
|
||||||
<coord x="13.0" y="13.0"/>
|
|
||||||
<capacity-demand>9</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="17" type="service">
|
|
||||||
<locationId>[x=27.0][y=23.0]</locationId>
|
|
||||||
<coord x="27.0" y="23.0"/>
|
|
||||||
<capacity-demand>3</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="18" type="service">
|
|
||||||
<locationId>[x=17.0][y=33.0]</locationId>
|
|
||||||
<coord x="17.0" y="33.0"/>
|
|
||||||
<capacity-demand>41</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="15" type="service">
|
|
||||||
<locationId>[x=36.0][y=16.0]</locationId>
|
|
||||||
<coord x="36.0" y="16.0"/>
|
|
||||||
<capacity-demand>10</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="16" type="service">
|
|
||||||
<locationId>[x=52.0][y=41.0]</locationId>
|
|
||||||
<coord x="52.0" y="41.0"/>
|
|
||||||
<capacity-demand>15</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="13" type="service">
|
|
||||||
<locationId>[x=5.0][y=25.0]</locationId>
|
|
||||||
<coord x="5.0" y="25.0"/>
|
|
||||||
<capacity-demand>23</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="14" type="service">
|
|
||||||
<locationId>[x=12.0][y=42.0]</locationId>
|
|
||||||
<coord x="12.0" y="42.0"/>
|
|
||||||
<capacity-demand>21</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="11" type="service">
|
|
||||||
<locationId>[x=42.0][y=41.0]</locationId>
|
|
||||||
<coord x="42.0" y="41.0"/>
|
|
||||||
<capacity-demand>19</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="12" type="service">
|
|
||||||
<locationId>[x=31.0][y=32.0]</locationId>
|
|
||||||
<coord x="31.0" y="32.0"/>
|
|
||||||
<capacity-demand>29</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="21" type="service">
|
|
||||||
<locationId>[x=62.0][y=42.0]</locationId>
|
|
||||||
<coord x="62.0" y="42.0"/>
|
|
||||||
<capacity-demand>8</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="20" type="service">
|
|
||||||
<locationId>[x=57.0][y=58.0]</locationId>
|
|
||||||
<coord x="57.0" y="58.0"/>
|
|
||||||
<capacity-demand>28</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="49" type="service">
|
|
||||||
<locationId>[x=48.0][y=28.0]</locationId>
|
|
||||||
<coord x="48.0" y="28.0"/>
|
|
||||||
<capacity-demand>18</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="48" type="service">
|
|
||||||
<locationId>[x=25.0][y=55.0]</locationId>
|
|
||||||
<coord x="25.0" y="55.0"/>
|
|
||||||
<capacity-demand>17</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="45" type="service">
|
|
||||||
<locationId>[x=39.0][y=10.0]</locationId>
|
|
||||||
<coord x="39.0" y="10.0"/>
|
|
||||||
<capacity-demand>10</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="44" type="service">
|
|
||||||
<locationId>[x=30.0][y=15.0]</locationId>
|
|
||||||
<coord x="30.0" y="15.0"/>
|
|
||||||
<capacity-demand>16</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="47" type="service">
|
|
||||||
<locationId>[x=25.0][y=32.0]</locationId>
|
|
||||||
<coord x="25.0" y="32.0"/>
|
|
||||||
<capacity-demand>25</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="46" type="service">
|
|
||||||
<locationId>[x=32.0][y=39.0]</locationId>
|
|
||||||
<coord x="32.0" y="39.0"/>
|
|
||||||
<capacity-demand>5</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="10" type="service">
|
|
||||||
<locationId>[x=51.0][y=21.0]</locationId>
|
|
||||||
<coord x="51.0" y="21.0"/>
|
|
||||||
<capacity-demand>5</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="50" type="service">
|
|
||||||
<locationId>[x=56.0][y=37.0]</locationId>
|
|
||||||
<coord x="56.0" y="37.0"/>
|
|
||||||
<capacity-demand>10</capacity-demand>
|
|
||||||
<duration>0.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
</services>
|
|
||||||
</problem>
|
|
||||||
|
|
@ -57,6 +57,12 @@
|
||||||
<version>${project.version}</version>
|
<version>${project.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>${project.groupId}</groupId>
|
||||||
|
<artifactId>jsprit-io</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.logging.log4j</groupId>
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
<artifactId>log4j-slf4j-impl</artifactId>
|
<artifactId>log4j-slf4j-impl</artifactId>
|
||||||
|
|
|
||||||
|
|
@ -20,14 +20,12 @@ package com.graphhopper.jsprit.examples;
|
||||||
|
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithmBuilder;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.StateId;
|
import com.graphhopper.jsprit.core.algorithm.state.StateId;
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.StateUpdater;
|
import com.graphhopper.jsprit.core.algorithm.state.StateUpdater;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.HardActivityConstraint;
|
import com.graphhopper.jsprit.core.problem.constraint.HardActivityConstraint;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLReader;
|
|
||||||
import com.graphhopper.jsprit.core.problem.misc.JobInsertionContext;
|
import com.graphhopper.jsprit.core.problem.misc.JobInsertionContext;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute;
|
import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute;
|
||||||
|
|
@ -38,6 +36,8 @@ import com.graphhopper.jsprit.core.util.Coordinate;
|
||||||
import com.graphhopper.jsprit.core.util.EuclideanDistanceCalculator;
|
import com.graphhopper.jsprit.core.util.EuclideanDistanceCalculator;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
import com.graphhopper.jsprit.core.util.VehicleRoutingTransportCostsMatrix;
|
import com.graphhopper.jsprit.core.util.VehicleRoutingTransportCostsMatrix;
|
||||||
|
import com.graphhopper.jsprit.io.algorithm.VehicleRoutingAlgorithmBuilder;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLReader;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,6 @@ import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer.Label;
|
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer.Label;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithmBuilder;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.StateId;
|
import com.graphhopper.jsprit.core.algorithm.state.StateId;
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.StateUpdater;
|
import com.graphhopper.jsprit.core.algorithm.state.StateUpdater;
|
||||||
|
|
@ -51,6 +50,7 @@ import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
import com.graphhopper.jsprit.core.util.Coordinate;
|
import com.graphhopper.jsprit.core.util.Coordinate;
|
||||||
import com.graphhopper.jsprit.core.util.CrowFlyCosts;
|
import com.graphhopper.jsprit.core.util.CrowFlyCosts;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
|
import com.graphhopper.jsprit.io.algorithm.VehicleRoutingAlgorithmBuilder;
|
||||||
import com.graphhopper.jsprit.util.Examples;
|
import com.graphhopper.jsprit.util.Examples;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
|
|
|
||||||
|
|
@ -18,11 +18,8 @@ package com.graphhopper.jsprit.examples;
|
||||||
|
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.AlgorithmConfig;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
|
||||||
import com.graphhopper.jsprit.core.problem.Location;
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLWriter;
|
|
||||||
import com.graphhopper.jsprit.core.problem.job.Service;
|
import com.graphhopper.jsprit.core.problem.job.Service;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
||||||
|
|
@ -31,6 +28,9 @@ import com.graphhopper.jsprit.core.problem.vehicle.VehicleType;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
|
import com.graphhopper.jsprit.io.algorithm.AlgorithmConfig;
|
||||||
|
import com.graphhopper.jsprit.io.algorithm.VehicleRoutingAlgorithms;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLWriter;
|
||||||
import com.graphhopper.jsprit.util.Examples;
|
import com.graphhopper.jsprit.util.Examples;
|
||||||
import org.apache.commons.configuration.XMLConfiguration;
|
import org.apache.commons.configuration.XMLConfiguration;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,11 +20,10 @@ import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer.Label;
|
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer.Label;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
||||||
import com.graphhopper.jsprit.core.problem.Location;
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem.FleetSize;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem.FleetSize;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLWriter;
|
|
||||||
import com.graphhopper.jsprit.core.problem.job.Shipment;
|
import com.graphhopper.jsprit.core.problem.job.Shipment;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
||||||
|
|
@ -34,6 +33,7 @@ import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
import com.graphhopper.jsprit.core.util.Coordinate;
|
import com.graphhopper.jsprit.core.util.Coordinate;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLWriter;
|
||||||
import com.graphhopper.jsprit.util.Examples;
|
import com.graphhopper.jsprit.util.Examples;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
@ -123,7 +123,7 @@ public class EnRoutePickupAndDeliveryWithMultipleDepotsAndOpenRoutesExample {
|
||||||
/*
|
/*
|
||||||
* get the algorithm out-of-the-box.
|
* get the algorithm out-of-the-box.
|
||||||
*/
|
*/
|
||||||
VehicleRoutingAlgorithm algorithm = VehicleRoutingAlgorithms.readAndCreateAlgorithm(problem, "input/algorithmConfig.xml");
|
VehicleRoutingAlgorithm algorithm = Jsprit.createAlgorithm(problem);
|
||||||
// algorithm.setMaxIterations(30000);
|
// algorithm.setMaxIterations(30000);
|
||||||
/*
|
/*
|
||||||
* and search a solution
|
* and search a solution
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ package com.graphhopper.jsprit.examples;
|
||||||
|
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer;
|
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
||||||
import com.graphhopper.jsprit.core.problem.Location;
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem.FleetSize;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem.FleetSize;
|
||||||
|
|
@ -117,7 +117,7 @@ public class HVRPExample {
|
||||||
//build problem
|
//build problem
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
VehicleRoutingProblem vrp = vrpBuilder.build();
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "input/algorithmConfigWithSchrimpfAcceptance.xml");
|
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
|
|
||||||
VehicleRoutingProblemSolution best = Solutions.bestOf(solutions);
|
VehicleRoutingProblemSolution best = Solutions.bestOf(solutions);
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,6 @@ package com.graphhopper.jsprit.examples;
|
||||||
|
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer;
|
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithmBuilder;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.StateId;
|
import com.graphhopper.jsprit.core.algorithm.state.StateId;
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.StateUpdater;
|
import com.graphhopper.jsprit.core.algorithm.state.StateUpdater;
|
||||||
|
|
@ -38,6 +37,7 @@ import com.graphhopper.jsprit.core.problem.solution.route.activity.TourActivity;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
|
import com.graphhopper.jsprit.io.algorithm.VehicleRoutingAlgorithmBuilder;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,13 +26,13 @@ import com.graphhopper.jsprit.core.algorithm.listener.VehicleRoutingAlgorithmLis
|
||||||
import com.graphhopper.jsprit.core.problem.Location;
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem.FleetSize;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem.FleetSize;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLReader;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
import com.graphhopper.jsprit.core.util.Coordinate;
|
import com.graphhopper.jsprit.core.util.Coordinate;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLReader;
|
||||||
import com.graphhopper.jsprit.util.Examples;
|
import com.graphhopper.jsprit.util.Examples;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
|
||||||
|
|
@ -19,10 +19,9 @@ package com.graphhopper.jsprit.examples;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.Plotter.Label;
|
import com.graphhopper.jsprit.analysis.toolbox.Plotter.Label;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem.Builder;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem.Builder;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLReader;
|
|
||||||
import com.graphhopper.jsprit.core.problem.job.Job;
|
import com.graphhopper.jsprit.core.problem.job.Job;
|
||||||
import com.graphhopper.jsprit.core.problem.job.Service;
|
import com.graphhopper.jsprit.core.problem.job.Service;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
|
|
@ -30,6 +29,7 @@ import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.Vehicle;
|
import com.graphhopper.jsprit.core.problem.vehicle.Vehicle;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLReader;
|
||||||
import com.graphhopper.jsprit.util.Examples;
|
import com.graphhopper.jsprit.util.Examples;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
@ -79,7 +79,7 @@ public class MultipleDepotWithInitialRoutesExample {
|
||||||
// VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp)
|
// VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp)
|
||||||
// .setProperty(Jsprit.Parameter.ITERATIONS,"10000").buildAlgorithm();
|
// .setProperty(Jsprit.Parameter.ITERATIONS,"10000").buildAlgorithm();
|
||||||
|
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "input/algorithmConfig_noVehicleSwitch.xml");
|
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||||
|
|
||||||
SolutionPrinter.print(Solutions.bestOf(solutions));
|
SolutionPrinter.print(Solutions.bestOf(solutions));
|
||||||
|
|
|
||||||
|
|
@ -20,16 +20,16 @@ import com.graphhopper.jsprit.analysis.toolbox.AlgorithmSearchProgressChartListe
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.Plotter.Label;
|
import com.graphhopper.jsprit.analysis.toolbox.Plotter.Label;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
||||||
import com.graphhopper.jsprit.core.algorithm.selector.SelectBest;
|
import com.graphhopper.jsprit.core.algorithm.selector.SelectBest;
|
||||||
import com.graphhopper.jsprit.core.analysis.SolutionAnalyser;
|
import com.graphhopper.jsprit.core.analysis.SolutionAnalyser;
|
||||||
import com.graphhopper.jsprit.core.problem.Location;
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.cost.TransportDistance;
|
import com.graphhopper.jsprit.core.problem.cost.TransportDistance;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLReader;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.Vehicle;
|
import com.graphhopper.jsprit.core.problem.vehicle.Vehicle;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLReader;
|
||||||
import com.graphhopper.jsprit.util.Examples;
|
import com.graphhopper.jsprit.util.Examples;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
@ -71,7 +71,7 @@ public class PickupAndDeliveryExample {
|
||||||
* The algorithm can be defined and configured in an xml-file.
|
* The algorithm can be defined and configured in an xml-file.
|
||||||
*/
|
*/
|
||||||
// VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
// VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "input/algorithmConfig_solomon.xml");
|
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
||||||
vra.getAlgorithmListeners().addListener(new AlgorithmSearchProgressChartListener("output/sol_progress.png"));
|
vra.getAlgorithmListeners().addListener(new AlgorithmSearchProgressChartListener("output/sol_progress.png"));
|
||||||
/*
|
/*
|
||||||
* Solve the problem.
|
* Solve the problem.
|
||||||
|
|
|
||||||
|
|
@ -21,12 +21,12 @@ import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.Plotter.Label;
|
import com.graphhopper.jsprit.analysis.toolbox.Plotter.Label;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
||||||
import com.graphhopper.jsprit.core.algorithm.selector.SelectBest;
|
import com.graphhopper.jsprit.core.algorithm.selector.SelectBest;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLReader;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLReader;
|
||||||
import com.graphhopper.jsprit.util.Examples;
|
import com.graphhopper.jsprit.util.Examples;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
@ -67,8 +67,8 @@ public class PickupAndDeliveryExample2 {
|
||||||
*
|
*
|
||||||
* The algorithm can be defined and configured in an xml-file.
|
* The algorithm can be defined and configured in an xml-file.
|
||||||
*/
|
*/
|
||||||
// VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "input/algorithmConfig_solomon.xml");
|
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
||||||
vra.getAlgorithmListeners().addListener(new AlgorithmSearchProgressChartListener("output/sol_progress.png"));
|
vra.getAlgorithmListeners().addListener(new AlgorithmSearchProgressChartListener("output/sol_progress.png"));
|
||||||
/*
|
/*
|
||||||
* Solve the problem.
|
* Solve the problem.
|
||||||
|
|
|
||||||
|
|
@ -20,12 +20,12 @@ import com.graphhopper.jsprit.analysis.toolbox.AlgorithmSearchProgressChartListe
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.Plotter.Label;
|
import com.graphhopper.jsprit.analysis.toolbox.Plotter.Label;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
||||||
import com.graphhopper.jsprit.core.algorithm.selector.SelectBest;
|
import com.graphhopper.jsprit.core.algorithm.selector.SelectBest;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLReader;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLReader;
|
||||||
import com.graphhopper.jsprit.util.Examples;
|
import com.graphhopper.jsprit.util.Examples;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
@ -65,8 +65,8 @@ public class PickupAndDeliveryOpenExample {
|
||||||
*
|
*
|
||||||
* The algorithm can be defined and configured in an xml-file.
|
* The algorithm can be defined and configured in an xml-file.
|
||||||
*/
|
*/
|
||||||
// VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "input/algorithmConfig_open.xml");
|
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
||||||
vra.getAlgorithmListeners().addListener(new AlgorithmSearchProgressChartListener("output/sol_progress.png"));
|
vra.getAlgorithmListeners().addListener(new AlgorithmSearchProgressChartListener("output/sol_progress.png"));
|
||||||
/*
|
/*
|
||||||
* Solve the problem.
|
* Solve the problem.
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,6 @@ import com.graphhopper.jsprit.core.algorithm.termination.IterationWithoutImprove
|
||||||
import com.graphhopper.jsprit.core.problem.Location;
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem.FleetSize;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem.FleetSize;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLWriter;
|
|
||||||
import com.graphhopper.jsprit.core.problem.job.Service;
|
import com.graphhopper.jsprit.core.problem.job.Service;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
||||||
|
|
@ -31,6 +30,7 @@ import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
import com.graphhopper.jsprit.core.util.VehicleRoutingTransportCostsMatrix;
|
import com.graphhopper.jsprit.core.util.VehicleRoutingTransportCostsMatrix;
|
||||||
import com.graphhopper.jsprit.core.util.VehicleRoutingTransportCostsMatrix.Builder;
|
import com.graphhopper.jsprit.core.util.VehicleRoutingTransportCostsMatrix.Builder;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLWriter;
|
||||||
import com.graphhopper.jsprit.util.Examples;
|
import com.graphhopper.jsprit.util.Examples;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,6 @@ import com.graphhopper.jsprit.core.algorithm.termination.IterationWithoutImprove
|
||||||
import com.graphhopper.jsprit.core.problem.Location;
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem.FleetSize;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem.FleetSize;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLWriter;
|
|
||||||
import com.graphhopper.jsprit.core.problem.job.Service;
|
import com.graphhopper.jsprit.core.problem.job.Service;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
||||||
|
|
@ -30,6 +29,7 @@ import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
import com.graphhopper.jsprit.core.util.FastVehicleRoutingTransportCostsMatrix;
|
import com.graphhopper.jsprit.core.util.FastVehicleRoutingTransportCostsMatrix;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLWriter;
|
||||||
import com.graphhopper.jsprit.util.Examples;
|
import com.graphhopper.jsprit.util.Examples;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
|
|
|
||||||
|
|
@ -20,10 +20,9 @@ import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer.Label;
|
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer.Label;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
||||||
import com.graphhopper.jsprit.core.problem.Location;
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLWriter;
|
|
||||||
import com.graphhopper.jsprit.core.problem.job.Service;
|
import com.graphhopper.jsprit.core.problem.job.Service;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
||||||
|
|
@ -32,6 +31,7 @@ import com.graphhopper.jsprit.core.problem.vehicle.VehicleType;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLWriter;
|
||||||
import com.graphhopper.jsprit.util.Examples;
|
import com.graphhopper.jsprit.util.Examples;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
@ -100,7 +100,7 @@ public class ServicePickupsWithMultipleDepotsExample {
|
||||||
/*
|
/*
|
||||||
* get the algorithm out-of-the-box.
|
* get the algorithm out-of-the-box.
|
||||||
*/
|
*/
|
||||||
VehicleRoutingAlgorithm algorithm = VehicleRoutingAlgorithms.readAndCreateAlgorithm(problem, "input/algorithmConfig.xml");
|
VehicleRoutingAlgorithm algorithm = Jsprit.createAlgorithm(problem);
|
||||||
algorithm.setMaxIterations(10);
|
algorithm.setMaxIterations(10);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,6 @@ import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.box.SchrimpfFactory;
|
import com.graphhopper.jsprit.core.algorithm.box.SchrimpfFactory;
|
||||||
import com.graphhopper.jsprit.core.problem.Location;
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLWriter;
|
|
||||||
import com.graphhopper.jsprit.core.problem.job.Delivery;
|
import com.graphhopper.jsprit.core.problem.job.Delivery;
|
||||||
import com.graphhopper.jsprit.core.problem.job.Pickup;
|
import com.graphhopper.jsprit.core.problem.job.Pickup;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
|
|
@ -32,6 +31,7 @@ import com.graphhopper.jsprit.core.problem.vehicle.VehicleType;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLWriter;
|
||||||
import com.graphhopper.jsprit.util.Examples;
|
import com.graphhopper.jsprit.util.Examples;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,6 @@ import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.box.SchrimpfFactory;
|
import com.graphhopper.jsprit.core.algorithm.box.SchrimpfFactory;
|
||||||
import com.graphhopper.jsprit.core.problem.Location;
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLWriter;
|
|
||||||
import com.graphhopper.jsprit.core.problem.job.Shipment;
|
import com.graphhopper.jsprit.core.problem.job.Shipment;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
||||||
|
|
@ -32,6 +31,7 @@ import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
import com.graphhopper.jsprit.core.util.Coordinate;
|
import com.graphhopper.jsprit.core.util.Coordinate;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLWriter;
|
||||||
import com.graphhopper.jsprit.util.Examples;
|
import com.graphhopper.jsprit.util.Examples;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,6 @@ import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.box.SchrimpfFactory;
|
import com.graphhopper.jsprit.core.algorithm.box.SchrimpfFactory;
|
||||||
import com.graphhopper.jsprit.core.problem.Location;
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLWriter;
|
|
||||||
import com.graphhopper.jsprit.core.problem.job.Shipment;
|
import com.graphhopper.jsprit.core.problem.job.Shipment;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
||||||
|
|
@ -32,6 +31,7 @@ import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
import com.graphhopper.jsprit.core.util.Coordinate;
|
import com.graphhopper.jsprit.core.util.Coordinate;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLWriter;
|
||||||
import com.graphhopper.jsprit.util.Examples;
|
import com.graphhopper.jsprit.util.Examples;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
|
||||||
|
|
@ -18,13 +18,11 @@ package com.graphhopper.jsprit.examples;
|
||||||
|
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithmBuilder;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
||||||
import com.graphhopper.jsprit.core.problem.Location;
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.ServiceDeliveriesFirstConstraint;
|
import com.graphhopper.jsprit.core.problem.constraint.ServiceDeliveriesFirstConstraint;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLWriter;
|
|
||||||
import com.graphhopper.jsprit.core.problem.job.Delivery;
|
import com.graphhopper.jsprit.core.problem.job.Delivery;
|
||||||
import com.graphhopper.jsprit.core.problem.job.Shipment;
|
import com.graphhopper.jsprit.core.problem.job.Shipment;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
|
|
@ -35,6 +33,8 @@ import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
import com.graphhopper.jsprit.core.util.Coordinate;
|
import com.graphhopper.jsprit.core.util.Coordinate;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
|
import com.graphhopper.jsprit.io.algorithm.VehicleRoutingAlgorithmBuilder;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLWriter;
|
||||||
import com.graphhopper.jsprit.util.Examples;
|
import com.graphhopper.jsprit.util.Examples;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,6 @@ import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.box.SchrimpfFactory;
|
import com.graphhopper.jsprit.core.algorithm.box.SchrimpfFactory;
|
||||||
import com.graphhopper.jsprit.core.problem.Location;
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLWriter;
|
|
||||||
import com.graphhopper.jsprit.core.problem.job.Service;
|
import com.graphhopper.jsprit.core.problem.job.Service;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
||||||
|
|
@ -31,6 +30,7 @@ import com.graphhopper.jsprit.core.problem.vehicle.VehicleType;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLWriter;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
|
||||||
|
|
@ -18,10 +18,9 @@ package com.graphhopper.jsprit.examples;
|
||||||
|
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
||||||
import com.graphhopper.jsprit.core.problem.Location;
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLWriter;
|
|
||||||
import com.graphhopper.jsprit.core.problem.job.Service;
|
import com.graphhopper.jsprit.core.problem.job.Service;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
||||||
|
|
@ -30,6 +29,7 @@ import com.graphhopper.jsprit.core.problem.vehicle.VehicleType;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLWriter;
|
||||||
import com.graphhopper.jsprit.util.Examples;
|
import com.graphhopper.jsprit.util.Examples;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
@ -79,7 +79,7 @@ public class SimpleExampleOpenRoutes {
|
||||||
/*
|
/*
|
||||||
* get the algorithm out-of-the-box.
|
* get the algorithm out-of-the-box.
|
||||||
*/
|
*/
|
||||||
VehicleRoutingAlgorithm algorithm = VehicleRoutingAlgorithms.readAndCreateAlgorithm(problem, "input/algorithmConfig_fix.xml");
|
VehicleRoutingAlgorithm algorithm = Jsprit.createAlgorithm(problem);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* and search a solution
|
* and search a solution
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,6 @@ import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
||||||
import com.graphhopper.jsprit.core.problem.Location;
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLWriter;
|
|
||||||
import com.graphhopper.jsprit.core.problem.job.Service;
|
import com.graphhopper.jsprit.core.problem.job.Service;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
||||||
|
|
@ -31,6 +30,7 @@ import com.graphhopper.jsprit.core.problem.vehicle.VehicleType;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLWriter;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
|
||||||
|
|
@ -19,12 +19,10 @@ package com.graphhopper.jsprit.examples;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer;
|
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer.Label;
|
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer.Label;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithmBuilder;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
||||||
import com.graphhopper.jsprit.core.problem.Location;
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLWriter;
|
|
||||||
import com.graphhopper.jsprit.core.problem.job.Service;
|
import com.graphhopper.jsprit.core.problem.job.Service;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
||||||
|
|
@ -33,6 +31,8 @@ import com.graphhopper.jsprit.core.problem.vehicle.VehicleType;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
|
import com.graphhopper.jsprit.io.algorithm.VehicleRoutingAlgorithmBuilder;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLWriter;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
|
||||||
|
|
@ -19,13 +19,11 @@ package com.graphhopper.jsprit.examples;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.Plotter.Label;
|
import com.graphhopper.jsprit.analysis.toolbox.Plotter.Label;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithmBuilder;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
||||||
import com.graphhopper.jsprit.core.problem.Location;
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.ServiceDeliveriesFirstConstraint;
|
import com.graphhopper.jsprit.core.problem.constraint.ServiceDeliveriesFirstConstraint;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLWriter;
|
|
||||||
import com.graphhopper.jsprit.core.problem.job.Delivery;
|
import com.graphhopper.jsprit.core.problem.job.Delivery;
|
||||||
import com.graphhopper.jsprit.core.problem.job.Pickup;
|
import com.graphhopper.jsprit.core.problem.job.Pickup;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
|
|
@ -35,6 +33,8 @@ import com.graphhopper.jsprit.core.problem.vehicle.VehicleType;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
|
import com.graphhopper.jsprit.io.algorithm.VehicleRoutingAlgorithmBuilder;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLWriter;
|
||||||
import com.graphhopper.jsprit.util.Examples;
|
import com.graphhopper.jsprit.util.Examples;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
|
||||||
|
|
@ -21,12 +21,12 @@ import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer.Label;
|
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer.Label;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
||||||
import com.graphhopper.jsprit.core.algorithm.selector.SelectBest;
|
import com.graphhopper.jsprit.core.algorithm.selector.SelectBest;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLReader;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLReader;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
@ -72,7 +72,7 @@ public class SolomonExampleWithSpecifiedVehicleEndLocations {
|
||||||
* The algorithm can be defined and configured in an xml-file.
|
* The algorithm can be defined and configured in an xml-file.
|
||||||
*/
|
*/
|
||||||
// VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
// VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "input/algorithmConfig_fix.xml");
|
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
||||||
vra.setMaxIterations(20000);
|
vra.setMaxIterations(20000);
|
||||||
// vra.setPrematureBreak(100);
|
// vra.setPrematureBreak(100);
|
||||||
vra.getAlgorithmListeners().addListener(new AlgorithmSearchProgressChartListener("output/sol_progress.png"));
|
vra.getAlgorithmListeners().addListener(new AlgorithmSearchProgressChartListener("output/sol_progress.png"));
|
||||||
|
|
|
||||||
|
|
@ -20,12 +20,12 @@ import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer.Label;
|
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer.Label;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
||||||
import com.graphhopper.jsprit.core.algorithm.selector.SelectBest;
|
import com.graphhopper.jsprit.core.algorithm.selector.SelectBest;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLReader;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLReader;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
@ -72,7 +72,7 @@ public class SolomonExampleWithSpecifiedVehicleEndLocationsWithoutTWs {
|
||||||
* The algorithm can be defined and configured in an xml-file.
|
* The algorithm can be defined and configured in an xml-file.
|
||||||
*/
|
*/
|
||||||
// VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
// VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "input/algorithmConfigWithSchrimpfAcceptance.xml");
|
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
||||||
vra.setMaxIterations(20000);
|
vra.setMaxIterations(20000);
|
||||||
// vra.setPrematureBreak(100);
|
// vra.setPrematureBreak(100);
|
||||||
// vra.getAlgorithmListeners().addListener(new AlgorithmSearchProgressChartListener("output/sol_progress.png"));
|
// vra.getAlgorithmListeners().addListener(new AlgorithmSearchProgressChartListener("output/sol_progress.png"));
|
||||||
|
|
|
||||||
|
|
@ -22,9 +22,9 @@ import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
||||||
import com.graphhopper.jsprit.core.algorithm.selector.SelectBest;
|
import com.graphhopper.jsprit.core.algorithm.selector.SelectBest;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLReader;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLReader;
|
||||||
import com.graphhopper.jsprit.util.Examples;
|
import com.graphhopper.jsprit.util.Examples;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
|
||||||
|
|
@ -19,12 +19,12 @@ package com.graphhopper.jsprit.examples;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.AlgorithmSearchProgressChartListener;
|
import com.graphhopper.jsprit.analysis.toolbox.AlgorithmSearchProgressChartListener;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer;
|
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
||||||
import com.graphhopper.jsprit.core.algorithm.selector.SelectBest;
|
import com.graphhopper.jsprit.core.algorithm.selector.SelectBest;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLReader;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLReader;
|
||||||
import com.graphhopper.jsprit.util.Examples;
|
import com.graphhopper.jsprit.util.Examples;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
@ -64,7 +64,7 @@ public class SolomonR101Example {
|
||||||
* The algorithm can be defined and configured in an xml-file.
|
* The algorithm can be defined and configured in an xml-file.
|
||||||
*/
|
*/
|
||||||
// VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
// VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "input/algorithmConfig.xml");
|
VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp);
|
||||||
vra.setMaxIterations(20000);
|
vra.setMaxIterations(20000);
|
||||||
// vra.setPrematureBreak(100);
|
// vra.setPrematureBreak(100);
|
||||||
vra.getAlgorithmListeners().addListener(new AlgorithmSearchProgressChartListener("output/sol_progress.png"));
|
vra.getAlgorithmListeners().addListener(new AlgorithmSearchProgressChartListener("output/sol_progress.png"));
|
||||||
|
|
|
||||||
|
|
@ -1,110 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2014 Stefan Schroeder
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 3.0 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
******************************************************************************/
|
|
||||||
package com.graphhopper.jsprit.examples;
|
|
||||||
|
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.AlgorithmEventsRecorder;
|
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.AlgorithmEventsViewer;
|
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer;
|
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer.Label;
|
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.selector.SelectBest;
|
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
|
||||||
import com.graphhopper.jsprit.instance.reader.SolomonReader;
|
|
||||||
import com.graphhopper.jsprit.util.Examples;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
|
|
||||||
public class SolomonWithRegretInsertionExample {
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
/*
|
|
||||||
* some preparation - create output folder
|
|
||||||
*/
|
|
||||||
Examples.createOutputFolder();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Build the problem.
|
|
||||||
*
|
|
||||||
* But define a problem-builder first.
|
|
||||||
*/
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* A solomonReader reads solomon-instance files, and stores the required information in the builder.
|
|
||||||
*/
|
|
||||||
new SolomonReader(vrpBuilder).read("input/C101_solomon.txt");
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Finally, the problem can be built. By default, transportCosts are crowFlyDistances (as usually used for vrp-instances).
|
|
||||||
*/
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
|
|
||||||
new Plotter(vrp).plot("output/solomon_C101.png", "C101");
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Define the required vehicle-routing algorithms to solve the above problem.
|
|
||||||
*
|
|
||||||
* The algorithm can be defined and configured in an xml-file.
|
|
||||||
*/
|
|
||||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "input/algorithmConfig_greedyWithRegret.xml");
|
|
||||||
vra.setMaxIterations(2);
|
|
||||||
|
|
||||||
AlgorithmEventsRecorder eventsRecorder = new AlgorithmEventsRecorder(vrp, "output/events.dgs.gz");
|
|
||||||
eventsRecorder.setRecordingRange(0, 50);
|
|
||||||
vra.addListener(eventsRecorder);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Solve the problem.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Retrieve best solution.
|
|
||||||
*/
|
|
||||||
VehicleRoutingProblemSolution solution = new SelectBest().selectSolution(solutions);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* print solution
|
|
||||||
*/
|
|
||||||
SolutionPrinter.print(vrp, solution, SolutionPrinter.Print.VERBOSE);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Plot solution.
|
|
||||||
*/
|
|
||||||
Plotter plotter = new Plotter(vrp, solution);
|
|
||||||
// plotter.setBoundingBox(30, 0, 50, 20);
|
|
||||||
plotter.plot("output/solomon_C101_solution.png", "C101");
|
|
||||||
|
|
||||||
new GraphStreamViewer(vrp, solution).labelWith(Label.ID).setRenderDelay(100).display();
|
|
||||||
|
|
||||||
AlgorithmEventsViewer viewer = new AlgorithmEventsViewer();
|
|
||||||
viewer.setRuinDelay(16);
|
|
||||||
viewer.setRecreationDelay(8);
|
|
||||||
viewer.display("output/events.dgs.gz");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -20,13 +20,11 @@ package com.graphhopper.jsprit.examples;
|
||||||
|
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithmBuilder;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
||||||
import com.graphhopper.jsprit.core.problem.Location;
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLWriter;
|
|
||||||
import com.graphhopper.jsprit.core.problem.job.Job;
|
import com.graphhopper.jsprit.core.problem.job.Job;
|
||||||
import com.graphhopper.jsprit.core.problem.job.Service;
|
import com.graphhopper.jsprit.core.problem.job.Service;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
|
|
@ -36,6 +34,8 @@ import com.graphhopper.jsprit.core.problem.vehicle.VehicleType;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
import com.graphhopper.jsprit.instance.reader.SolomonReader;
|
import com.graphhopper.jsprit.instance.reader.SolomonReader;
|
||||||
|
import com.graphhopper.jsprit.io.algorithm.VehicleRoutingAlgorithmBuilder;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLWriter;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,6 @@ import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer.Label;
|
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer.Label;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
import com.graphhopper.jsprit.analysis.toolbox.Plotter;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithmBuilder;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
||||||
import com.graphhopper.jsprit.core.algorithm.termination.IterationWithoutImprovementTermination;
|
import com.graphhopper.jsprit.core.algorithm.termination.IterationWithoutImprovementTermination;
|
||||||
import com.graphhopper.jsprit.core.problem.Location;
|
import com.graphhopper.jsprit.core.problem.Location;
|
||||||
|
|
@ -38,6 +37,7 @@ import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
import com.graphhopper.jsprit.core.util.Coordinate;
|
import com.graphhopper.jsprit.core.util.Coordinate;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
|
import com.graphhopper.jsprit.io.algorithm.VehicleRoutingAlgorithmBuilder;
|
||||||
import com.graphhopper.jsprit.util.Examples;
|
import com.graphhopper.jsprit.util.Examples;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
|
||||||
|
|
@ -19,15 +19,15 @@ package com.graphhopper.jsprit.examples;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.AlgorithmSearchProgressChartListener;
|
import com.graphhopper.jsprit.analysis.toolbox.AlgorithmSearchProgressChartListener;
|
||||||
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer;
|
import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
|
||||||
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithmBuilder;
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.selector.SelectBest;
|
import com.graphhopper.jsprit.core.algorithm.selector.SelectBest;
|
||||||
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.ServiceDeliveriesFirstConstraint;
|
import com.graphhopper.jsprit.core.problem.constraint.ServiceDeliveriesFirstConstraint;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLReader;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
|
import com.graphhopper.jsprit.io.algorithm.VehicleRoutingAlgorithmBuilder;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLReader;
|
||||||
import com.graphhopper.jsprit.util.Examples;
|
import com.graphhopper.jsprit.util.Examples;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
|
||||||
|
|
@ -29,12 +29,12 @@ import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.ServiceDeliveriesFirstConstraint;
|
import com.graphhopper.jsprit.core.problem.constraint.ServiceDeliveriesFirstConstraint;
|
||||||
import com.graphhopper.jsprit.core.problem.cost.TransportDistance;
|
import com.graphhopper.jsprit.core.problem.cost.TransportDistance;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLReader;
|
|
||||||
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute;
|
import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.route.activity.TourActivity;
|
import com.graphhopper.jsprit.core.problem.solution.route.activity.TourActivity;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.Vehicle;
|
import com.graphhopper.jsprit.core.problem.vehicle.Vehicle;
|
||||||
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
import com.graphhopper.jsprit.core.reporting.SolutionPrinter;
|
||||||
|
import com.graphhopper.jsprit.io.problem.VrpXMLReader;
|
||||||
import com.graphhopper.jsprit.util.Examples;
|
import com.graphhopper.jsprit.util.Examples;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,6 @@ import com.graphhopper.jsprit.core.problem.Location;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem.Builder;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem.Builder;
|
||||||
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem.FleetSize;
|
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem.FleetSize;
|
||||||
import com.graphhopper.jsprit.core.problem.io.VrpXMLWriter;
|
|
||||||
import com.graphhopper.jsprit.core.problem.job.Service;
|
import com.graphhopper.jsprit.core.problem.job.Service;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
|
||||||
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
|
||||||
|
|
@ -162,12 +161,6 @@ public class VrphGoldenReader {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
|
||||||
VrphGoldenReader goldenReader = new VrphGoldenReader(vrpBuilder, VrphType.FSMD);
|
|
||||||
goldenReader.read("instances/vrph/orig/cn_13mix.txt");
|
|
||||||
VehicleRoutingProblem vrp = vrpBuilder.build();
|
|
||||||
new VrpXMLWriter(vrp).write("instances/vrph/cn_13mix_VRPH_INFINITE.xml");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
18
jsprit-io/.gitignore
vendored
Normal file
18
jsprit-io/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
/bin
|
||||||
|
/target
|
||||||
|
/output
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# IntelliJ
|
||||||
|
*.ipr
|
||||||
|
*.iws
|
||||||
|
*.iml
|
||||||
|
.idea
|
||||||
|
|
||||||
|
# Eclipse
|
||||||
|
.project
|
||||||
|
.classpath
|
||||||
|
.settings
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
40
jsprit-io/pom.xml
Normal file
40
jsprit-io/pom.xml
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<parent>
|
||||||
|
<artifactId>jsprit</artifactId>
|
||||||
|
<groupId>jsprit</groupId>
|
||||||
|
<version>1.6.3-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>jsprit-io</artifactId>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>${project.groupId}</groupId>
|
||||||
|
<artifactId>jsprit-core</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
<type>jar</type>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-configuration</groupId>
|
||||||
|
<artifactId>commons-configuration</artifactId>
|
||||||
|
<version>1.9</version>
|
||||||
|
<type>jar</type>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>xerces</groupId>
|
||||||
|
<artifactId>xercesImpl</artifactId>
|
||||||
|
<version>2.11.0</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue