I write this code of Simulated Annealing for TSP and I have been trying all day to debug it but something goes wrong
<p>This code suppose to reduce the distance of initial tour: distan(initial_tour) &lt; distan(best) . Can you help me plz? I 've been trying all day now. <strong>Do I need to change my swapping method?</strong>
Something goes wrong and the simulated annealing does'not work:</p>

<pre><code>def prob(currentDistance,neighbourDistance,temp):

    if neighbourDistance &lt; currentDistance:
       return 1.0

    else:
       return math.exp( (currentDistance - neighbourDistance) / temp)


def distan(solution):

    #gives the distance of solution


    listax, listay = [], []
    for i in range(len(solution)):

       listax.append(solution[i].x)
       listay.append(solution[i].y)

    dists = np.linalg.norm(np.vstack([np.diff(np.array(listax)), np.diff(np.array(listay))]), axis=0)
    cumsum_dist = np.cumsum(dists)

    return cumsum_dist[-1]


#simulated annealing

temp = 1000000

#creating initial tour

shuffle(greedys)

initial_tour=greedys


print (distan(initial_tour))

current_best = initial_tour

best = current_best

while(temp &gt;1 ):

    #create new neighbour tour 

    new_solution= current_best 

    #Get a random positions in the neighbour tour

    tourPos1=random.randrange(0, len(dfar))
    tourPos2=random.randrange(0, len(dfar))

    tourCity1=new_solution[tourPos1]
    tourCity2=new_solution[tourPos2]

    #swapping
    new_solution[tourPos1]=tourCity2
    new_solution[tourPos2]=tourCity1

    #get distance of both current_best and its neighbour 

    currentDistance = distan(current_best)

    neighbourDistance = distan(new_solution)


    # decide if we should accept the neighbour
    # random.random() returns a number in [0,1)

    if prob(currentDistance,neighbourDistance,temp) &gt; random.random():

        current_best = new_solution 

    # keep track of the best solution found  

    if distan(current_best) &lt;  distan(best):

        best = current_best

    #Cool system

    temp = temp*0.99995


print(distan(best)) 
</code></pre>

<p>Your problem is in the first line of your <code>while</code> loop, where you write</p>

<pre><code>new_solution= current_best 
</code></pre>

<p>What this does is puts a reference to the <code>current_best</code> list into <code>new_solution</code>. This means that when you change <code>new_solution</code>, you're actually changing <code>current_best</code> as well, which was not your intention. </p>

<p>The problem could be solved by replacing the problematic line with one that copies the list into a new list, like so:</p>

<pre><code>new_solution = list(current_best)
</code></pre>

python traveling-salesman simulated-annealing