Advertisement
shamiul93

savings

Jan 20th, 2019
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.91 KB | None | 0 0
  1. package tsp_ai;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.List;
  6. import java.util.Scanner;
  7.  
  8. public class TSP_AI_SAVINGS {
  9.  
  10.     public static Place[] places;
  11.  
  12.     public static List<Tour> make_pair_tours(int start_pos, int total) {
  13.         List<Tour> pairs = new ArrayList<Tour>();
  14.         int j = 0;
  15.         for (int i = 0; i < total; i++) {
  16.             if (places[i].id != (start_pos + 1)) {
  17.                 Tour temp = new Tour();
  18.                 temp.pushback(places[start_pos]);
  19.                 temp.pushback(places[i]);
  20.                 temp.CalculateCost();
  21.                 pairs.add(temp);
  22.             }
  23.         }
  24. //        System.out.println("In make pairs, sub_tours : " + pairs.size());
  25. //        for (int i = 0; i < pairs.size(); i++) {
  26. //            System.out.println(pairs.get(i));
  27. //        }
  28.         return pairs;
  29.     }
  30.  
  31.     public static Tour Savings(int start_pos, int total) {
  32.         List<Tour> sub_tours = make_pair_tours(start_pos, total);
  33.  
  34.         //Calculating savings
  35.         int s = sub_tours.size();
  36.         double[][] saving = new double[total][total];
  37.         for (int i = 0; i < places.length; i++) {
  38.             for (int j = 0; j < places.length; j++) {
  39.                 if (i != j) {
  40.                     saving[i][j] = places[start_pos].dist(places[i]) + places[j].dist(places[start_pos]) - places[i].dist(places[j]);
  41.                 } else {
  42.                     saving[i][j] = 0;
  43.                 }
  44.             }
  45.         }
  46.         temp_ordering[] savings_in_order = new temp_ordering[total * total];
  47.         int l = 0;
  48.         // taking savings in 1-D Array
  49.         for (int i = 0; i < places.length; i++) {
  50.             for (int j = 0; j < places.length; j++) {
  51.                 savings_in_order[l] = new temp_ordering();
  52.                 savings_in_order[l].i = i;
  53.                 savings_in_order[l].j = j;
  54.                 savings_in_order[l].isUsed = false;
  55.                 savings_in_order[l].save = saving[i][j];
  56.                 l++;
  57.             }
  58.         }
  59.         //Sorting 1-D Array of saving
  60.         Arrays.sort(savings_in_order);
  61.        
  62.         //sorting test
  63. //        for (int i = 0; i < savings_in_order.length; i++) {
  64. //            System.out.println(savings_in_order[i]);
  65. //        }
  66.         // Merging Tours if merging is feasible
  67.         for (int i = 0; i < savings_in_order.length; i+=2) {
  68.             if ((savings_in_order[i].isUsed == false) && (savings_in_order[i].i != start_pos) && (savings_in_order[i].j != start_pos)) {
  69.                 int a = savings_in_order[i].i;
  70.                 int b = savings_in_order[i].j;
  71.                 Boolean feasible1 = false;
  72.                 Boolean feasible2 = false;
  73.                 Tour t1 = null;
  74.                 Tour t2 = null;
  75.                 int t1_idx_in_sub_tour, t2_idx_in_sub_tour;
  76.                 for (int j = 0; j < sub_tours.size(); j++) { // getting tours to be merged
  77.                     if(sub_tours.get(j).t.contains(places[a])){
  78.                         t1 = sub_tours.get(j);
  79.                         t1_idx_in_sub_tour = j;
  80.                     }
  81.                     if(sub_tours.get(j).t.contains(places[b])){
  82.                         t2 = sub_tours.get(j);
  83.                         t2_idx_in_sub_tour = j;
  84.                     }
  85.                 }
  86.                 if(t1 == t2){ // edge in same tour, so discard
  87.                     continue;
  88.                 }
  89.                
  90.                 int t1_size = t1.size();
  91.                 int t2_size = t2.size();
  92.                 int a_idx_in_t1 = t1.t.indexOf(places[a]);
  93.                 int b_idx_in_t2 = t2.t.indexOf(places[b]);
  94.                 if((a_idx_in_t1 == 1) || (a_idx_in_t1 == (t1_size - 1))){
  95.                     feasible1 = true;
  96.                 }
  97.                 if((b_idx_in_t2 == 1) || (b_idx_in_t2 == (t2_size - 1))){
  98.                     feasible2 = true;
  99.                 }
  100.                 if(feasible1 && feasible2){ // link breaking capability check
  101.                     for (int j = 1; j < t2.size(); j++) {
  102.                         t1.pushback(t2.t.get(j));
  103.                     }
  104.                     sub_tours.remove(t2);
  105.                 }
  106.                 if(sub_tours.get(0).size() == total && sub_tours.size() == 1){ // result has been constructed
  107.                     break;
  108.                 }
  109.             }
  110.         }
  111.  
  112.         return sub_tours.get(0);
  113.     }
  114.  
  115.     public static void main(String[] args) {
  116.         Scanner in;
  117.         in = new Scanner(System.in);
  118.         int total;
  119.         total = in.nextInt();
  120.         places = new Place[total];
  121.         for (int i = 0; i < total; i++) {
  122.             int id = in.nextInt();
  123.             double x = in.nextDouble();
  124.             double y = in.nextDouble();
  125.             Place temp = new Place(id, x, y);
  126.             places[i] = temp;
  127.         }
  128.         Tour t = Savings(1, total); // start_pos in (placeid - 1) form
  129.         System.out.println(t);
  130.     }
  131.  
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement