有一位商人,他想访问中国的某些城市,要求:
所走路程最近;
每个城市只能访问一次;
从某城市出发,最后回到该城市。
假设从合肥出发,最后回到合肥。
问题域:X={北京,成都,广州,上海}
目标函数:min f(x)=dist(合肥,city1) + ∑dist(cityi,cityj) + dist(cityj,合肥)
回溯算法,观察所有的路线
city = ['北京','成都','广州','上海']
def backtrack(first):
if(first == len(city)):
print(city)
return
for i in range(first,len(city)):
city[i],city[first] = city[first],city[i]
backtrack(first+1)
city[i], city[first] = city[first], city[i]
if __name__ == '__main__':
backtrack(0)
在不考虑两个顶点不可达的情况下
import sys
city_distance = [[0, 3, 1, 5, 8],
[3, 0, 6, 7, 9],
[1, 6, 0, 4, 2],
[5, 7, 4, 0, 3],
[8, 9, 2, 3, 0]]
#city_distance[i][j] 表示顶点i到顶点j的距离
city = [i for i in range(1,len(city_distance))] #除去出发点的城市序号
len = len(city)
bestCost = sys.maxsize #最优路线的路程
def backtrack(first):
if(first == len):
sum = 0
sum += city_distance[0][city[0]]
for i in range(1,len):
sum += city_distance[city[i-1]][city[i]]
sum += city_distance[city[len-1]][0]
print(city," ",sum)
global bestCost
bestCost = min(bestCost,sum)
return
for i in range(first,len):
city[i],city[first] = city[first],city[i]
backtrack(first+1)
city[i], city[first] = city[first], city[i]
if __name__ == '__main__':
backtrack(0)
print(bestCost)
考虑两个顶点不可达的情况:
import sys
city_distance = [[0, 3, 1, 5, 8],
[3, 0, 6, 7, 9],
[1, 6, 0, 4, -1],
[5, 7, 4, 0, 3],
[8, 9, -1, 3, 0]]
#city_distance[i][j] 表示顶点i到顶点j的距离
city = [i for i in range(1,len(city_distance))] #除去出发点的城市序号
len = len(city)
bestCost = sys.maxsize #最优路线的路程
def backtrack(first,sum):
if(first == len):
t = city_distance[city[len-1]][0]
if t == -1: #表明该条路线走不通
return
sum += t
print(city," ",sum)
global bestCost
bestCost = min(bestCost,sum)
return
for i in range(first,len):
city[i],city[first] = city[first],city[i]
if (first == 0):
t = city_distance[0][city[first]]
else:
t = city_distance[city[first - 1]][city[first]]
if( t == -1): #表明该条路线走不通
continue
backtrack(first+1,sum + t)
city[i], city[first] = city[first], city[i]
if __name__ == '__main__':
backtrack(0,0)
print(bestCost)