利用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)