【问题标题】:Pyomo: KeyError: "Index '(0, 1, 1)' is not valid for indexed component 'x_ijl'"Pyomo:KeyError:“索引'(0,1,1)'对于索引组件'x_ijl'无效”
【发布时间】:2018-12-31 20:56:15
【问题描述】:

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

到目前为止我做了什么。

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。 请有人帮我正确编写这些约束

【问题讨论】:

    标签: python optimization pyomo


    【解决方案1】:

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

    【讨论】:

    • 谢谢@Bethany,它仍然没有工作。我得到了ValueError: No value for uninitialized NumericValue object x_ijl[1,2,1]。我知道这是由于索引不当造成的。当我将 x_ijl 初始化为零时,得到零 obj 值,当我更改为 1 时,得到不同的 obj 值(不可行)。我是 pyomo 新手,请原谅我糟糕的编码方式,我的问题是索引和约束,请您再帮我看看。
    猜你喜欢
    • 2021-12-22
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    相关资源
    最近更新 更多