adding constraint
Answered
I want to write the above constraint in gurobi and and wrote its as following,
from gurobipy import *
n_time_horizon =120
n_total_phase = 5
n_dummy_phase = 5
n_min_green = 5
n_max_green = 10
n_start_phase = 1
n_start_time = 1
n_end_phase = 5
n_end_time = 120
n_total_node =16
t1 = 48 #starting time of coordination phase 1
t2 = 60 #ending time of coordination phase 1
t3 = 108 #starting time of coordination phase 2
t4 = 120 #ending time of coordination phase 2 time of coordination phase 2
n_o_start_node = list()
n_d_end_node = list()
node_departure_time =list()
p_phase_time_network = list()
p_phase_time_network_green_rest = list()
p_phase_time_non_green_arc_network = list()
s_space_time_network = list ()
s_space_time_network_without_waiting = list()
s_signal_arc_space_time_network = list()
s_non_signal_arc_space_time_network = list()
s_waiting_arc_for_space_time_network = list()
s_road_network_withstorgae = list()
s_road_node =list()
time = list ()
v_road_node_with_FFTT = list()
v_road_node_for_freeflow = list()
road_node = list()
v_signal_node = list()
v_non_signal_node = list()
v_road_signal_node = list()
v_road_non_signal_node = list()
v_road_waiting_node = list()
o_start_node_time = list()
d_end_node_time = list()
vehi_origin = list()
origin_time = list()
s_node_time = list()
origin_vit = list()
destination_vit = list()
intermediate_vit = list()
phi_vij_list = list()
vehicle_list = list()
mapping = list()
sr_rate_signal_arc = list()
sr_rate_non_signal_arc = list()
cost_phase_time = {}
cost_space_time = {}
l ={}
fftt = {}
c_vij = {}
to_vij = {}
phi_vij = {}
value_s = {}
map_ijp = {}
s_signal ={}
s_non_signal = {}
for i in range(1,n_total_node+1):
for t in range(1,n_time_horizon):
origin_time.append((i,t))
f_s = open("Origin_Destination_node.txt", "r")
line = f_s.readline()
while(len(line)):
line = line.strip('\n')
data = line.split()
s_start_node = int(data[0])
s_end_node = int(data[1])
s_traveltime = int(data[2])
s_link_storage = int(data[3])
s_road_network_withstorgae.append((s_start_node,s_end_node,s_link_storage))
s_road_node.append((s_start_node,s_end_node))
line = f_s.readline()
f_s.close()
f_vehi = open("V.txt", "r")
line = f_vehi.readline()
while(len(line)):
line = line.strip('\n')
data = line.split()
vehi = int(data[0])
vehicle_list.append((vehi))
line = f_vehi.readline()
f_vehi.close()
f_o = open("origin_destination_id.txt", "r")
line = f_o.readline()
while(len(line)):
line = line.strip('\n')
data = line.split()
o_start_node_1 = int(data[0])
d_end_node_1 = int(data[1])
n_o_start_node.append((o_start_node_1))
n_d_end_node.append((d_end_node_1))
line = f_o.readline()
f_o.close()
f_origin = open("vehicle_origin_time.txt", "r")
line = f_origin.readline()
while(len(line)):
line = line.strip('\n')
data = line.split()
o_veh_id = int(data[0])
o_start_node = int(data[1])
o_start_time = int(data[2])
o_start_node_time.append((o_start_node,o_start_time))
origin_vit.append((o_veh_id,o_start_node,o_start_time))
line = f_origin.readline()
f_origin.close()
f_destination = open("vehicle_destination_time.txt", "r")
line = f_destination.readline()
while(len(line)):
line = line.strip('\n')
data = line.split()
d_veh_id = int(data[0])
d_end_node = int(data[1])
d_end_time = int(data[2])
d_end_node_time.append((d_end_node,d_end_time))
destination_vit.append((d_veh_id,d_end_node,d_end_time))
line = f_destination.readline()
f_destination.close()
# =============================================================================
# Reading the input file for vehicle in network
# =============================================================================
f_v = open("Vehicle(v,i,t,j,s).txt", "r")
line = f_v.readline()
while(len(line)):
line = line.strip('\n')
data = line.split()
v_vehicle_id = int(data[0])
v_start_node = int(data[1])
v_end_node = int(data[2])
v_traveltime = int(data[3])
v_link_storage = int(data[4])
v_road_node_with_FFTT.append((v_start_node,v_end_node,v_traveltime))
road_node.append((v_start_node,v_end_node))
line = f_v.readline()
f_v.close()
f_vi = open("veh(v,i).txt", "r")
line = f_vi.readline()
while(len(line)):
line = line.strip('\n')
data = line.split()
vehicle_id = int(data[0])
network_node = int(data[1])
vehi_origin.append((vehicle_id,network_node))
line = f_vi.readline()
f_vi.close()
f_w = open("waiting arc.txt", "r")
line = f_w.readline()
while(len(line)):
line = line.strip('\n')
data = line.split()
v_vehicle_id = int(data[0])
v_start_node = int(data[1])
v_end_node = int(data[2])
v_road_waiting_node.append((v_start_node,v_end_node))
line = f_w.readline()
f_w.close()
f_v_s = open("vehicle_in_signal_arc.txt", "r")
line = f_v_s.readline()
while(len(line)):
line = line.strip('\n')
data = line.split()
v_vehicle_id = int(data[0])
v_start_node = int(data[1])
v_end_node = int(data[2])
v_traveltime = int(data[3])
v_signal_node.append((v_start_node,v_end_node))
v_road_signal_node.append((v_start_node,v_end_node,v_traveltime))
line = f_v_s.readline()
f_v_s.close()
f_v_non_s = open("vehicle_in_none_signal_arc.txt", "r")
line = f_v_non_s.readline()
while(len(line)):
line = line.strip('\n')
data = line.split()
v_vehicle_id = int(data[0])
v_start_node = int(data[1])
v_end_node = int(data[2])
v_traveltime = int(data[3])
v_non_signal_node.append((v_start_node,v_end_node))
v_road_non_signal_node.append((v_start_node,v_end_node,v_traveltime))
line = f_v_non_s.readline()
f_v_non_s.close()
f_sr = open("Saturation_rate.txt", "r")
line = f_sr.readline()
while(len(line)):
line = line.strip('\n')
data = line.split()
sr_origin_node = int(data[0])
sr_destination_node = int(data[1])
sr_saturation_rate = int(data[2])
line = f_sr.readline()
f_sr.close()
f_c_vij = open("c(v,i,j).txt", "r")
line = f_c_vij.readline()
while(len(line)):
line = line.strip('\n')
data = line.split()
veh_id = int(data[0])
last_link_startnode = int(data[1])
last_link_endnode = int(data[2])
c_vij[(veh_id,last_link_startnode,last_link_endnode)] = int(data[3])
line = f_c_vij.readline()
f_c_vij.close()
f_to_vij = open("to(v,i,j).txt", "r")
line = f_to_vij.readline()
while(len(line)):
line = line.strip('\n')
data = line.split()
veh_id = int(data[0])
first_link_startnode = int(data[1])
first_link_endnode = int(data[2])
to_vij[(veh_id,first_link_startnode,first_link_endnode)] = int(data[3])
line = f_to_vij.readline()
f_to_vij.close()
f_phi_vij= open("Phi(v,i,j).txt", "r")
line = f_phi_vij.readline()
while(len(line)):
line = line.strip('\n')
data = line.split()
veh_id = int(data[0])
last_link_start_node = int(data[1])
last_link_end_node = int(data[2])
phi_vij[(veh_id,last_link_start_node,last_link_end_node)] = int(data[3])
# phi_vij_list.append((veh_id,last_link_start_node,last_link_end_node))
line = f_phi_vij.readline()
f_phi_vij.close()
## =============================================================================
## Network_Construction
## =============================================================================
#
with open ("p_Phase_time_network.txt.txt","w") as file:
dummy_phase = n_dummy_phase
supersink = n_time_horizon
for u in range(0,n_time_horizon):
if u<=n_time_horizon:
u = u+1
for p in range(0,n_total_phase-1):
if p<=n_total_phase-1:
p=p+1
for q in range(0,n_total_phase-1):
if q<=n_total_phase:
q=q+1
if q==p:
continue
for w in range(n_min_green,n_max_green+1):
if w >= n_min_green and w <=n_max_green+1:
if w + u<=n_time_horizon:
w= w + u
p_phase_time_network.append((p,u,q,w))
p_phase_time_non_green_arc_network.append((p,u,q,w))
cost_phase_time[(p,u,q,w)] = 1
file.write(str((p,u,q,w))+"\n")
for p in range(0,n_total_phase-1):
if p==1 :
q=dummy_phase
w = n_time_horizon
if w == u:
continue
file.write(str((p,u,q,w))+"\n")
p_phase_time_network.append((p,u,q,w))
p_phase_time_network_green_rest.append((p,u,q,w))
cost_phase_time[(p,u,q,w)]=1
file.close()
road_arc_time = list()
for (i,j) in road_node:
for t in range(0,n_time_horizon):
if t<=n_time_horizon :
t = t+1
road_arc_time.append((i,j,t))
l[(i,j)] = 40
fftt[(i,j)] = 10
if i == 2 and j == 3:
l[(i,j)] =2
fftt[(i,j)] = 2
if i == 10 and j == 11:
l[(i,j)] = 2
fftt[(i,j)] = 2
s_space_time_network_wit_fftt = list()
with open ("S_Space_time_network.txt","w") as file:
# l[(i,j)] = 40
for (i,j,tt) in v_road_node_with_FFTT:
for t in range(0,n_time_horizon):
if t<=n_time_horizon :
t = t+1
if t+tt <= n_time_horizon:
h = t+tt
s= t+tt
value_s[(s)] = s
s_space_time_network_without_waiting.append((i,t,j,h))
s_space_time_network_wit_fftt.append((i,t,j,t+fftt[(i,j)]))
s_space_time_network.append((i,t,j,h))
file.write(str((i,t,j,h))+"\n")
for (i,j) in v_road_waiting_node:
for t in range (0,n_time_horizon):
if t<=n_time_horizon :
t = t+1
if t+1 <=n_time_horizon:
h = t+1
s_waiting_arc_for_space_time_network.append((i,t,j,h))
s_space_time_network.append((i,t,j,h))
file.write(str((i,t,j,h))+"\n")
file.close()
for v in vehicle_list:
for (i,t,j,h) in s_space_time_network:
cost_space_time[(v,i,t,j,h)] = 1
if i == 4 and j == 4 :
cost_space_time[(v,i,t,j,h)] = 0.0001
if i == 8 and j == 8:
cost_space_time[(v,i,t,j,h)] = 0.0001
if i == 12 and j == 12:
cost_space_time[(v,i,t,j,h)] = 0.0001
if i == 16 and j == 16:
cost_space_time[(v,i,t,j,h)] = 0.0001
for (v,i) in vehi_origin:
for t in range(0,n_time_horizon):
if t<=n_time_horizon :
t = t+1
s_node_time.append((v,i,t))
if (v,i,t) not in origin_vit and (v,i,t) not in destination_vit:
intermediate_vit.append((v,i,t))
with open ("S_Signal_arc_Space_time_network.txt","w") as file:
for (i,j,tt) in v_road_signal_node:
for t in range(0,n_time_horizon):
if t<=n_time_horizon :
t = t+1
if t+tt <= n_time_horizon:
h = t+tt
s_signal_arc_space_time_network.append((i,t,j,h))
cost_space_time[(i,t,j,h)] = 1
file.write(str((i,t,j,h))+"\n")
file.close()
with open ("S_non_Signal_arc_Space_time_network.txt","w") as file:
for (i,j,tt) in v_road_non_signal_node:
for t in range(0,n_time_horizon):
if t<=n_time_horizon :
t = t+1
if t+tt <= n_time_horizon:
h = t+tt
s_non_signal_arc_space_time_network.append((i,t,j,h))
cost_space_time[(i,t,j,h)] = 1
file.write(str((i,t,j,h))+"\n")
file.close()
for (i,j) in v_signal_node:
for p in range(1,n_total_phase):
mapping.append((i,j,p))
map_ijp[(i,j,p)] = 0
s_signal[(i,j)] = 0
if i == 2 and j == 3 and p == 3:
# mapping.append((i,j,p))
map_ijp[(i,j,p)] = 1
if i == 10 and j == 11 and p == 1:
# mapping.append((i,j,p))
map_ijp[(i,j,p)] = 1
if i == 2 and j == 3:
s_signal[(i,j)] = 1
if i == 10 and j == 11:
s_signal[(i,j)] = 1
for (i,j) in v_non_signal_node:
s_non_signal[(i,j)] = 1
a_tau_u = list()
a_tau_plus = list()
road_arc_in_FFTT = list()
for (i,j) in road_node:
# for t in range(1,n_time_horizon+1):
for u in range (1,n_time_horizon+1):
if u >=1 and u <= n_time_horizon:
road_arc_in_FFTT.append((i,u,j,u+fftt[(i,j)]))
a_tau_u.append((u))
m = Model("NEW")
x = {}
y = {}
for (i,t,j,h) in s_space_time_network:
for v in vehicle_list:
x[v,i,t,j,h] = m.addVar(vtype=GRB.BINARY, name ="s_space_time_network")
for (p,u,q,w) in p_phase_time_network:
y[p,u,q,w] = m.addVar(vtype=GRB.BINARY, name ="p_phase_time_network")
#_object_function
m.setObjective(sum([cost_phase_time[(p,u,q,w)]*y[p,u,q,w] for (p,u,q,w) in p_phase_time_network ]) -c_vij[(veh_id,last_link_startnode,last_link_endnode)]+to_vij[(veh_id,first_link_startnode,first_link_endnode)] +
sum([s*phi_vij[(veh_id,last_link_start_node,last_link_end_node)] *cost_space_time[(v,i,t,j,h)]*x[v,i,t,j,h] for v in vehicle_list for (i,t,j,h) in s_space_time_network]),GRB.MINIMIZE)
#link Storage Constraint
for (i,j) in road_node:
for t in range(1,n_time_horizon+1):
m.addConstr(sum([x[v,i,u,j,u+fftt[(i,j)]] for v in vehicle_list if u>=1 and u<=t]) - sum([x[v,j,u,i,u+fftt[(j,i)]] for v in vehicle_list for (j,i) in road_node if u>=1 and u<=t]) <= l[(i,j)],name = "cont_4")
m.write("m.lp")
m.optimize()
the bolded one in my constraint btw. and i am having following key error,
KeyError: (1, 1, 119, 2, 129) although i know these index are in my network. Could anyone can help with how to write the constraint? Thanks in advance.
-
Official comment
This post is more than three years old. Some information may not be up to date. For current information, please check the Gurobi Documentation or Knowledge Base. If you need more help, please create a new post in the community forum. Or why not try our AI Gurobot?. -
Hi Farzana,
Your code uses files to read in data. This makes it impossible for the community to reproduce the error. Moreover, your code is not properly edited, making it even harder to understand. Note that proper indenting is essential in Python.
Please post a minimal working example of your issue if the Community shall be able to help.
A minimal working example would consist of a code which hard codes the definition of
n_time_horizon = 120
road_node = [...]
vehicle_list = [...]
s_space_time_network = [...]
l = {...}
fftt = {...}
for (i,t,j,h) in s_space_time_network:
for v in vehicle_list:
x[v,i,t,j,h] = m.addVar(vtype=GRB.BINARY, name ="s_space_time_network")
#link Storage Constraint
for (i,j) in road_node:
for t in range(1,n_time_horizon+1):
m.addConstr(sum([x[v,i,u,j,u+fftt[(i,j)]] for v in vehicle_list if u>=1 and u<=t]) - sum([x[v,j,u,i,u+fftt[(j,i)]] for v in vehicle_list for (j,i) in road_node if u>=1 and u<=t]) <= l[(i,j)],name = "cont_4")In general, it seems like you define the list \(\texttt{s_space_time_network}\) such that the last entry in the tuples is defined from 1 to \(\texttt{n_time_horizon}\) but in the link Storage Constraint, you want to access \(\texttt{x}\) at \(\texttt{u+fftt[(i,j)]}\). Thus, when \(\texttt{u=n_time_horizon}\), you get a KeyError.
Best regards,
Jaromił0 -
This is a cross-post to Gurobi Python constraint adding.
0
Post is closed for comments.
Comments
3 comments