Esempio n. 1
0
  // random routes and cut points
  void rand_string_relocation(int[][] routes, int mode, int K) {
    // select two routes
    int r1, r2, c1, c2, x1, x2;
    int[] newr1;
    int[] newr2;
    int c = 0;

    // select cut lengths
    x1 = MatUtils.irandom(K - 1) + 1; // number of stops from r1 to r2

    do {
      r1 = MatUtils.irandom(routes.length - 1); // source
      c++;
    } while (c < 2 * routes.length && routes[r1].length <= x1);
    do {
      r2 = MatUtils.irandom(routes.length - 1); // destination
      c++;
    } while (c < 2 * routes.length && r1 == r2);

    if (c != 2 * routes.length) {
      // select cut points
      c1 = MatUtils.irandom(routes[r1].length - x1 - 1) + 1;
      c2 = MatUtils.irandom(routes[r2].length - 1) + 1;

      boolean feasible = (excess_demand(routes) == 0.0);
      string_relocation(routes, r1, r2, x1, c1, c2, mode, feasible, true);
    }
  }
Esempio n. 2
0
  public static void main(String[] args) {

    int mni = 0;
    int mnui = 0;

    try {

      VRP v = new VRP("1pp.vrp", "1pp.cit");

      for (int i = 0; i < 100000; i++) {

        int[] rsol1 = MatUtils.give_rand_perm(v.getNumberClients() + v.getNumberVehicles() - 1);

        int[][] routes = v.get_routes(rsol1);
        // v.print_routes (routes);

        if (v.excess_demand(routes) == 0) mni++;
        else mnui++;

        // v.rand_string_exchange(routes, 2,2);
        // v.print_routes (routes);
      }
      System.out.println("boas alternativas ->" + mni + " más->" + mnui);
      // v.iterated_lo(STR_EXCHANGE, FIRST);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
Esempio n. 3
0
  public VRP(String vrpfile, String tspfile) throws Exception {
    FileReader f = new FileReader(vrpfile);
    BufferedReader B = new BufferedReader(f);
    String str;
    str = B.readLine();
    int temp = Integer.parseInt(str);
    setNumberVehicles(temp);

    str = B.readLine();
    double temp1 = Double.valueOf(str).doubleValue();
    setCapacity(temp1);

    str = B.readLine();
    temp = Integer.parseInt(str);
    setNumberClients(temp);

    demands = new double[nc];
    for (int k = 0; k < nc; k++) {
      str = B.readLine();
      temp1 = Double.valueOf(str).doubleValue();
      demands[k] = temp1;
    }

    tspp = new EucTsp(tspfile);
    sol = MatUtils.give_rand_perm(nc + nv - 1);
  }
Esempio n. 4
0
  int[][] iterated_lo(int move, int strat) {
    int[] sol1 = MatUtils.give_rand_perm(getNumberClients() + getNumberVehicles() - 1);
    int[][] routes = get_routes(sol1);

    iterated_lo(routes, move, strat);
    return routes;
  }
Esempio n. 5
0
  int[] inversion_improve(int[] sol) {
    int i, j, l;
    int s = sol.length;
    int[] newsol = new int[s];
    int pos = MatUtils.irandom(s - 1);
    int k = MatUtils.irandom(s - 2);
    int n = (int) (k / 2);

    for (i = 0; i < s; i++) newsol[i] = sol[i];
    for (i = 0, j = pos, l = (pos + k - 1) % s; i < n; i++, j = (j + 1) % s) {
      newsol[j] = sol[l];
      newsol[l] = sol[j];
      if (l > 0) l--;
      else l = s - 1;
    }
    improve_routes_2opt(newsol);

    if (total_cost(newsol) < total_cost(sol)) return newsol;
    else return sol;
  }
Esempio n. 6
0
  // String exchange move - random routes and cut points
  void rand_string_exchange(int[][] routes, int mode, int K) {
    // select two routes
    int r1, r2, c1, c2, x1, x2;
    int c = 0; // avoid infinite loops

    // select cut lengths
    // x1 = MatUtils.irandom(K-1)+1; //number of stops from r1 to r2
    // x2 = MatUtils.irandom(K-1)+1; //number of stops from r2 to r1
    x1 = MatUtils.irandom(K); // number of stops from r1 to r2
    x2 = MatUtils.irandom(K); // number of stops from r2 to r1

    do {
      r1 = MatUtils.irandom(routes.length - 1);
      c++;
    } while (c < 2 * routes.length && routes[r1].length <= x1);
    do {
      r2 = MatUtils.irandom(routes.length - 1);
      c++;
    } while (c < 2 * routes.length && (r1 == r2 || routes[r2].length <= x2));

    if (c != 2 * routes.length) {
      // select cut points
      c1 = MatUtils.irandom(routes[r1].length - x1 - 1) + 1;
      c2 = MatUtils.irandom(routes[r2].length - x2 - 1) + 1;

      boolean feasible = (excess_demand(routes) == 0.0);
      string_exchange(routes, r1, r2, x1, x2, c1, c2, mode, feasible, true);
    }
  }
Esempio n. 7
0
  int[] order_inversion_improve(int[] sol) {
    int i, j, l;
    int[] newsol = new int[nc];
    int pos = MatUtils.irandom(nc - 1);
    int k = MatUtils.irandom(nc - 2);
    int n = (int) (k / 2);

    for (i = 0; i < nc; i++) newsol[i] = sol[i];
    for (i = 0, j = pos, l = (pos + k - 1) % nc; i < n; i++, j = (j + 1) % nc) {
      newsol[j] = sol[l];
      newsol[l] = sol[j];
      if (l > 0) l--;
      else l = nc - 1;
    }

    int[][] r = routes_from_order(sol);
    int[][] r1 = routes_from_order(newsol);
    // improve_routes_2opt(newsol);

    if (total_cost(r1) < total_cost(r)) return newsol;
    else return sol;
  }
Esempio n. 8
0
  // string cross with random routes and cut points
  // mode = ALWAYS_PERFORM ou PERFORM_ON_IMPROVE
  void rand_string_cross(int[][] routes, int mode) {
    // select two routes
    int r1, r2, c1, c2;
    int c = 0; // used to avoid possibility of infinite loopS

    do {
      r1 = MatUtils.irandom(routes.length - 1);
      c++;
    } while (c < 2 * routes.length && routes[r1].length < 3);
    c = 0;
    do {
      r2 = MatUtils.irandom(routes.length - 1);
      c++;
    } while (c < 2 * routes.length && (routes[r2].length < 3 || r1 == r2));

    if (c != 2 * routes.length) {
      // select cut points
      c1 = MatUtils.irandom(routes[r1].length - 3) + 2;
      c2 = MatUtils.irandom(routes[r2].length - 3) + 2;

      boolean feasible = (excess_demand(routes) == 0.0);
      string_cross(routes, r1, r2, c1, c2, mode, feasible, true);
    }
  }