如何解决在 TSP 中实现顺序公式Miller、Tucker、Zemlin
我正在尝试以不同的方式解决 TSP。我已经用 Dantzig、Fulkerson 和 Johnson 的公式做了,现在我想使用 Miller、Tucker、Zemlin 约束。
我有点卡住了,因为我不知道如何实现它,而且我在互联网上找不到任何有用的东西。有人知道怎么做吗?
import numpy as np
import matplotlib.pyplot as plt
from docplex.mp.model import Model
import docplex.mp.solution as Solution
# for sequentiel solving
from itertools import product
cost = np.loadtxt('matrix_time-independent_2017to2019_delete.txt')
cities=[i for i in range(len(cost))]
#print(cities)
arcs =[(i,j) for i in cities for j in cities if i!=j]
distance={(i,j): cost[i,j] for i,j in arcs}
#print(distance)
# CPLEX model
mdl=Model('TSP')
# decision variables
x=mdl.binary_var_dict(arcs,name='x')
d=mdl.continuous_var_dict(cities,name='d')
mdl.minimize(mdl.sum(distance[i]*x[i] for i in arcs))
# Constraints
for c in cities:
mdl.add_constraint(mdl.sum(x[(i,j)] for i,j in arcs if i==c)==1,ctname='out_%d'%c)
for c in cities:
mdl.add_constraint(mdl.sum(x[(i,j in arcs if j==c)==1,ctname='in_%d'%c)
# conventional way to eliminate subtours (Dantzig,Fulkerson and Johnson)
for i,j in arcs:
if j!=0:
mdl.add_indicator(x[(i,j)],d[i]+1==d[j],name='order_(%d,_%d)'%(i,j))
# sequential formulation (Miller,Tucker,Zemlin)
for (i,j) in arcs:
if i != j:
???
print(mdl.export_to_string())
# possible to add constraint
mdl.parameters.timelimit=120
mdl.parameters.mip.strategy.branch=1
mdl.parameters.mip.tolerances.mipgap=0.15
solution = mdl.solve(log_output=True)
mdl.get_solve_status()
solution.display()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。