Pyomo:KeyError:“索引'(0,1,1)'对于索引组件'x_ijl'无效”

时间:2018-07-24 09:30:14

标签: python optimization pyomo

参考附件中的图像,我想使用pyomo建模。

Description of the model Model Constraints

到目前为止我所做的。

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,7,6,8,6,7,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   ,9,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,5,9,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, 9,3,9,11,0, 9,11,11,6],
[5,9,8,12,8,10,8,5,9,0,6,7,5],
   [9,8,6,11,4,6,5,9,11,6,0,10,7],
   [4,7,10,6,11,5,9,6,11,7,10,0,9],
   [10,5,8,9,10,7,10,7,6,5,7,9,0]] 

travel_time=[[0,8,4,10,12,9,15,8,11,5,9,4,10],
[8,0,7,6,8,6,7,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   ,9,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,5,9,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, 9,3,9,11,0, 9,11,11,6],
[5,9,8,12,8,10,8,5,9,0,6,7,5],
   [9,8,6,11,4,6,5,9,11,6,0,10,7],
   [4,7,10,6,11,5,9,6,11,7,10,0,9],
   [10,5,8,9,10,7,10,7,6,5,7,9,0]] 

Time_windows = [(1400,1500), (0000,2400), (0000,2400),(0700,2400),(0000,2400),(0000,0700),(0700,2400),(0700,2400),(0000,0700),(0000,2400),\
        (0000,2400),(0000,2400),(0700,2400)]

Service_time = [0000, 1600,1600,180,30,120,120,60,30,30,90,120,330]

demand = [9999.00, 9999.00,9999.00,12.00, 4.00, 6.00, 8.00,16.00,6.00,16.00,12.00,24.00,8.00]
K = 4 # no. of vehicles
C = 280; # capacity
speed = 40; # default speed
M = 200; 
startCity = 0

model = ConcreteModel()

# sets
#model.M = Set(initialize=range(1, n+1))
model.N = Set(initialize=range(1, n+1))
model.K = Set(initialize=range(1, K+1))
model.Nc = Set(initialize=range(3, n+1)) # set of customers


# Param
model.cost = Param(model.N, model.N, initialize=lambda model, i, j: distanceMatrix[i-1][j-1])
model.travel_time = Param(model.N, model.N,initialize=lambda model, i,j: travel_time[i-1][j-1])
model.Time_windows = Param(model.N, initialize=lambda model, i: travel_time[i-1])       # time_windows
model.Service_time = Param(model.N, initialize=lambda model, i:   Service_time[i-1]) # Service time
model.demand = Param(model.N, initialize=lambda model, i: demand[i-1])
model.M = Param(initialize=M)
model.C = Param(initialize=C)

# variables
model.x_ijl = Var(model.N, model.N, model.K, within=Binary)  # decision     variable = 1 iff vehicle l in K uses arc (i,j) in A 
model.d_il = Var(model.N, model.K, bounds=(0,None))          # the accumulative demand at node i in V for vehicle l in K
model.w_il = Var(model.N, model.K, bounds=(0,None))          # start time of service at node i in V for vehicle l in K

"""
Constriants
"""

# All l vehicles must leave the depot
def leave_depot(model,l):
    return sum(model.x_ijl[0,j,l] for j in model.N) == 1
model.leave_depot = Constraint(model.K, rule=leave_depot)

# All l vehicles must return to the depot
def return_depot(model,l):
    return sum(model.x_ijl[i,0,l] for i in model.N) == 1
model.return_depot = Constraint(model.K, rule=return_depot)

# ensures that all customers are serviced exactly once.
def customer_service(model, j):
    return sum(sum(model.x_ijl[i,j,l] for l in model.K) for i in model.N) ==1
model.customer_service1 = Constraint(model.Nc, rule=customer_service)

# Inflow and outflow must be equal except for the depot nodes
def flow(model,j,l):
    return sum(model.x_ijl[i,j,l] for i in model.N if i < j) ==     sum(model.x_ijl[j,i,l] for i in model.N if j < i)
model.flow1 = Constraint(model.N,model.K, rule=flow)

# Time windows
def time_windows1(model,i,l):
    return model.Time_windows[i][0] <=model.w_il[i,l] <=   model.Time_windows[i][1]
model.time_windows = Constraint(model.N,model.K, rule=time_windows1)

# service time
def service_time(model,i,j,l):
    return model.w_il[i,l] + model.Service_time[i] + model.travel_time[i,j] <= model.w_il[j,l] + (1 - model.x_ijl[i,j,l])*200
model.service_time = Constraint(model.N, model.N, model.K, rule=service_time)


# vehicle must be empty at start and end of routes
def empty(model, l):
    return model.d_il[0,l] + model.d_il[-1,l] == 0
model.empty = Constraint(model.K, rule=empty)

# accumulative demand for all nodes except disposal sites
def demands_forall_nodes(model,i,j,l):
    return model.d_il[i,l] + model.demand[i] <= model.d_il[j,l]+(1 - model.x_ijl[i,j,l]*200)
model.demands_forall_nodes = Constraint(model.Nc, model.N,model.K,rule=demands_forall_nodes)


# Capacity contraints
def vehicle_capacity(model, i,l):
    return model.d_il[i,l] <= model.C
model.vehicle_capacity = Constraint(model.N, model.K, rule=vehicle_capacity)

# Objective Function
def objective(model):
    return sum(model.cost[i,j]*model.x_ijl[i,j,l] for i in model.N for j in model.N for l in model.K)
model.obj = Objective(rule=objective)


opt = SolverFactory("glpk")
results = opt.solve(model, tee=True)
results.write()

但是,我遇到了约束2(来自图2)的错误,我知道类似的情况将适用于约束3和约束9。错误是:

ERROR: Rule failed when generating expression for constraint leave_depot with
index 1: KeyError: "Index '(0, 1, 1)' is not valid for indexed component
'x_ijl'"
ERROR: Constructing component 'leave_depot' from data=None failed: KeyError:
"Index '(0, 1, 1)' is not valid for indexed component 'x_ijl'"
Traceback (most recent call last):
 File "vrptwModel.py", line 81, in <module>
model.leave_depot = Constraint(model.K, rule=leave_depot)
 File "/usr/local/lib/python2.7/dist-packages/pyomo/core/base/block.py", line 540, in __setattr__
self.add_component(name, val)
 File "/usr/local/lib/python2.7/dist-packages/pyomo/core/base/block.py", line 980, in add_component
val.construct(data)
 File "/usr/local/lib/python2.7/dist-packages/pyomo/core/base/constraint.py", line 793, in construct
ndx)
 File "/usr/local/lib/python2.7/dist-packages/pyomo/core/base/misc.py", line 61, in apply_indexed_rule
return rule(model, index)
 File "vrptwModel.py", line 80, in leave_depot
return sum(model.x_ijl[0,j,l] for j in model.N) == 1
 File "vrptwModel.py", line 80, in <genexpr>
return sum(model.x_ijl[0,j,l] for j in model.N) == 1
 File "/usr/local/lib/python2.7/dist-packages/pyomo/core/base/indexed_component.py", line 543, in __getitem__
index = self._validate_index(index)
 File "/usr/local/lib/python2.7/dist-packages/pyomo/core/base/indexed_component.py", line 695, in _validate_index
% ( idx, self.name, ))
KeyError: "Index '(0, 1, 1)' is not valid for indexed component 'x_ijl'"

我的问题是建模约束2和3。 请有人可以帮助我正确编写这些约束条件

1 个答案:

答案 0 :(得分:1)

问题是您从1而不是0开始建立索引集。将m.x_ijl[0,j,l]更改为m.x_ijl[1,j,l]