-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.py
188 lines (135 loc) · 5.94 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#Para los resultados se debe crear un txt con los resultados. Es mejor que un pdf porque no necesita
#librerías externas. Hacer esto una vez que se esté seguro que los resultados están buenos.
from gurobipy import Model, GRB, quicksum
from datos.creacion_datos import F, n, b, d, v, minc, maxc, z, exp, u, PR, V
import random
import csv
#Cantidad de días
T = 28
# Cantidad de productos
P = 100
# Rangos
T_ = range(1, T + 1)
E_ = range(1, T + 1)
P_ = range(1, P + 1)
Q_ = ["R", "C", "A"]
N_ = range(0, int(T/7) - 1)
# Parametros:
# Costo Fijo por hacer un pedido de p el día t
# Costo de una unidad de p en el día t.
# Precio por guardar una unidad del producto p en bodega desde el dıa t al t + 1
# Volumen máximo que se puede almacenar en la bodega del tipo de producto q
# Volumen que ocupa una unidad del producto p
# Demanda del producto p en el dıa t.
# Mınima cantidad que se puede pedir del producto p
# Volumen máximo que se puede transportar del producto p.
# Presupuesto inicial
# Precio de venta del producto p
# Cantidad de días para que se venza p después de haberlo comprado.
# Costo de desechar un producto p debido a que esta vencido.
############### MODELO ###############
model = Model()
#### Variables
# Cantidad comprada del producto p en el día t que vence en e días
c = model.addVars(P_, T_, E_)
# Si se decide comprar el producto p en el dia t
C = model.addVars(P_, T_, vtype = GRB.BINARY)
# Cantidad vendida del producto p en el dıa t que vencıa en e dıas.
s = model.addVars(P_,T_,E_)
# Cantidad en el inventario del producto p al final del dıa t que vence en e dıas.
i = model.addVars(P_,range(0, T + 1),E_)
# Cantidad de p desechada al final del dıa t, porque vence en t + 1.
w = model.addVars(P_, T_)
# Presupuesto del supermercado al final del dıa t, despues de haber pagado el bodegaje para la noche.
B = model.addVars(T_)
#### Función Objetivo
objetivo = sum(sum(w[p,t] for p in P_) for t in T_)
#### Restricciones
#R1
model.addConstrs(B[t] == B[t-1] + sum(sum(s[p,t,e]*z[p] for e in E_) for p in P_) -\
sum(sum(c[p,t,e]*n[p,t] for e in E_) for p in P_) -\
sum(w[p,t]*u[p] for p in P_) -\
sum(sum(i[p,t,e] * b[p,t] for e in range(2, T + 1)) for p in P_) -\
sum(C[p,t]*F[p,t] for p in P_)
for t in range(2, T + 1))
#R2
model.addConstr(B[1] == PR)
#R3
M = 10000000
model.addConstrs(sum(c[p,t,e] for e in E_) <= C[p,t] * M for t in T_
for p in P_)
# R4
model.addConstrs(minc[p] * C[p,t] <= c[p,t,e] for t in T_
for p in P_
for e in E_ if exp[p] == e)
# R5
model.addConstrs(i[p,0,e] == 0 for e in E_
for p in P_)
#R6
model.addConstrs(i[p,t,e] == i[p, t-1, e+1] + c[p,t,e] - s[p,t,e] for t in range(1, T + 1)
for e in range(1, T)
for p in P_)
#R7
model.addConstrs(i[p,t,T] == c[p,t,T] - s[p,t,T] for t in T_
for p in P_)
#R8
model.addConstrs(c[p,t,e] == 0 for t in T_
for p in P_
for e in E_ if exp[p] != e)
#R9
model.addConstrs(sum(i[p,t-1,e] + c[p,t,e] for e in range(2, T+1)) >= d[p,t] for t in T_
for p in P_)
#R10
model.addConstrs(sum(sum(i[p,t,e]*v[p] for e in range(2,T+1)) for p in P_) <= V[q] for q in Q_
for t in T_)
#R11
model.addConstrs(sum(sum(c[p,t,e]*v[p] for e in E_) for p in P_) <= maxc[p] for p in P_
for t in T_)
#R12
model.addConstrs(sum(s[p,t,e] for e in E_) == d[p,t] for p in P_
for t in T_)
#R13
model.addConstrs(w[p,t] == i[p,t,1] for p in P_
for t in T_)
#R14
model.addConstrs(sum(C[p,t] for t in range(1 + n*7, 7 + n*7)) <= 2 for p in P_
for n in range(0, int(T/7) - 1))
#R15
model.addConstrs(c[p,t,e] >= 0 for t in T_
for p in P_
for e in E_)
#R16
model.addConstrs(s[p,t,e] >= 0 for t in T_
for p in P_
for e in E_)
#R17
model.addConstrs(i[p,t,e] >= 0 for t in T_
for p in P_
for e in E_)
#R18
model.addConstrs(w[p,t] >= 0 for t in T_
for p in P_)
#R19
model.addConstrs(B[t] >= 0 for t in T_)
model.setObjective(objetivo, GRB.MINIMIZE)
model.setParam("TimeLimit", 30*60)
model.optimize()
#### Imprimir resultados
print(minc[1], maxc[1],exp[1])
print(model.ObjVal)
with open('resultados.csv', 'w') as resultados:
archivo_escribirle = csv.writer(resultados)
resultados.write("Valor Objetivo Final = "+str(model.ObjVal)+"\n")
primera_fila = 'dia','demanda','dias_vence','inventario','comprados'
archivo_escribirle.writerow(primera_fila)
for t in T_:
for e in E_:
fila = f'{t}',f'{d[1,t]}',f'{e}',f'{round(i[1,t,e].x)}',f'{round(c[1,t,exp[1]].x)}'
archivo_escribirle.writerow(fila)
for t in T_:
print(f"El presupuesto en este día es {B[t].x}")
print(f"La demanda por el producto el dia {t} es {d[1,t]}")
for e in E_:
if i[1,t,e].x != 0:
print(f"El inventario de 1 que vence en {e} dias el dia {t} es {i[1,t,e].x}")
print(f"Se compraron {c[1,t,exp[1]].x}")