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;
if (vrp.getFleetSize().equals(VehicleRoutingProblem.FleetSize.INFINITE)) {
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) {
stateManager = new StateManager(vrp);

View file

@ -16,7 +16,10 @@
******************************************************************************/
package jsprit.core.problem.vehicle;
import jsprit.core.util.RandomNumberGeneration;
import java.util.Collection;
import java.util.Random;
/**
* Factory that creates a finite fleetmanager.
@ -27,6 +30,8 @@ public class FiniteFleetManagerFactory implements VehicleFleetManagerFactory {
private Collection<Vehicle> vehicles;
private Random random = RandomNumberGeneration.getRandom();
/**
* Constucts the factory.
*
@ -37,6 +42,10 @@ public class FiniteFleetManagerFactory implements VehicleFleetManagerFactory {
this.vehicles = vehicles;
}
public void setRandom(Random random) {
this.random = random;
}
/**
* Creates the finite fleetmanager.
*
@ -47,7 +56,9 @@ public class FiniteFleetManagerFactory implements VehicleFleetManagerFactory {
public VehicleFleetManager createFleetManager() {
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");
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;
import jsprit.core.problem.vehicle.VehicleImpl.NoVehicle;
import jsprit.core.util.RandomNumberGeneration;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Random;
class VehicleFleetManagerImpl implements VehicleFleetManager {
@ -35,11 +37,17 @@ class VehicleFleetManagerImpl implements VehicleFleetManager {
private ArrayList<Vehicle> vehicleList;
private Random random = RandomNumberGeneration.getRandom();
public TypeContainer() {
super();
vehicleList = new ArrayList<Vehicle>();
}
public void setRandom(Random random) {
this.random = random;
}
void add(Vehicle vehicle) {
if (vehicleList.contains(vehicle)) {
throw new IllegalStateException("cannot add vehicle twice " + vehicle.getId());
@ -52,7 +60,8 @@ class VehicleFleetManagerImpl implements VehicleFleetManager {
}
public Vehicle getVehicle() {
return vehicleList.get(vehicleList.size()-1);
int randomIndex = random.nextInt(vehicleList.size());
return vehicleList.get(randomIndex);
}
public boolean isEmpty() {
@ -71,6 +80,8 @@ class VehicleFleetManagerImpl implements VehicleFleetManager {
private Vehicle[] vehicleArr;
private Random random = RandomNumberGeneration.getRandom();
public VehicleFleetManagerImpl(Collection<Vehicle> vehicles) {
super();
this.vehicles = vehicles;
@ -81,6 +92,10 @@ class VehicleFleetManagerImpl implements VehicleFleetManager {
logger.debug("initialise {}",this);
}
public void setRandom(Random random) {
this.random = random;
}
@Override
public String toString() {
return "[name=finiteVehicles]";
@ -95,7 +110,9 @@ class VehicleFleetManagerImpl implements VehicleFleetManager {
}
vehicleTypes = new TypeContainer[maxTypeIndex+1];
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) {
vehicleArr[v.getIndex()]=v;