All Downloads are FREE. Search and download functionalities are using the official Maven repository.

fr.vergne.optimization.TSP.PathIncubator Maven / Gradle / Ivy

The newest version!
package fr.vergne.optimization.TSP;

import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import fr.vergne.optimization.TSP.path.AbstractPath;
import fr.vergne.optimization.TSP.path.AbstractPath.Transition;
import fr.vergne.optimization.TSP.path.Location;
import fr.vergne.optimization.incubator.impl.ExperimentalIncubator;

public class PathIncubator extends
		ExperimentalIncubator {

	public PathIncubator() {
		super(new Comparator() {

			@Override
			public int compare(Path p1, Path p2) {
				Collection t1 = p1.getTransitions();
				Set l1 = new HashSet();
				Double d1 = feed(t1, l1);

				Collection t2 = p2.getTransitions();
				Set l2 = new HashSet();
				Double d2 = feed(t2, l2);

				int comparison = Integer.valueOf(l2.size())
						.compareTo(l1.size());
				comparison = comparison != 0 ? comparison : d1.compareTo(d2);
				comparison = comparison != 0 ? comparison : p1.getLength()
						.compareTo(p2.getLength());
				return comparison;
			}

			private double feed(Collection transitions,
					Set locations) {
				Map counters = new HashMap();
				for (Transition transition : transitions) {
					for (Location location : Arrays.asList(transition.getL1(),
							transition.getL2())) {
						locations.add(location);
						counters.put(location, getCount(counters, location) + 1);
					}
				}
				double distance = 0;
				for (int count : counters.values()) {
					int delta = 2 - count;
					distance += delta * delta;
				}
				return distance;
			}

			private int getCount(Map m1, Location a) {
				Integer countA = m1.get(a);
				return countA == null ? 0 : countA;
			}
		});
	}

	int generatedIndividuals = 0;

	public int getGeneratedIndividuals() {
		return generatedIndividuals;
	}

	@Override
	public void incubate() {
		super.incubate();
		generatedIndividuals++;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy