微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 TSP 中实现顺序公式Miller、Tucker、Zemlin

如何解决在 TSP 中实现顺序公式Miller、Tucker、Zemlin

我正在尝试以不同的方式解决 TSP。我已经用 Dantzig、Fulkerson 和 Johnson 的公式做了,现在我想使用 Miller、Tucker、Zemlin 约束。

enter image description here

我有点卡住了,因为我不知道如何实现它,而且我在互联网上找不到任何有用的东西。有人知道怎么做吗?

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 举报,一经查实,本站将立刻删除。