Pyomo:KeyError:“索引”(0,1,1)“对于索引组件“x\u ijl”无效”

2024-05-20 03:49:13 发布

您现在位置:Python中文网/ 问答频道 /正文

参考附件中的图片,我想用pyomo建模。在

Description of the modelModel 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()

但是,我发现constraint 2有一个错误(来自图像2),我知道约束3和constraint 9也会出现类似的错误。错误是:

^{pr2}$

我的问题是建模约束2和约束3。 有人能帮我把这些约束写得正确吗


Tags: informodelreturntimeparamwindowsdef