Extending crossed bridge or double bridge 'from d3
'
If we take a closer look at diagram for AdebC move type, we can notice that it cannot be made by extending double bridge or crossed bridge from the last city (d4
) in move, if the second submove starts from d1-d2
:
On the other hand, if we denoted the city we want to extend move from as d3
, then there would be no consistency in the numbering:
Note that so far we used only d1-d2
ordering. Instead we can use the first two cities in the reverse order:
proc LK_Bridge_A1(...) =
...
improved = LK_Bridge_A2(cF1, cF2, cF3, cF4, d1, d2, Ga)
if not improved:
improved = LK_Bridge_A2(cF1, cF2, cF3, cF4, d2, d1, Ga) # NOTE
and get
Using the same approach we obtain:
proc LK_Bridge_A3(...) =
...
fwd = (d2 == t_succ(d1))
...
# choose d6
case tourOrderPrev
of TO_ADBC:
if fwd:
d6 = t_pred(d5)
if inOrder(d3, d5, c1, true):
tourOrder = TO_AxdECB_1 # AdECB
elif inOrder(c4, d5, d4, true):
tourOrder = TO_AxcxeDB_1 # AceDB
elif inOrder(d2, d5, c3, true):
tourOrder = TO_AxbxdxeC_1 # AbdeC
else:
tourOrder = TO_AxbEDC_1 # AbEDC
else: # not fwd
d6 = t_succ(d5)
if inOrder(d3, d5, c1, true):
tourOrder = TO_ADxcxeB_3 # ADceB
elif inOrder(c4, d5, d4, true):
tourOrder = TO_AECxdB_3 # AECdB
elif inOrder(d1, d5, c3, true):
tourOrder = TO_AEDxbC_3 # AEDbC
else:
tourOrder = TO_AxdxexbC_3 # AdebC
#end_if fwd
of TO_AxcxdB:
if fwd:
if inOrder(d3, d5, c1, true):
d6 = t_succ(d5)
tourOrder = TO_AECxdB_2 # AECdB
elif inOrder(c4, d5, d4, true):
d6 = t_succ(d5)
tourOrder = TO_ADxcxeB_2 # ADceB
elif inOrder(d2, d5, c3, true):
d6 = t_pred(d5)
tourOrder = TO_AxbEDC_2 # AbEDC
else:
d6 = t_pred(d5)
tourOrder = TO_AxbxdxeC_2 # AbdeC
else: # not fwd
if inOrder(d4, d5, c1, true):
d6 = t_pred(d5)
tourOrder = TO_AEDxbC_4 # AEDbC
elif inOrder(c4, d5, d3, true):
d6 = t_pred(d5)
tourOrder = TO_AxdxexbC_4 # AdebC
elif inOrder(d1, d5, c3, true):
d6 = t_succ(d5)
tourOrder = TO_AxdECB_4 # AdECB
else:
d6 = t_succ(d5)
tourOrder = TO_AxcxeDB_4 # AceDB
#end_if fwd
...
and
proc Make_5opt_NS_Move(...) =
case tourOrder
of TO_AxbEDC_1, TO_AxbxdxeC_1, TO_AxcxeDB_1, TO_AxdECB_1:
Exchange_Links(d1, d2, d4, d3)
Exchange_Links(c1, c2, c4, c3)
Exchange_Links(d1, d3, d4, d2)
Exchange_Links(d1, d4, d6, d5)
of TO_AxbxdxeC_2, TO_AxbEDC_2, TO_ADxcxeB_2, TO_AECxdB_2:
Exchange_Links(d1, d2, d4, d3)
Exchange_Links(c1, c2, c4, c3)
Exchange_Links(d1, d4, d6, d5)
of TO_ADxcxeB_3, TO_AECxdB_3, TO_AEDxbC_3, TO_AxdxexbC_3:
Exchange_Links(d2, d1, d4, d3)
Exchange_Links(c1, c2, c4, c3)
Exchange_Links(d2, d3, d4, d1)
Exchange_Links(d1, d4, d6, d5)
of TO_AEDxbC_4, TO_AxdxexbC_4, TO_AxdECB_4, TO_AxcxeDB_4:
Exchange_Links(d2, d1, d4, d3)
Exchange_Links(c1, c2, c4, c3)
Exchange_Links(d1, d4, d6, d5)
...
Adding these additional types for "backward" second submove requires more code, as can be seen above, slightly changes running times, but makes resulting tours less than 0.1% better, so it may or may be not worth introducing.
No comments:
Post a Comment