使用Gurobi求解TSP问题(Python)

利用gurobi实现经典TSP问题的求解,仅用于熟悉gurobi的使用,适合初学者阅读学习。

TSP问题的模型十分经典,不再赘述。

本文使用该文章(旅行商问题(TSP)建模方法_赖克凡的博客-CSDN博客_tsp旅行商

中的模型进行实现:

整体流程十分简单,直接上代码

'利用gurobi求解TSP问题'
'2022.10.24 北京交通大学 韬会'

from gurobipy import *
import numpy as np

# 直接给出距离矩阵
distmat = np.array([[0, 350, 290, 670, 600, 500, 660, 440, 720, 410, 480, 970],
                    [350, 0, 340, 360, 280, 375, 555, 490, 785, 760, 700, 1100],
                    [290, 340, 0, 580, 410, 630, 795, 680, 1030, 695, 780, 1300],
                    [670, 360, 580, 0, 260, 380, 610, 805, 870, 1100, 1000, 1100],
                    [600, 280, 410, 260, 0, 610, 780, 735, 1030, 1000, 960, 1300],
                    [500, 375, 630, 380, 610, 0, 160, 645, 500, 950, 815, 950],
                    [660, 555, 795, 610, 780, 160, 0, 495, 345, 820, 680, 830],
                    [440, 490, 680, 805, 735, 645, 495, 0, 350, 435, 300, 625],
                    [720, 785, 1030, 870, 1030, 500, 345, 350, 0, 475, 320, 485],
                    [410, 760, 695, 1100, 1000, 950, 820, 435, 475, 0, 265, 745],
                    [480, 700, 780, 1000, 960, 815, 680, 300, 320, 265, 0, 585],
                    [970, 1100, 1300, 1100, 1300, 950, 830, 625, 485, 745, 585, 0]])

node_num = len(distmat)

# 模型构建
m = Model('tsp')
# 添加变量
x = m.addVars(node_num, node_num, vtype=GRB.BINARY, name='x')
u = m.addVars(node_num, vtype=GRB.CONTINUOUS, name='u')

# 设置目标函数
m.setObjective(sum(distmat[i][j] * x[i, j] for i in range(node_num) for j in range(node_num)), GRB.MINIMIZE)

# 添加限制
m.addConstrs(sum(x[i, j] for i in range(node_num) if i != j) == 1 for j in range(node_num))
m.addConstrs(sum(x[i, j] for j in range(node_num) if i != j) == 1 for i in range(node_num))
m.addConstrs(
    (u[i] - u[j] + node_num * x[i, j]) <= node_num - 1 for i in range(1, node_num) for j in range(1, node_num) if
    i != j)


m.write('tsp.lp')  # 写出来看看模型的样子
m.optimize()

print(m.ObjVal)

# 找到那些是1的变量
result = []
for i in range(node_num):
    for j in range(node_num):
        if x[i, j].X == 1:
            result.append([i, j])
print(result)

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值