1
0
Fork 0
mirror of https://github.com/graphhopper/jsprit.git synced 2020-01-24 07:45:05 +01:00

avoid returning always the same vehicle by randomizing type container

This commit is contained in:
oblonski 2015-11-04 21:54:37 +01:00
parent 6e6218812e
commit b86bdc5c8a
3 changed files with 36 additions and 4 deletions

View file

@ -313,7 +313,11 @@ public class Jsprit {
VehicleFleetManager fm; VehicleFleetManager fm;
if (vrp.getFleetSize().equals(VehicleRoutingProblem.FleetSize.INFINITE)) { if (vrp.getFleetSize().equals(VehicleRoutingProblem.FleetSize.INFINITE)) {
fm = new InfiniteFleetManagerFactory(vrp.getVehicles()).createFleetManager(); fm = new InfiniteFleetManagerFactory(vrp.getVehicles()).createFleetManager();
} else fm = new FiniteFleetManagerFactory(vrp.getVehicles()).createFleetManager(); } else {
FiniteFleetManagerFactory finiteFleetManagerFactory = new FiniteFleetManagerFactory(vrp.getVehicles());
finiteFleetManagerFactory.setRandom(random);
fm = finiteFleetManagerFactory.createFleetManager();
}
if (stateManager == null) { if (stateManager == null) {
stateManager = new StateManager(vrp); stateManager = new StateManager(vrp);

View file

@ -16,7 +16,10 @@
******************************************************************************/ ******************************************************************************/
package jsprit.core.problem.vehicle; package jsprit.core.problem.vehicle;
import jsprit.core.util.RandomNumberGeneration;
import java.util.Collection; import java.util.Collection;
import java.util.Random;
/** /**
* Factory that creates a finite fleetmanager. * Factory that creates a finite fleetmanager.
@ -27,6 +30,8 @@ public class FiniteFleetManagerFactory implements VehicleFleetManagerFactory {
private Collection<Vehicle> vehicles; private Collection<Vehicle> vehicles;
private Random random = RandomNumberGeneration.getRandom();
/** /**
* Constucts the factory. * Constucts the factory.
* *
@ -37,6 +42,10 @@ public class FiniteFleetManagerFactory implements VehicleFleetManagerFactory {
this.vehicles = vehicles; this.vehicles = vehicles;
} }
public void setRandom(Random random) {
this.random = random;
}
/** /**
* Creates the finite fleetmanager. * Creates the finite fleetmanager.
* *
@ -47,7 +56,9 @@ public class FiniteFleetManagerFactory implements VehicleFleetManagerFactory {
public VehicleFleetManager createFleetManager() { public VehicleFleetManager createFleetManager() {
if (vehicles == null) throw new IllegalStateException("vehicles is null. this must not be."); if (vehicles == null) throw new IllegalStateException("vehicles is null. this must not be.");
if (vehicles.isEmpty()) throw new IllegalStateException("vehicle-collection is empty. this must not be"); if (vehicles.isEmpty()) throw new IllegalStateException("vehicle-collection is empty. this must not be");
return new VehicleFleetManagerImpl(vehicles); VehicleFleetManagerImpl vehicleFleetManager = new VehicleFleetManagerImpl(vehicles);
vehicleFleetManager.setRandom(random);
return vehicleFleetManager;
} }
} }

View file

@ -17,12 +17,14 @@
package jsprit.core.problem.vehicle; package jsprit.core.problem.vehicle;
import jsprit.core.problem.vehicle.VehicleImpl.NoVehicle; import jsprit.core.problem.vehicle.VehicleImpl.NoVehicle;
import jsprit.core.util.RandomNumberGeneration;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Random;
class VehicleFleetManagerImpl implements VehicleFleetManager { class VehicleFleetManagerImpl implements VehicleFleetManager {
@ -35,11 +37,17 @@ class VehicleFleetManagerImpl implements VehicleFleetManager {
private ArrayList<Vehicle> vehicleList; private ArrayList<Vehicle> vehicleList;
private Random random = RandomNumberGeneration.getRandom();
public TypeContainer() { public TypeContainer() {
super(); super();
vehicleList = new ArrayList<Vehicle>(); vehicleList = new ArrayList<Vehicle>();
} }
public void setRandom(Random random) {
this.random = random;
}
void add(Vehicle vehicle) { void add(Vehicle vehicle) {
if (vehicleList.contains(vehicle)) { if (vehicleList.contains(vehicle)) {
throw new IllegalStateException("cannot add vehicle twice " + vehicle.getId()); throw new IllegalStateException("cannot add vehicle twice " + vehicle.getId());
@ -52,7 +60,8 @@ class VehicleFleetManagerImpl implements VehicleFleetManager {
} }
public Vehicle getVehicle() { public Vehicle getVehicle() {
return vehicleList.get(vehicleList.size()-1); int randomIndex = random.nextInt(vehicleList.size());
return vehicleList.get(randomIndex);
} }
public boolean isEmpty() { public boolean isEmpty() {
@ -71,6 +80,8 @@ class VehicleFleetManagerImpl implements VehicleFleetManager {
private Vehicle[] vehicleArr; private Vehicle[] vehicleArr;
private Random random = RandomNumberGeneration.getRandom();
public VehicleFleetManagerImpl(Collection<Vehicle> vehicles) { public VehicleFleetManagerImpl(Collection<Vehicle> vehicles) {
super(); super();
this.vehicles = vehicles; this.vehicles = vehicles;
@ -81,6 +92,10 @@ class VehicleFleetManagerImpl implements VehicleFleetManager {
logger.debug("initialise {}",this); logger.debug("initialise {}",this);
} }
public void setRandom(Random random) {
this.random = random;
}
@Override @Override
public String toString() { public String toString() {
return "[name=finiteVehicles]"; return "[name=finiteVehicles]";
@ -95,7 +110,9 @@ class VehicleFleetManagerImpl implements VehicleFleetManager {
} }
vehicleTypes = new TypeContainer[maxTypeIndex+1]; vehicleTypes = new TypeContainer[maxTypeIndex+1];
for(int i=0;i< vehicleTypes.length;i++){ for(int i=0;i< vehicleTypes.length;i++){
vehicleTypes[i] = new TypeContainer(); TypeContainer typeContainer = new TypeContainer();
typeContainer.setRandom(random);
vehicleTypes[i] = typeContainer;
} }
for (Vehicle v : vehicles) { for (Vehicle v : vehicles) {
vehicleArr[v.getIndex()]=v; vehicleArr[v.getIndex()]=v;