Planning such a tour is easy by hand for 3-4 cities. For longer tours some help is needed. To check the performance of the blind search, you may want to know what the usual algorithms involve. A greedy method starts with the shortest distance, and then keeps going to the closest city not yet visited. Another heuristic method is to to select a pair of closest cities and accept the best (shortest) connection among those that do not complete a shorter loop, and do not introduce a spurious third connection to a city. Eventually, the disjoint pieces will form a path that often can be further improved upon inspection.
The program is longer but not at all sophisticated - it just selects paths
at random. Notice that a solution to Exercise
- how to
generate a random permutation - is given in one of the subprograms (which
one?). The method for the latter is simple-minded - the algorithm attempts to
place consecutive numbers at random spots until an empty spot is selected.
The following is the main part of the program. You can use it as a template in designing your own version of Blind search programs. The full code with SUBs is http://math.uc.edu/brycw/probab/basic.htmonline in RANDTOUR.BAS.
'****
CLS
'**** get number of cities (no choice which) from user
LOCATE 2, 1
INPUT ; "Shortest distance between how many cities?", n
'*** initialize program
CLS
nMax = 19 ' current data size. Make sure not exceeded!
IF n > nMax THEN n = nMax
'declare arrays
DIM SHARED dist(nMax, nMax) ' matrix of distances
DIM SHARED city(nMax) AS STRING
DIM P(n), BestP(n)
'read distances
CALL AssignDistances(nMax)
'initial permutation
FOR j = 1 TO n
P(j) = j
BestP(j) = j
NEXT j
'initial length of trip
MinLen = PathLen(P())
'*** main loop
DO 'infinite loop till user stops
'count trials
no = no + 1
'*** interacting with user
'check if user pressed key to stop
k$ = INKEY$
IF k$ > "" THEN EXIT DO 'exit infinite loop
'display currrent progress
display (no)
'*** get any path
CALL GetPermutation(P())
x = PathLen(P())
IF x < MinLen THEN
'Better path found, so memorize and display
Dlen = MinLen - x
MinLen = x
'*Memorize best order and print
FOR j = 1 TO n
BestP(j) = P(j)
PRINT city(P(j)); "->";
NEXT j
'Finish printing
PRINT city(P(1))
PRINT "Best so far: "; MinLen
PRINT "Progress rate "; Dlen / (no - Slen); " miles per trial"
Slen = no
END IF
LOOP
'Print final message
CLS
PRINT "ALPHABETIC TOUR OF FIRST "; n; " CITIES in the USA"
PRINT "Blind Search Recommended Route found in "; Slen; "-th search"
FOR j = 1 TO n - 1
PRINT city(BestP(j)); "-->";
NEXT j
PRINT city(BestP(n)); "-->"; city(BestP(1))
PRINT "Total distance: "; MinLen
LOCATE 22, 40
PRINT "(Distances subject to change)"
END
The program runs in the infinite loop until it is stopped by the user. Once
stopped, the program prints the best route it found. For larger sets of cities we
may have hard time deciding when to stop it.
Here is a sample output (from the improved version, as marked in the actual code):
When you run this program on larger sets of cities, you will notice that the
program is not fast. One possible improvement in the design of this program is
to modify the randomization to be less likely to pick long paths. For instance,
you can attempt to modify paths that are known to be short, or weight the
modifications by lengths of resulting paths. Such methods are actually in use in
image restoration problems (simulated annealing ),
see page
.