pyomo:在 pyomo 中绘制 tsp 的最佳路线
pyomo: plotting the optimal route for tsp in pyomo
我还在学习pyomo,到目前为止我已经取得了一些进步:
这个link!给出了 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))
首先你必须考虑解决方案采用什么形式。如果我们看一下这个实现,我们会看到矩阵 x 的维度 NxN 和域 binary(0 或 1)。想一想元素 x[j][k] 等于 1 意味着什么。如果 j < k 或 j > k 又意味着什么?
要提取 x 的值,一个简单的方法可能是
import numpy as np
N = len(model.N)
x = np.zeros((N,N))
for (i,j), val in model.x.get_values().items():
x[i-1,j-1] = val
然后您可以随意使用 x 的值。
我还在学习pyomo,到目前为止我已经取得了一些进步:
这个link!给出了 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))
首先你必须考虑解决方案采用什么形式。如果我们看一下这个实现,我们会看到矩阵 x 的维度 NxN 和域 binary(0 或 1)。想一想元素 x[j][k] 等于 1 意味着什么。如果 j < k 或 j > k 又意味着什么?
要提取 x 的值,一个简单的方法可能是
import numpy as np
N = len(model.N)
x = np.zeros((N,N))
for (i,j), val in model.x.get_values().items():
x[i-1,j-1] = val
然后您可以随意使用 x 的值。