Python Forum
Traveller salesman backtracking
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Traveller salesman backtracking
#1
So I have the traveller salesman (backtracking) with a cost on the edges (I consider a full graph with 0 on the main diagonal and a cost in the rest, visiting every node just one time except starting node ), the problem is that my algorithm calculates the cost well ( cost = 13 ) but print 0 - 3 - 3 - 3 - 0 instead of the real solution ( I considered a 4 x 4 matrix starting from node 0 ) I am beginner in python, any help?
    def posible(k):
        global c
        if  k != n:
            for i in range(0,k-1):
                if x[k] == x[i]:
                    return False
        else:
            c = a[x[n-1]][x[n]]
            if x[k] != x[0]:
            return False

            for i in range(1,k):
                if x[k] == x[i]:
                    return False
                c = c + a[x[i-1]][x[i]]

        if k > 0:
            if a[x[k-1]][x[k]] == 0:
                return False

        return True

    def compare():
        global cmin
        global o
        global c
        if c < cmin:
            cmin = c
            o = x

    def back(k):
        for i in range(0,n):
            x[k] = i
            if posible(k) == True:
                if k == n:
                    compare()
                else:
                    back(k+1)


    n = 4
    a = [ [0,1,2,3],
          [1,0,4,5],
          [2,4,0,5],
          [3,5,5,0]
        ]
    c = 100
    x = [ 0, 0 , 0 , 0 , 0 ]
    o = [ 0, 0 , 0 , 0 , 0 ]
    cmin = 1000
    x[1] = 0

    back(1)
    o.append(0)
    if cmin == 1000:
        print('No solution')
    else:
        for i in range(0,n):
            print(o[i],end= ' ')
        print('0', end=' ')
        print(" cost : " + str(cmin))
  
Reply
#2
Sure. Let's start by saying, lose the single letter variables and use descriptive names instead. Python encourages this. In a few months time, with several programs under your belt, even you will forget what they stand for. Next, you have way to many 'globals' and they should be avoided as much as possible. You say the output of '0-3-3-3-0' is incorrect, what result were you expecting? It is often helpful, when you provide a snippet of the entire program, to include some "real" values we can test with as well as the actual output you are getting.
If it ain't broke, I just haven't gotten to it yet.
OS: Windows 10, openSuse 42.3, freeBSD 11, Raspian "Stretch"
Python 3.6.5, IDE: PyCharm 2018 Community Edition
Reply
#3
Hi, u are completely right i should use other names for variables. I figured out what i did wrong, i just changed o = x with o = list(x) and now it's working fine, thanks for reply !
Reply
#4
Glad you were able to arrive at a solution.
If it ain't broke, I just haven't gotten to it yet.
OS: Windows 10, openSuse 42.3, freeBSD 11, Raspian "Stretch"
Python 3.6.5, IDE: PyCharm 2018 Community Edition
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
Photo Travelling Salesman Problem huhandrey 2 2,060 Oct-11-2020, 02:55 AM
Last Post: deanhystad
  Algorithm to solve a case of Travelling Salesman Problem Ale888 3 3,099 Dec-11-2018, 07:49 PM
Last Post: buran

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020