Query on the use of addMVar
AnsweredHello I am solving an optimization problem, I have finished my code but it turns out that when I execute all my response values are zero. I'm not sure if I'm doing my code wrong or what's wrong. I attach my code, in addition to the restrictions with which I am working.
# COLOCACION Y CONFIGURACION OPTIMA DE UNIDADES DE CARRETERA EN REDES VEHICULARES.
# Definicion de librerias
from gurobipy import *
import numpy as np
import matplotlib.pyplot as plt
import random
# Extraccion de los datos del archivo de texto
f = open("datos_RSU.txt", "r")
contents = [] # creacion de los vectores necesarios
fin_contents = []
for _ in range(11): # defino el numero de lineas del file
str = f.readline() # lectura del file
content = str.split() # divido el vector
contents.append(content) # forma una lista de listas
for i in range(10):
fin_cont = [int(cont) for cont in contents[i]]
# lo convierto a numeros enteros
fin_contents.append(fin_cont) # lista de listas
N = fin_contents[0][0] # linea 1 identificada cantidad de RSU propuestas.
calles = fin_contents[1][0] # linea 2 identificada conjunto de calles.
X = np.asarray(fin_contents[2]) # linea 3 identificada ubicaciones en eje X de RSU.
Y = np.asarray(fin_contents[3]) # linea 4 identificada ubicaciones en eje Y de RSU.
P = np.asarray(fin_contents[4]) # linea 5 niveles de potencia de antenas.
A = np.asarray(fin_contents[5]) # linea 6 tipos de antenas.
R = np.asarray(fin_contents[6]) # linea 7 nivel de trafico.
Naccident = fin_contents[7][0] # linea 8 identifica puntos de alta insidencia.
Xca = np.asarray(fin_contents[8]) # linea 9 ubicacion x de alta insidencia.
Yca = np.asarray(fin_contents[9]) # linea 10 ubicacion y de alta insidencia.
# Definicion de parametros usados en el modelo
S = [i for i in range(calles) if i != 0]
rsu = [i for i in range(N) if i != 0]
Caccident = [i for i in range(Naccident) if i!=0]
nhops = 2
max_distancia = 200
Costo_LAN = 1
Costo_wifi = 1000
delta = 1
C = [(i, j) for i in X for j in Y]
acc_xy = (Xca, Yca)
# Figura 1
for i in X:
for j in Y:
circle1 = plt.Circle((i, j), 80, color='yellow')
plt.gca().add_patch(circle1)
for i in Xca:
for j in Yca:
circle1 = plt.Circle((i, j), 60, color='magenta')
plt.gca().add_patch(circle1)
plt.scatter(X, Y, color="red")
plt.scatter(Xca, Yca, color="black")
plt.xlim(-200, 1000)
plt.ylim(-200, 1100)
lx = []
ly = []
r = random.choice(R)
for i in range(r):
X_e = (random.randrange(-10, 400, 10))
Y_e = (random.randrange(0, 1100, 10))
V_r = (X_e, Y_e)
plt.scatter(X_e, Y_e, color="Blue")
lx.append(X_e)
ly.append(Y_e)
print(r)
coches = [i for i in range(r) if i != 0]
arc_coches = [0] + coches
for i in rsu:
plt.annotate('$%d$' % (i), (X[i], Y[i] + 25), color='red')
plt.xlabel("Distancia X")
plt.ylabel("Distancia Y")
plt.title("Coches(Azul), RSU(Rojo) y Zonas de alta incidencia (Negro)")
plt.show()
# Funciones para comunicacion coche-rsu
ss = np.zeros((len(coches), len(rsu)))
for i in range(len(coches)):
for j in range(len(rsu)):
if np.hypot(lx[i] - X[j + 1], ly[i] - Y[j + 1]) < max_distancia:
ss[i][j] = 1
print(ss)
distancia_a_la_rsu = []
for i in range(len(coches)):
for j in range(len(rsu)):
distancia_a_la_rsu.append(round(np.hypot(lx[i] - X[j + 1], ly[i] - Y[j + 1])))
vector = np.array(distancia_a_la_rsu)
nuevo = np.reshape(vector, (r - 1, N - 1))
ahorasi = nuevo.min(1)
t = (r - 1, N - 1)
ceros = np.zeros(t)
otra = []
for i in range(len(nuevo - 1)):
for j in range(N - 1):
if nuevo[i, j] == ahorasi[i]:
ceros[i, j] = 1
nodos = [0] + rsu
arcos_Dij = [(i, j) for i in coches for j in nodos] #arcos contiene la descripcion de Dij
arcos_Hij= [(i, j) for i in coches for j in coches if i!=j] #arcos contiene la descripcion de Hij
arcos_Kij= [(i, j) for i in nodos for j in Caccident] #arcos contiene la descripcion de Kij
arcos_Iijkmn= [(i, j, k, m, n) for i in S for j in nodos for k in A for m in P for n in R] #arcos contiene la descripcion de Iij
distancia = {(i, j): round(np.hypot(X[i] - lx[j], Y[i] - ly[j]), 2) for i in nodos for j in arc_coches}
tiempo = {(i, j): round(np.hypot(X[i] - lx[j], Y[i] - ly[j]), 2) for i in nodos for j in arc_coches}
arco_var = [(i, j, k) for i in nodos for j in nodos for k in coches if i != j]
# Estructura del modelo
model = Model('RSU.log')
xijk = [(i, j, k) for i in nodos for j in A for k in P]
zik = [(i, k) for i in nodos for k in P]
yi = [(i) for i in nodos]
hij = [(i, j) for i in S for j in R]
ri = [(i) for i in R]
mx = [(i, j) for i in nodos for j in P]
d = [(round(np.hypot(X[i] - lx[j], Y[i] - ly[j]))) for i in nodos for j in arc_coches]
mj = []
mij = (d, P)
for i in d:
for j in P:
mi = i * j
mj.append(round(mi))
result = []
for item in mj:
if item not in result:
result.append(item)
# Variables de decision
I = model.addVars(arcos_Iijkmn, vtype=GRB.BINARY, name="I")
D = model.addVars(arcos_Dij, vtype=GRB.BINARY, name="D")
H = model.addVars(arcos_Hij, vtype=GRB.CONTINUOUS, name="H")
K = model.addVars(arcos_Kij, vtype=GRB.CONTINUOUS, name="K")
x = model.addVars(xijk, vtype=GRB.BINARY, name="x")
y = model.addVars(yi, vtype=GRB.BINARY, name="y")
z = model.addVars(zik, vtype=GRB.BINARY, name="z")
h = model.addVars(hij, vtype=GRB.CONTINUOUS, name="h")
m = model.addVars(mx, vtype=GRB.BINARY, name="m")
r = model.addVars(ri, vtype=GRB.CONTINUOUS, name="r")
print("valor de x: ", x)
print("valor de y: ", y)
print("valor de z: ", z)
print("valor de h: ", h)
print("valor de r: ", r)
print("valor de m: ", m)
# Definicion del modelo
model.setObjective(quicksum(m[i, k] * z[i, k] for i, k in zik), GRB.MINIMIZE)
model.addConstrs(quicksum(x[i, j, k] for j in A for k in P) <= 1 for i in nodos)
model.addConstrs(quicksum(x[i, j, k] for j in A for k in P) == y[i] for i in nodos)
model.addConstrs(quicksum(x[i, j, k] for j in A) == z[i, k] for i in nodos for k in P)
model.addConstrs(quicksum(I[i, j, k, m, n] * x[j, k, m] for j, k, m in xijk) >= h[i, n] for i, n in hij)
model.addConstrs(quicksum(h[i, j] for i in S) >= r[j] for j in R)
model.addConstr(quicksum(K[i, j] * y[j] for i,j in arcos_Kij) >= 1)
model.update()
model.Params.LogFile = 'RSU.log'
model.optimize()
print("valor de x: ", x)
print("valor de y: ", y)
print("valor de z: ", z)
print("valor de h: ", h)
print("valor de r: ", r)
print("valor de m: ", m)
# Figura 2
plt.figure(2)
plt.scatter(lx, ly, color='blue')
plt.scatter(X[0:], Y[0:], color='red', marker="D")
plt.scatter(Xca[0:], Yca[0:], color='black', marker="X")
for i in rsu:
plt.annotate('$%d$' % (i), (X[i], Y[i] + 25), color='red')
for i in arc_coches:
plt.annotate('$%d$' % (i), (lx[i - 1] + 10, ly[i - 1] - 5.5))
col = ['magenta', 'green', 'blue', 'black', 'cyan', 'red', 'magenta', 'red', 'magenta', 'green', 'blue', 'black',
'cyan', 'red', 'magenta', 'red']
for i in arc_coches:
for j in rsu:
if ss[i - 1][j - 1] == 1:
plt.plot([lx[i - 1], X[j]], [ly[i - 1], Y[j]], '--', color=col[j], alpha=0.7)
plt.xlim(-100, 1100)
plt.ylim(-100, 1100)
plt.xlabel("Distancia X")
plt.ylabel("Distancia Y")
plt.title("coche-rsu Problem")
plt.show()
# Figura 3
plt.figure(3)
plt.scatter(lx, ly, color='blue')
plt.scatter(X[0:], Y[0:], color='red', marker="D")
plt.scatter(Xca[0:], Yca[0:], color='black', marker="X")
for i in rsu:
plt.annotate('$%d$' % (i), (X[i], Y[i] + 25), color='red')
for i in arc_coches:
plt.annotate('$%d$' % (i), (lx[i - 1] + 10, ly[i - 1] - 5.5))
col = ['magenta', 'green', 'blue', 'black', 'cyan', 'red', 'magenta', 'red', 'magenta', 'green', 'blue', 'black',
'cyan', 'red', 'magenta', 'red']
for i in arc_coches:
for j in rsu:
if ceros[i - 1][j - 1] == 1:
plt.plot([lx[i - 1], X[j]], [ly[i - 1], Y[j]], '--', color=col[j], alpha=0.7)
plt.xlim(-100, 1100)
plt.ylim(-100, 1100)
plt.xlabel("Distancia X")
plt.ylabel("Distancia Y")
plt.title("Antena mas cercana")
plt.show()
Data entered into the model:
10
5
10 10 10 10 10 200 200 200 200 200
10 200 350 700 1000 10 200 350 700 1000
10 8 6
3
30 20 10
3
10 10 10
250 523 900
0
-
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 try Gurobot, our chatbot interface offering instant, expert-level support. -
Hi Carlos,
You should write you model to a human readable file via the write method
model.write("myModel.lp")This method will write a file called \(\texttt{myModel.lp}\) which you can then analyze. This way, you can find out whether all your variables and constraints are defined correctly.
Best regards,
Jaromił0
Post is closed for comments.


Comments
2 comments