【python】TSP问题

有一位商人,他想访问中国的某些城市,要求:

  1. 所走路程最近;

  2. 每个城市只能访问一次;

  3. 从某城市出发,最后回到该城市。

假设从合肥出发,最后回到合肥。
问题域: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)




在这里插入图片描述
欲知后事如何,且听下回分解
基于遗传算法求解TSP问题(JAVA)

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值