package org.geogebra.common.kernel.discrete; import java.util.ArrayList; import org.geogebra.common.kernel.Construction; import org.geogebra.common.kernel.MyPoint; import org.geogebra.common.kernel.SegmentType; import org.geogebra.common.kernel.commands.Commands; import org.geogebra.common.kernel.discrete.tsp.TSP; import org.geogebra.common.kernel.discrete.tsp.TSPSolver; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.common.kernel.geos.GeoList; import org.geogebra.common.kernel.kernelND.GeoPointND; public class AlgoTravelingSalesman extends AlgoDiscrete { public AlgoTravelingSalesman(Construction cons, String label, GeoList inputList) { super(cons, label, inputList, null); } @Override public Commands getClassName() { return Commands.TravelingSalesman; } @Override public void compute() { size = inputList.size(); if (!inputList.isDefined() || size < 3) { locus.setUndefined(); return; } double inhom[] = new double[2]; // Opt3 opt3 = new Opt3(); // final BranchBound construction = new BranchBound(500, opt3); MyPoint[] nodes = new MyPoint[size]; for (int i = 0; i < size; i++) { GeoElement geo = inputList.get(i); if (geo.isDefined() && geo.isGeoPoint()) { GeoPointND p = (GeoPointND) geo; p.getInhomCoords(inhom); nodes[i] = new MyPoint(inhom[0], inhom[1]); // Log.error(i + " " + nodes[i].toString()); } } final TSP tsp = new TSPSolver(); tsp.solve(nodes); if (al == null) { al = new ArrayList<MyPoint>(); } else { al.clear(); } for (int i = 0; i < size; i++) { // Log.error(i + " " + nodes[i].toString()); nodes[i].setLineTo(i != 0); al.add(nodes[i]); } // // join up MyPoint n = nodes[0]; al.add(new MyPoint(n.getX(), n.getY(), SegmentType.LINE_TO)); locus.setPoints(al); locus.setDefined(true); } }