

import java.util.Random;

/**
 * TSP solver 
 */

public class TSP {

    public static void main(String[] args) {

        int n = 7;
        int im = Integer.MAX_VALUE;
        int t = 4;

        try { 
            n = Integer.parseInt(args[0]); 
        } catch (Exception e) { }
        try { 
            t = Integer.parseInt(args[1]); 
        } catch (Exception e) { }
        try { 
            im = Integer.parseInt(args[2]); 
        } catch (Exception e) { }

        Point[] points = new Point[n];
        double m = 100;
        Random r = new Random();
        for ( int i = 0; i < n; i++ ) {
            points[i] = Point.random(i,r,m);
        }

        long tm;
        /*
        TSPInf s  = new SeqTSP(points);
        TSPInf p  = new ParTSP(points,t);
        TSPInf pl = new ParLocalTSP(points,t);
        TSPInf ss = new SeqStackTSP(points);
        */
        TSPInf sb  = new SeqByteTSP(points);
        TSPInf pb  = new ParByteTSP(points,t);
        TSPInf plb = new ParByteLocalTSP(points,t);
        TSPInf ssb = new SeqByteStackTSP(points);

        Path best;

        // ArrayList versions
        /*
        tm = System.currentTimeMillis();
        best = s.getBest(im);
        tm = System.currentTimeMillis() - tm; 
        System.out.println("\nbest list seq = " + best + "");
        System.out.println(tm + "ms\n");

        tm = System.currentTimeMillis();
        best = p.getBest(im);
        tm = System.currentTimeMillis() - tm; 
        System.out.println("\nbest list par = " + best + "");
        System.out.println(tm + "ms\n");

        tm = System.currentTimeMillis();
        best = pl.getBest(im);
        tm = System.currentTimeMillis() - tm; 
        System.out.println("\nbest list par local = " + best + "");
        System.out.println(tm + "ms\n");

        tm = System.currentTimeMillis();
        best = ss.getBest(im);
        tm = System.currentTimeMillis() - tm; 
        System.out.println("\nbest list seq stack = " + best + "");
        System.out.println(tm + "ms\n");
        */
        // byte[] versions
        /*
        tm = System.currentTimeMillis();
        best = sb.getBest(im);
        tm = System.currentTimeMillis() - tm; 
        System.out.println("\nbest byte seq = " + best + "");
        System.out.println(tm + "ms\n");

        tm = System.currentTimeMillis();
        best = pb.getBest(im);
        tm = System.currentTimeMillis() - tm; 
        System.out.println("\nbest byte par = " + best + "");
        System.out.println(tm + "ms\n");
        */
        tm = System.currentTimeMillis();
        best = plb.getBest(im);
        tm = System.currentTimeMillis() - tm; 
        System.out.println("\nbest byte par local = " + best + "");
        System.out.println(tm + "ms\n");
        /*
        tm = System.currentTimeMillis();
        best = ssb.getBest(im);
        tm = System.currentTimeMillis() - tm; 
        System.out.println("\nbest byte seq stack = " + best + "");
        System.out.println(tm + "ms\n");
        */
    }

}
