mirror of
https://github.com/graphhopper/jsprit.git
synced 2020-01-24 07:45:05 +01:00
add TSPLIB95Reader and Geoffrey's roaddistances matrix reader
This commit is contained in:
parent
995d982f04
commit
0179a00e0b
2 changed files with 216 additions and 0 deletions
|
|
@ -0,0 +1,136 @@
|
|||
/*******************************************************************************
|
||||
* 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 jsprit.instance.reader;
|
||||
|
||||
import jsprit.core.problem.VehicleRoutingProblem;
|
||||
import jsprit.core.problem.job.Service;
|
||||
import jsprit.core.problem.vehicle.VehicleImpl;
|
||||
import jsprit.core.problem.vehicle.VehicleTypeImpl;
|
||||
import jsprit.core.util.Coordinate;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
public class TSPLIB95Reader {
|
||||
|
||||
private VehicleRoutingProblem.Builder vrpBuilder;
|
||||
|
||||
public TSPLIB95Reader(VehicleRoutingProblem.Builder vrpBuilder) {
|
||||
this.vrpBuilder = vrpBuilder;
|
||||
}
|
||||
|
||||
public void read(String filename){
|
||||
BufferedReader reader = getBufferedReader(filename);
|
||||
String line;
|
||||
Coordinate[] coords = null;
|
||||
Integer[] demands = null;
|
||||
Integer capacity = null;
|
||||
List<Integer> depotIds = new ArrayList<Integer>();
|
||||
boolean isCoordSection = false;
|
||||
boolean isDemandSection = false;
|
||||
boolean isDepotSection = false;
|
||||
while( ( line = getLine(reader) ) != null ){
|
||||
if(line.startsWith("DIMENSION")){
|
||||
String[] tokens = line.split(":");
|
||||
String dim = tokens[1].trim();
|
||||
coords = new Coordinate[Integer.parseInt(dim)];
|
||||
demands = new Integer[Integer.parseInt(dim)];
|
||||
continue;
|
||||
}
|
||||
if(line.startsWith("CAPACITY")){
|
||||
String[] tokens = line.split(":");
|
||||
capacity = Integer.parseInt(tokens[1].trim());
|
||||
continue;
|
||||
}
|
||||
if(line.startsWith("NODE_COORD_SECTION")){
|
||||
isCoordSection = true;
|
||||
isDemandSection = false;
|
||||
isDepotSection = false;
|
||||
continue;
|
||||
}
|
||||
if(line.startsWith("DEMAND_SECTION")){
|
||||
isDemandSection = true;
|
||||
isCoordSection = false;
|
||||
isDepotSection = false;
|
||||
continue;
|
||||
}
|
||||
if(line.startsWith("DEPOT_SECTION")){
|
||||
isDepotSection = true;
|
||||
isDemandSection = false;
|
||||
isCoordSection = false;
|
||||
continue;
|
||||
}
|
||||
if(isCoordSection){
|
||||
if(coords == null) throw new IllegalStateException("DIMENSION tag missing");
|
||||
String[] tokens = line.split("\\s+");
|
||||
coords[Integer.parseInt(tokens[0]) - 1] = Coordinate.newInstance(Double.parseDouble(tokens[1]), Double.parseDouble(tokens[2]));
|
||||
continue;
|
||||
}
|
||||
if(isDemandSection){
|
||||
if(demands == null) throw new IllegalStateException("DIMENSION tag missing");
|
||||
String[] tokens = line.split("\\s+");
|
||||
demands[Integer.parseInt(tokens[0]) - 1] = Integer.parseInt(tokens[1]);
|
||||
continue;
|
||||
}
|
||||
if(isDepotSection){
|
||||
if(line.equals("-1")){
|
||||
isDepotSection = false;
|
||||
}
|
||||
else{
|
||||
depotIds.add(Integer.parseInt(line));
|
||||
}
|
||||
}
|
||||
}
|
||||
vrpBuilder.setFleetSize(VehicleRoutingProblem.FleetSize.INFINITE);
|
||||
for(Integer depotId : depotIds){
|
||||
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("typeId").addCapacityDimension(0,capacity).build();
|
||||
VehicleImpl vehicle = VehicleImpl.Builder.newInstance("vehicle").setStartLocationId(depotId.toString())
|
||||
.setStartLocationCoordinate(coords[depotId - 1]).setType(type).build();
|
||||
vrpBuilder.addVehicle(vehicle);
|
||||
}
|
||||
for(int i=0;i<demands.length;i++){
|
||||
if(demands[i] == 0) continue;
|
||||
String id = "" + (i+1);
|
||||
Service service = Service.Builder.newInstance(id).setLocationId(id).setCoord(coords[i]).addSizeDimension(0,demands[i]).build();
|
||||
vrpBuilder.addJob(service);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private String getLine(BufferedReader reader) {
|
||||
String s = null;
|
||||
try {
|
||||
s = reader.readLine();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
private BufferedReader getBufferedReader(String filename) {
|
||||
BufferedReader bufferedReader = null;
|
||||
try {
|
||||
bufferedReader = new BufferedReader(new FileReader(new File(filename)));
|
||||
} catch (FileNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return bufferedReader;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue