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

optimize ruin random

This commit is contained in:
oblonski 2015-03-29 19:54:32 +02:00
parent 6c1483c04f
commit 545eb71b46

View file

@ -24,7 +24,7 @@ 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.LinkedList; import java.util.Collections;
import java.util.List; import java.util.List;
@ -85,35 +85,24 @@ public final class RuinRandom extends AbstractRuinStrategy {
throw new IllegalStateException("not supported"); throw new IllegalStateException("not supported");
} }
@Deprecated
public void setRuinFraction(double fractionOfAllNodes2beRuined) {
this.fractionOfAllNodes2beRuined = fractionOfAllNodes2beRuined;
logger.info("fraction set " + this);
}
private void ruin(Collection<VehicleRoute> vehicleRoutes, int nOfJobs2BeRemoved, List<Job> unassignedJobs) { private void ruin(Collection<VehicleRoute> vehicleRoutes, int nOfJobs2BeRemoved, List<Job> unassignedJobs) {
LinkedList<Job> availableJobs = new LinkedList<Job>(vrp.getJobs().values()); ArrayList<Job> availableJobs = new ArrayList<Job>(vrp.getJobs().values());
for (int i = 0; i < nOfJobs2BeRemoved; i++) { Collections.shuffle(availableJobs,random);
if(availableJobs.isEmpty()) break; int removed = 0;
Job job = pickRandomJob(availableJobs); for (Job job : availableJobs) {
if(removed == nOfJobs2BeRemoved) break;
if(removeJob(job,vehicleRoutes)) { if(removeJob(job,vehicleRoutes)) {
unassignedJobs.add(job); unassignedJobs.add(job);
availableJobs.remove(job);
} }
removed++;
} }
} }
@Override @Override
public String toString() { public String toString() {
return "[name=randomRuin][noJobsToBeRemoved="+selectNuOfJobs2BeRemoved()+"]"; return "[name=randomRuin][noJobsToBeRemoved="+selectNuOfJobs2BeRemoved()+"]";
} }
private Job pickRandomJob(LinkedList<Job> availableJobs) {
int randomIndex = random.nextInt(availableJobs.size());
return availableJobs.get(randomIndex);
}
private int selectNuOfJobs2BeRemoved() { private int selectNuOfJobs2BeRemoved() {
return (int) Math.ceil(vrp.getJobs().values().size() * fractionOfAllNodes2beRuined); return (int) Math.ceil(vrp.getJobs().values().size() * fractionOfAllNodes2beRuined);
} }