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

refactor ruin share

This commit is contained in:
oblonski 2015-01-06 18:29:19 +01:00
parent 44d0efdd54
commit fd62578890
4 changed files with 60 additions and 29 deletions

View file

@ -41,6 +41,16 @@ public abstract class AbstractRuinStrategy implements RuinStrategy{
ruinListeners = new RuinListeners();
}
protected RuinShareFactory ruinShareFactory;
public void setRuinShareFactory(RuinShareFactory ruinShareFactory){
this.ruinShareFactory = ruinShareFactory;
}
public RuinShareFactory getRuinShareFactory(){
return ruinShareFactory;
}
@Override
public Collection<Job> ruin(Collection<VehicleRoute> vehicleRoutes){
ruinListeners.ruinStarts(vehicleRoutes);

View file

@ -36,7 +36,7 @@ import java.util.*;
* @author stefan
*
*/
final class RuinRadial extends AbstractRuinStrategy {
public final class RuinRadial extends AbstractRuinStrategy {
static interface JobNeighborhoods {
@ -254,6 +254,7 @@ final class RuinRadial extends AbstractRuinStrategy {
private JobNeighborhoods jobNeighborhoods;
private final int noJobsToMemorize;
/**
* Constructs RuinRadial.
@ -266,16 +267,43 @@ final class RuinRadial extends AbstractRuinStrategy {
super();
this.vrp = vrp;
this.fractionOfAllNodes2beRuined = fraction2beRemoved;
int nJobsToMemorize = (int) Math.ceil(vrp.getJobs().values().size()*fraction2beRemoved);
JobNeighborhoodsImplWithCapRestriction jobNeighborhoodsImpl = new JobNeighborhoodsImplWithCapRestriction(vrp, jobDistance, nJobsToMemorize);
noJobsToMemorize = (int) Math.ceil(vrp.getJobs().values().size()*fraction2beRemoved);
ruinShareFactory = new RuinShareFactory() {
@Override
public int createNumberToBeRemoved() {
return noJobsToMemorize;
}
};
JobNeighborhoodsImplWithCapRestriction jobNeighborhoodsImpl = new JobNeighborhoodsImplWithCapRestriction(vrp, jobDistance, noJobsToMemorize);
jobNeighborhoodsImpl.initialise();
jobNeighborhoods = jobNeighborhoodsImpl;
logger.info("intialise " + this);
logger.info("initialise " + this);
}
public RuinRadial(VehicleRoutingProblem vrp, int noJobs2beRemoved, JobDistance jobDistance) {
super();
this.vrp = vrp;
// this.fractionOfAllNodes2beRuined = fraction2beRemoved;
noJobsToMemorize = noJobs2beRemoved;
ruinShareFactory = new RuinShareFactory() {
@Override
public int createNumberToBeRemoved() {
return noJobsToMemorize;
}
};
JobNeighborhoodsImplWithCapRestriction jobNeighborhoodsImpl = new JobNeighborhoodsImplWithCapRestriction(vrp, jobDistance, noJobsToMemorize);
jobNeighborhoodsImpl.initialise();
jobNeighborhoods = jobNeighborhoodsImpl;
logger.info("initialise " + this);
}
@Override
public String toString() {
return "[name=radialRuin][fraction="+fractionOfAllNodes2beRuined+"]";
return "[name=radialRuin][noJobsToBeRemoved="+noJobsToMemorize+"]";
}
/**
@ -287,7 +315,7 @@ final class RuinRadial extends AbstractRuinStrategy {
if(vehicleRoutes.isEmpty()){
return Collections.emptyList();
}
int nOfJobs2BeRemoved = getNuOfJobs2BeRemoved();
int nOfJobs2BeRemoved = Math.min(ruinShareFactory.createNumberToBeRemoved(), noJobsToMemorize);
if (nOfJobs2BeRemoved == 0) {
return Collections.emptyList();
}
@ -320,10 +348,4 @@ final class RuinRadial extends AbstractRuinStrategy {
return new ArrayList<Job>(vrp.getJobs().values()).get(randomIndex);
}
private int getNuOfJobs2BeRemoved() {
return (int) Math.ceil(vrp.getJobs().values().size()
* fractionOfAllNodes2beRuined);
}
}

View file

@ -36,7 +36,7 @@ import java.util.List;
*
*/
final class RuinRandom extends AbstractRuinStrategy {
public final class RuinRandom extends AbstractRuinStrategy {
private Logger logger = LogManager.getLogger(RuinRandom.class);
@ -54,6 +54,12 @@ final class RuinRandom extends AbstractRuinStrategy {
super();
this.vrp = vrp;
this.fractionOfAllNodes2beRuined = fraction;
setRuinShareFactory(new RuinShareFactory() {
@Override
public int createNumberToBeRemoved() {
return selectNuOfJobs2BeRemoved();
}
});
logger.info("initialise " + this);
logger.info("done");
}
@ -66,7 +72,7 @@ final class RuinRandom extends AbstractRuinStrategy {
@Override
public Collection<Job> ruinRoutes(Collection<VehicleRoute> vehicleRoutes) {
List<Job> unassignedJobs = new ArrayList<Job>();
int nOfJobs2BeRemoved = selectNuOfJobs2BeRemoved();
int nOfJobs2BeRemoved = getRuinShareFactory().createNumberToBeRemoved();
ruin(vehicleRoutes, nOfJobs2BeRemoved, unassignedJobs);
return unassignedJobs;
}
@ -77,20 +83,6 @@ final class RuinRandom extends AbstractRuinStrategy {
@Override
public Collection<Job> ruinRoutes(Collection<VehicleRoute> vehicleRoutes, Job targetJob, int nOfJobs2BeRemoved) {
throw new IllegalStateException("not supported");
// List<Job> unassignedJobs = new ArrayList<Job>();
// if(targetJob != null){
// boolean removed = false;
// for (VehicleRoute route : vehicleRoutes) {
// removed = removeJob(targetJob,route);
// if (removed) {
// nOfJobs2BeRemoved--;
// unassignedJobs.add(targetJob);
// break;
// }
// }
// }
// ruin(vehicleRoutes, nOfJobs2BeRemoved, unassignedJobs);
// return unassignedJobs;
}
public void setRuinFraction(double fractionOfAllNodes2beRuined) {
@ -111,7 +103,7 @@ final class RuinRandom extends AbstractRuinStrategy {
@Override
public String toString() {
return "[name=randomRuin][fraction="+fractionOfAllNodes2beRuined+"]";
return "[name=randomRuin][noJobsToBeRemoved="+selectNuOfJobs2BeRemoved()+"]";
}
private Job pickRandomJob(LinkedList<Job> availableJobs) {

View file

@ -0,0 +1,7 @@
package jsprit.core.algorithm.ruin;
public interface RuinShareFactory {
public int createNumberToBeRemoved();
}