Sunday, March 26, 2017

2-opt with DLB and Fixed Radius - alternative

While the inequity which a 2-opt move must meet to improve a tour::

holds if at least one of the two conditions is met:

or

The inequity (a) means that for given (X1, X2) we can search for Y2 among those cities that are closer to X2 than is X1.

But alternatively the inequity between the two sums may be considered as a pair of inequities:

or

The inequity (c) means that for given (X1, X2) we can search for Y1 among those cities that are closer to X1 than is X2.

In fixed radius search we can use either (a) or (c), the radius is the same. When fixed radius searching is used with DLB, then probably searching around X1 for Y1 would be better – because we would rather prefer to not miss a good move for base city (X1) before activating its don’t look bit. When we want to continue searching and moving in given direction, then probably searching for Y2 around X2 could be better idea.

proc One_City_2_Opt_DLBR2(tour: var Tour_Array,
                          basePos: Tour_Index,
                          DontLook: var DLB_Array): bool =
  var
    improved: bool
    i, j: Tour_Index
    X1, X2, Y1, Y2: City_Number
    radius: Length

  improved = false
  block two_loops:
    for direction in [forward, backward]:
      if direction == forward:
        i  = basePos
        X1 = tour[i]
        X2 = tour[(i+1) mod N]
      else:
        i  = (N + basePos - 1) mod N
        X2 = tour[i]
        X1 = tour[basePos]  # == tour[(i+1) mod N]
      radius = distance(X1, X2)

      for counter_2 in 0 .. N-1:
        j = counter_2
        Y1 = tour[j]
        Y2 = tour[(j+1) mod N]
        if direction == backward:
          swap(Y1, Y2)
        if (X1 == Y1) or (X2 == Y1) or (Y2 == X1):
          continue

        if distance(X1, Y1) > radius:  # NOTE
          continue

        if Gain_From_2_Opt(X1, X2, Y1, Y2) > 0:
          Set_DLB_off(DontLook, [X1, X2, Y1, Y2])
          Make_2_Opt_Move(tour, i, j)
          improved = true
          break two_loops
  result = improved

No comments:

Post a Comment