猿问

pyomo:为pyomo中的tsp绘制最佳路线

我仍在学习pyomo,到目前为止,我已经取得了一些进展:


这个链接!给出了pyomo中的tsp示例。我复制了以下代码。而且一切正常。但是,我无法打印出最佳路线,有人可以帮忙或者给我一个关于如何打印和绘制最佳路线的思路吗?


编码:


from pyomo.environ import * 

from pyomo.opt import SolverFactory

import pyomo.environ


n=13

distanceMatrix=[[0,8,4,10,12,9,15,8,11,5,9,4,10],

[8,0,27,6,8,6,17,10,12,9,8,7,5],

[4,7,0,7,9,5,8,5,4,8,6  ,10,8],

[10,6   ,7,0,6,11,5 ,9,8,12,11,6,9],

[12,8   ,19,6,   0,7,9,6,9,8,4,11,10],

[9,6,5,11,7,0,10,4,3,10,6,5,7],

[15,7   ,8,15,19,10,0,10,9,8,5,9,10],

[8,10   ,5,9,6,4,10,0,11,5,9,6,7],

[11,12,4,8, 19,13,9,11,0, 9,11,11,6],

[5,9,8,12,8,10,8,5,9,0,6,7,5],

   [9,8,6,11,14,6,5,9,11,6,0,10,7],

   [4,7,10,6,31,5,9,6,11,7,10,0,9],

   [10,5,8,9,10,7,10,7,6,5,7,9,0]] 

startCity = 0


model = ConcreteModel()

model.M = Set(initialize=range(1, n+1))

model.N = Set(initialize=range(1, n+1))

model.c = Param(model.N, model.N, initialize=lambda model, i, j:    distanceMatrix[i-1][j-1])

model.x = Var(model.N, model.N, within=Binary)



def obj_rule(model):  


    return sum(model.c[n,j]*model.x[n,j] for n in model.N for j in model.N)

model.obj = Objective(rule=obj_rule,sense=minimize)


def con_rule(model, n):

    return sum(model.x[j,n] for j in model.N if j < n) + sum(model.x[n,j]   for j in model.N if j > n) == 2


model.con = Constraint(model.N, rule=con_rule,doc='constraint1')

opt = SolverFactory("glpk")

results = opt.solve(model)

results.write()

print('Printing Values')

print(value(model.obj))


qq_笑_17
浏览 228回答 1
1回答

一只甜甜圈

首先,您必须考虑解决方案采用的形式。如果我们看一下这个实现,我们就会看到矩阵x的维数为NxN,域二进制为0或1。考虑元素x [j] [k]等于1的含义。如果j <k或j> k,这意味着什么?要提取x的值,一种简单的方法可能是import numpy as npN = len(model.N)x = np.zeros((N,N))for (i,j), val in model.x.get_values().items():&nbsp; &nbsp; x[i-1,j-1] = val然后,您可以根据需要使用x的值。
随时随地看视频慕课网APP

相关分类

Python
我要回答