TSP问题(python)
排序问题
读取文件格式:第一行为城市数目,剩余行为各城市坐标
(1) 城市全排列,在所有解决方案中选择最好的一个(解决20个城市的时候会有困难了(见维基百科))
# 生成全排列列表的函数
def permutation(xs):
if len(xs) == 0 or len(xs) == 1:
return [xs]
result = []
for i in xs:
temp_list = xs[:]
temp_list.remove(i)
temp = permutation(temp_list)
for j in temp:
j[0:0] = [i]
result.append(j)
return result
def solve_it(input_data):
# parse the input
lines = input_data.split('\n')
nodeCount = int(lines[0])
points = []
for i in range(1, nodeCount+1):
line = lines[i]
parts = line.split()
points.append(Point(float(parts[0]), float(parts[1])))
solution_sta = list(range(0,nodeCount))
#在全排列中挑选最小的
solutions = permutation(solution_sta)
obj_best = float("inf")
i = 0
for s in solutions:
obj = length(points[s[-1]], points[s[0]])
i += 1
for index in range(0, nodeCount-1):
obj += length(points[s[index]], points[s[index+1]])
if obj < obj_best:
obj_best = obj
solution = s
# prepare the solution in the specified output format
output_data = '%.2f' % obj + ' ' + str(0) + '\n'
output_data += ' '.join(map(str, solution))
return output_data
(2)贪心算法
每次寻找与当前结点最近的一个结点。从图的角度来看,也可看做是寻找一条最短的Hamilton回路。
@requires_authorization
import math
from collections import namedtuple
Point = namedtuple("Point", ['x', 'y'])
def length(point1, point2):
return math.sqrt((point1.x - point2.x)**2 + (point1.y - point2.y)**