2
def calcDistance(x1, y1, x2, y2):
    distance = sqrt((x1-x2)**2 + (y1-y2)**2)

    return distance

def make_dict():
    return defaultdict(make_dict)

# Capture 1 input from the command line.
#    NOTE: sys.argv[0] is the name of the python file
#    Try "print sys.argv" (without the quotes) to see the sys.argv list
#    1 input --> the sys.argv list should have 2 elements.
if (len(sys.argv) == 2):
    print "\tOK.  1 command line argument was passed."

    # Now, we'll store the command line inputs to variables
    myFile = str(sys.argv[1])
else:
    print 'ERROR: You passed', len(sys.argv)-1, 'input parameters.'
    quit()  


# Create an empty list:
cities = []

# Create an empty dictionary to hold our (x,y) coordinate info:
myCoordinates = {}

# Open our file:
myFile = '%s.csv' % (myFile)
with open(myFile, 'rb') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=',', quotechar='|')
    for row in spamreader:
        # Only read rows that do NOT start with the "%" character.
        if (row[0][0] != '%'):
            # print row
            id = int(row[0])
            isHome = int(row[1])
            x = float(row[2])
            y = float(row[3])

            myCoordinates[id] = {'x': x, 'y': y}
            # print myCoordinates[id]['x']
            # print myCoordinates[id]['y']


            if (isHome == 1):
                # Store this id as the home city
                homeCity = id

            cities.append(id)           

print homeCity
print cities

# Create a TSP tour.
# VERSION 1 -- Using range() and for() loops:

myTour = []
for i in range(homeCity, len(cities)+1):
    myTour.append(i)
for i in range(1, homeCity+1):
    myTour.append(i)    
print myTour

# VERSION 2 -- Using only range()
'''
firstPart = range(homeCity, len(cities)+1)
secondPart = range(1, homeCity+1)
myTour = firstPart + secondPart
print myTour
'''

tau = defaultdict(make_dict)

for i in cities:
    # print "distance[%d][%d] = 0" % (i, i)
    tau[i][i] = 0
    for j in range(i+1, len(cities)+1):         
        # print "distance[%d][%d] > 0" % (i, j)
        tau[i][j] = calcDistance(myCoordinates[i]['x'], myCoordinates[i]['y'], myCoordinates[j]['x'], myCoordinates[j]['y'])
        # print "distance[%d][%d] = distance[%d][%d]" % (j, i, i, j)
        tau[j][i] = tau[i][j]


# FIXME -- Edit the code below...
# Calculate the total distance of our TSP solution:
i = myTour[i]
for myIndex in range(1, len(myTour)+1):
    j = myTour[myIndex]
    print j

Function to calculate cost based on distance. Need to be modified.

def cost(rate,j):
    cost = rate * j
cost = cost(1000,j)
print cost

Also I need to calculate cost based on distance traveled. with myIndex i am getting an error of list index out of range. I am not knowing what exactly is going there. The j is like total distance calculated.

MD. Khairul Basar
  • 4,976
  • 14
  • 41
  • 59

1 Answers1

2

List in python have 0 based index. If you add n elements to a list the indexes are from 0 to n-1. But you are running the loop from 1 to n. So, it getting list index out of range error.

You should do this-

for myIndex in range(0, len(myTour)):
    j = myTour[myIndex]
    print(j)

If you are getting list index out of range error then change the loop where you are getting the error and accessing a list using 1-based indexing, from range(1,len(some_list)+1) to range(0,len(some_list)). Or you can simply write range(len(some_list)). When there is no start value passed in the range function it starts from 0 by default.

To calculate cost try this -

for myIndex in range(0, len(myTour)):
    j = myTour[myIndex]
    cost = rate * j
    print(cost)

Set the value of rate before starting the loop.

MD. Khairul Basar
  • 4,976
  • 14
  • 41
  • 59