问题描述
我正在尝试以不同的方式解决 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 (将#修改为@)