Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pyomo:keyrerror:“;指数';(0,1,1)和#x27;对于索引组件无效';x#ijl'&引用;_Python_Optimization_Pyomo - Fatal编程技术网

Python Pyomo:keyrerror:“;指数';(0,1,1)和#x27;对于索引组件无效';x#ijl'&引用;

Python Pyomo:keyrerror:“;指数';(0,1,1)和#x27;对于索引组件无效';x#ijl'&引用;,python,optimization,pyomo,Python,Optimization,Pyomo,参考附件中的图像,我想使用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

参考附件中的图像,我想使用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()
从pyomo.environ导入*
从pyomo.opt导入SolverFactory
导入pyomo.environ
n=13
距离矩阵=[[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]] 
旅行时间=[[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]] 
时间窗口=[(14001500),(00002400),(00002400),(07002400),(00002400),(00000700),(07002400),(07002400),(00000700),(00002400)\
(0000,2400),(0000,2400),(0700,2400)]
服务时间=[0000,1600160180,30120120,60,30,30,90120330]
需求=[9999.00,9999.009999.00,12.00,4.00,6.00,8.00,16.00,6.00,16.00,12.00,24.00,8.00]
K=4辆车
C=280;#容量
速度=40;#默认速度
M=200;
startCity=0
模型=混凝土模型()
#设置
#model.M=设置(初始化=范围(1,n+1))
model.N=Set(初始化=范围(1,N+1))
model.K=Set(初始化=范围(1,K+1))
model.Nc=Set(initialize=range(3,n+1))#客户集
#Param
model.cost=Param(model.N,model.N,initialize=lambda模型,i,j:距离矩阵[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])#服务时间
model.demand=Param(model.N,initialize=lambda model,i:demand[i-1])
model.M=Param(initialize=M)
model.C=Param(initialize=C)
#变数
model.x_ijl=Var(model.N,model.N,model.K,in=Binary)#如果K中的车辆l在A中使用弧(i,j),则决策变量=1
model.d_il=Var(model.N,model.K,bounds=(0,None))#节点i in V处车辆l in K的累计需求
model.w_il=Var(model.N,model.K,bounds=(0,None))#车辆l in K在节点i in V处的服务开始时间
"""
收缩剂
"""
#所有l类车辆必须离开车辆段
def离开车辆段(l型):
返回和(模型N中j的模型x_ijl[0,j,l])=1
model.leave_depot=约束(model.K,rule=leave_depot)
#所有l类车辆必须返回车辆段
def返回仓库(l型):
返回和(模型N中i的模型x_ijl[i,0,l])=1
model.return\u depot=约束(model.K,rule=return\u depot)
#确保所有客户只接受一次服务。
def客户服务(j型):
模型N中i的返回和(模型K中l的和(模型x_ijl[i,j,l])==1
model.customer\u service1=约束(model.Nc,规则=customer\u services)
#除车辆段节点外,流入和流出必须相等
def流量(j、l型):
返回和(模型中i的模型x_ijl[i,j,l]如果ireturn model.Time_windows[i][0]问题是您在1而不是0开始索引集。将
m.x_ijl[0,j,l]
更改为
m.x_ijl[1,j,l]

谢谢@Bethany,它仍然不起作用。我得到了
ValueError:未初始化的NumericValue对象x_ijl[1,2,1]
没有值。我知道这是由于索引不当造成的。当我将x_ijl初始化为零时,得到了零obj值,当我更改为一时,得到了不同的obj值(不可行)。我是pyomo的新手,请原谅我糟糕的编码方式,我的问题是索引和约束,你能帮我再看一遍吗。
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'"