求解TSP问题(python)(穷举、最近邻居法、opt-2法、动态规划、插入法)

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)**
  • 7
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值