-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathModelo_1_simplificado__seccion_2_9_overleaf_CON_ROTACION.py
More file actions
284 lines (224 loc) · 11.7 KB
/
Copy pathModelo_1_simplificado__seccion_2_9_overleaf_CON_ROTACION.py
File metadata and controls
284 lines (224 loc) · 11.7 KB
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
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
import cplex
from cplex.exceptions import CplexSolverError
import multiprocessing
import time
from Utils.Model_Functions import *
from Config import *
MODEL_NAME="Model1"
# def createAndSolveModel(queue,manualInterruption,maxTime):
# #valores por default para enviar a paver
# modelStatus, solverStatus, objectiveValue, solverTime = "1", "1", 0, 1
# try:
# # Crear un modelo de CPLEX
# model = cplex.Cplex()
# model.set_results_stream(None) # deshabilito log de CPLEX de la info paso a paso
# model.set_problem_type(cplex.Cplex.problem_type.LP)
# model.objective.set_sense(model.objective.sense.maximize)
# model.parameters.timelimit.set(maxTime)
# # initialTime=model.get_time()
# initialTimeT = time.time()
# # Definir variables y objetivos
# varsNames = [f"f_{i}" for i in ITEMS]
# coeffs = [1.0] * ITEMS_QUANTITY # Esto asigna 1 como coeficiente a cada variable
# addVariables(model, varsNames, coeffs, "B")
# additionalVarsNames = [f"x_{i}" for i in ITEMS] + [f"y_{i}" for i in ITEMS] + [f"r_{i}" for i in ITEMS]
# additionalCoeffObj = [0.0] * len(additionalVarsNames)
# model.variables.add(names=additionalVarsNames, obj=additionalCoeffObj, types="I" * (2 * ITEMS_QUANTITY) + "B" * ITEMS_QUANTITY)
# additionalVarsNames = []
# for i in ITEMS:
# for j in ITEMS:
# if i != j:
# additionalVarsNames.append(f"l_{i},{j}") # Variable l_{ij}
# additionalVarsNames.append(f"b_{i},{j}") # Variable b_{ij}
# additionalCoeffObj = [0.0] * len(additionalVarsNames)
# addVariables(model, additionalVarsNames, additionalCoeffObj, "B")
# # Restricciones de no solapamiento
# for i in ITEMS:
# for j in ITEMS:
# if i < j:
# consCoeff = [1.0, 1.0, 1.0, 1.0, -1.0, -1.0]
# consVars = [f"l_{i},{j}", f"l_{j},{i}", f"b_{i},{j}", f"b_{j},{i}", f"f_{i}", f"f_{j}"]
# consRhs = -1.0
# consSense = "G"
# addConstraint(model,consCoeff,consVars,consRhs,consSense)
# # Restricciones x_i - x_j + W l_{ij} <= W - w (1 - r_i) - h r_i
# for i in ITEMS:
# for j in ITEMS:
# if i != j:
# consCoeff = [1.0, -1.0, BIN_WIDTH, -ITEM_WIDTH + ITEM_HEIGHT ]
# consVars = [f"x_{i}", f"x_{j}", f"l_{i},{j}", f"r_{i}"]
# consRhs = BIN_WIDTH - ITEM_WIDTH
# consSense = "L"
# addConstraint(model,consCoeff,consVars,consRhs,consSense)
# # Restricciones y_i - y_j + H b_{ij} <= H - h (1 - r_i) - w r_i
# for i in ITEMS:
# for j in ITEMS:
# if i != j:
# consCoeff = [1.0, -1.0, BIN_HEIGHT, -ITEM_HEIGHT+ITEM_WIDTH]
# consVars = [f"y_{i}", f"y_{j}", f"b_{i},{j}", f"r_{i}"]
# consRhs = BIN_HEIGHT - ITEM_HEIGHT
# consSense = "L"
# addConstraint(model,consCoeff,consVars,consRhs,consSense)
# # Restricciones para asegurar que los objetos estén dentro del bin (considerando rotación)
# for i in ITEMS:
# consXCoeff = [1.0, BIN_WIDTH, -ITEM_WIDTH + ITEM_HEIGHT] # Coeficientes para x_i, f_i, r_i
# consXVars = [f"x_{i}", f"f_{i}", f"r_{i}"]
# consXRhs = 2 * BIN_WIDTH - ITEM_WIDTH
# consXSense = "L"
# addConstraint(model,consXCoeff,consXVars,consXRhs,consXSense)
# consYCoeff = [1.0, BIN_HEIGHT, -ITEM_HEIGHT + ITEM_WIDTH] # Coeficientes para y_i, f_i, r_i
# consYVars = [f"y_{i}", f"f_{i}", f"r_{i}"]
# consYRhs = 2 * BIN_HEIGHT - ITEM_HEIGHT
# consYSense = "L"
# addConstraint(model,consYCoeff,consYVars,consYRhs,consYSense)
# # Desactivar la interrupción manual aquí
# manualInterruption.value = False
# # Resolver el modelo
# model.solve()
# # Obtener y mostrar los resultados
# objectiveValue = model.solution.get_objective_value()
# print("-------------------------------------------")
# print("Modelo 1 - Con Rotacion")
# print(f"Optimal value: {objectiveValue}")
# # solutionValues=model.solution.get_values
# # print("Variables values:")
# # for var_name, value in zip(varsNames, solutionValues):
# # print(f"{var_name} = {value}")
# status = model.solution.get_status()
# # finalTime = model.get_time()
# # solverTime=finalTime-initialTime
# # solverTime=round(solverTime, 2)
# finalTimeT = time.time()
# solverTimeT = finalTimeT - initialTimeT
# solverTimeT = round(solverTimeT, 2)
# if status == 105: # CPLEX código 105 = Time limit exceeded
# print("The solver stopped because it reached the time limit.")
# modelStatus="2" #valor en paver para marcar un optimo local
# # Enviar resultados a través de la cola
# queue.put({
# "modelStatus": modelStatus,
# "solverStatus": solverStatus,
# "objectiveValue": objectiveValue,
# "solverTime": solverTimeT
# })
# except CplexSolverError as e:
# handleSolverError(e, queue,solverTimeT)
def createModel(maxTime):
# Crear un modelo de CPLEX
model = cplex.Cplex()
model.set_results_stream(None) # deshabilito log de CPLEX de la info paso a paso
model.set_problem_type(cplex.Cplex.problem_type.LP)
model.objective.set_sense(model.objective.sense.maximize)
model.parameters.timelimit.set(maxTime)
# initialTime=model.get_time()
initialTimeT = time.time()
# Definir variables y objetivos
varsNames = [f"f_{i}" for i in ITEMS]
coeffs = [1.0] * ITEMS_QUANTITY # Esto asigna 1 como coeficiente a cada variable
addVariables(model, varsNames, coeffs, "B")
additionalVarsNames = [f"x_{i}" for i in ITEMS] + [f"y_{i}" for i in ITEMS] + [f"r_{i}" for i in ITEMS]
additionalCoeffObj = [0.0] * len(additionalVarsNames)
model.variables.add(names=additionalVarsNames, obj=additionalCoeffObj, types="I" * (2 * ITEMS_QUANTITY) + "B" * ITEMS_QUANTITY)
additionalVarsNames = []
for i in ITEMS:
for j in ITEMS:
if i != j:
additionalVarsNames.append(f"l_{i},{j}") # Variable l_{ij}
additionalVarsNames.append(f"b_{i},{j}") # Variable b_{ij}
additionalCoeffObj = [0.0] * len(additionalVarsNames)
addVariables(model, additionalVarsNames, additionalCoeffObj, "B")
# Restricciones de no solapamiento
for i in ITEMS:
for j in ITEMS:
if i < j:
consCoeff = [1.0, 1.0, 1.0, 1.0, -1.0, -1.0]
consVars = [f"l_{i},{j}", f"l_{j},{i}", f"b_{i},{j}", f"b_{j},{i}", f"f_{i}", f"f_{j}"]
consRhs = -1.0
consSense = "G"
addConstraint(model,consCoeff,consVars,consRhs,consSense)
# Restricciones x_i - x_j + W l_{ij} <= W - w (1 - r_i) - h r_i
for i in ITEMS:
for j in ITEMS:
if i != j:
consCoeff = [1.0, -1.0, BIN_WIDTH, -ITEM_WIDTH + ITEM_HEIGHT ]
consVars = [f"x_{i}", f"x_{j}", f"l_{i},{j}", f"r_{i}"]
consRhs = BIN_WIDTH - ITEM_WIDTH
consSense = "L"
addConstraint(model,consCoeff,consVars,consRhs,consSense)
# Restricciones y_i - y_j + H b_{ij} <= H - h (1 - r_i) - w r_i
for i in ITEMS:
for j in ITEMS:
if i != j:
consCoeff = [1.0, -1.0, BIN_HEIGHT, -ITEM_HEIGHT+ITEM_WIDTH]
consVars = [f"y_{i}", f"y_{j}", f"b_{i},{j}", f"r_{i}"]
consRhs = BIN_HEIGHT - ITEM_HEIGHT
consSense = "L"
addConstraint(model,consCoeff,consVars,consRhs,consSense)
# Restricciones para asegurar que los objetos estén dentro del bin (considerando rotación)
for i in ITEMS:
consXCoeff = [1.0, BIN_WIDTH, -ITEM_WIDTH + ITEM_HEIGHT] # Coeficientes para x_i, f_i, r_i
consXVars = [f"x_{i}", f"f_{i}", f"r_{i}"]
consXRhs = 2 * BIN_WIDTH - ITEM_WIDTH
consXSense = "L"
addConstraint(model,consXCoeff,consXVars,consXRhs,consXSense)
consYCoeff = [1.0, BIN_HEIGHT, -ITEM_HEIGHT + ITEM_WIDTH] # Coeficientes para y_i, f_i, r_i
consYVars = [f"y_{i}", f"f_{i}", f"r_{i}"]
consYRhs = 2 * BIN_HEIGHT - ITEM_HEIGHT
consYSense = "L"
addConstraint(model,consYCoeff,consYVars,consYRhs,consYSense)
return model
def solveModel(model,queue,manualInterruption):
# Desactivar la interrupción manual aquí
manualInterruption.value = False
# Resolver el modelo
model.solve()
# Obtener y mostrar los resultados
objectiveValue = model.solution.get_objective_value()
print("-------------------------------------------")
print("Modelo 1 - Con Rotacion")
print(f"Optimal value: {objectiveValue}")
modelStatus, solverStatus = "1", "1"
status = model.solution.get_status()
if status == 105: # CPLEX código 105 = Time limit exceeded
print("The solver stopped because it reached the time limit.")
modelStatus="2" #valor en paver para marcar un optimo local
return modelStatus, solverStatus, objectiveValue
def executeWithTimeLimit(maxTime):
global modelStatus, solverStatus, objectiveValue, solverTime
global excedingLimitTime
excedingLimitTime=False
# Crear una cola para recibir los resultados del subproceso
queue = multiprocessing.Queue()
# Crear una variable compartida para manejar la interrupción manual
manualInterruption = multiprocessing.Value('b', True)
# Crear el subproceso que correrá la función
process = multiprocessing.Process(target=runModel, args=(createModel,solveModel,queue,manualInterruption,maxTime))
# Iniciar el subproceso
process.start()
initialTime = time.time()
# Monitorear la cola mientras el proceso está en ejecución
while process.is_alive():
if manualInterruption.value and time.time() - initialTime > maxTime:
print("Limit time reached. Aborting process.")
modelStatus="14" #valor en paver para marcar que el modelo no devolvio respuesta por error
solverStatus="4" #el solver finalizo la ejecucion del modelo
solverTime=maxTime
excedingLimitTime=True
process.terminate()
process.join()
break
time.sleep(0.1) # Evitar consumir demasiados recursos
# Imprimo resultados de la ejecucion que se guardan luego en el archivo trc para usar en paver
while not queue.empty():
message = queue.get()
if isinstance(message, dict):
print(message)
modelStatus = message["modelStatus"]
solverStatus = message["solverStatus"]
objectiveValue = message["objectiveValue"]
solverTime = message["solverTime"]
if(excedingLimitTime):
print("El modelo excedió el tiempo límite de ejecución.")
objectiveValue = "n/a"
modelStatus = "14"
return CASE_NAME, MODEL_NAME, modelStatus, solverStatus, objectiveValue, solverTime