我为 TSP 编写了这段模拟退火代码,我一整天都在尝试调试它,但出了点问题
I write this code of Simulated Annealing for TSP and I have been trying all day to debug it but something goes wrong
此代码旨在减少初始游览的距离: distan(initial_tour) < distan(best) 。你能帮我吗?我一整天都在努力。 我需要改变交换方式吗?
出问题了,模拟退火不起作用:
def prob(currentDistance,neighbourDistance,temp):
if neighbourDistance < 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 >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) > random.random():
current_best = new_solution
# keep track of the best solution found
if distan(current_best) < distan(best):
best = current_best
#Cool system
temp = temp*0.99995
print(distan(best))
你的问题出在你的 while
循环的第一行,你写
new_solution= current_best
它所做的是将对 current_best
列表的引用放入 new_solution
。这意味着当您更改 new_solution
时,您实际上也在更改 current_best
,这不是您的本意。
可以通过将有问题的行替换为将列表复制到新列表中的行来解决问题,如下所示:
new_solution = list(current_best)
此代码旨在减少初始游览的距离: distan(initial_tour) < distan(best) 。你能帮我吗?我一整天都在努力。 我需要改变交换方式吗? 出问题了,模拟退火不起作用:
def prob(currentDistance,neighbourDistance,temp):
if neighbourDistance < 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 >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) > random.random():
current_best = new_solution
# keep track of the best solution found
if distan(current_best) < distan(best):
best = current_best
#Cool system
temp = temp*0.99995
print(distan(best))
你的问题出在你的 while
循环的第一行,你写
new_solution= current_best
它所做的是将对 current_best
列表的引用放入 new_solution
。这意味着当您更改 new_solution
时,您实际上也在更改 current_best
,这不是您的本意。
可以通过将有问题的行替换为将列表复制到新列表中的行来解决问题,如下所示:
new_solution = list(current_best)