$TITLE Descomposición de Benders (Bd) SETS L máximo número de iteraciones / iter-1 * iter-5 / J(l) iteración actual N1 número variables primera etapa M2 número restricciones segunda etapa SCALARS TOL tolerancia relativa / 1e-6 / Z_INF cota inferior / -INF / Z_SUP cota superior / INF / PARAMETERS PI2(l,m2) variables duales restricciones segunda etapa DELTA1(l) coeficiente de cortes de infactibilidad (subproblema infactible) X1_J(n1,l) valores variables primera etapa hasta iteración j Z2_J(l) valores func obj segunda etapa hasta iteración j * comienzo datos del problema SETS M1 número restricciones primera etapa / r1-1 * r1-2 / N1 número variables primera etapa / x1-1 * x1-2 / M2 número restricciones segunda etapa / r2-1 * r2-3 / N2 número variables segunda etapa / x2-1 * x2-2 / PARAMETERS C1(n1) coeficientes función objetivo primera etapa / x1-1 -1 x1-2 -2 / C2(n2) coeficientes función objetivo segunda etapa / x2-1 -2 x2-2 -3 / B1(m1) cotas restricciones primera etapa / r1-1 600 r1-2 0 / B2(m2) cotas restricciones segunda etapa / r2-1 1000 r2-2 500 r2-3 0 / TABLE A1(m1,n1) matriz de restricciones primera etapa x1-1 x1-2 r1-1 1 1 r1-2 1 -2 TABLE BM1(m2,n1) matriz de restricciones segunda etapa x1-1 x1-2 r2-1 1 1 r2-2 1 0 r2-3 0 0 TABLE A2(m2,n2) matriz de restricciones segunda etapa x2-1 x2-2 r2-1 1 1 r2-2 1 0 r2-3 -2 1 * fin datos del problema POSITIVE VARIABLES X1(n1) variables primera etapa X2(n2) variables segunda etapa VARIABLES TT función de recursos Z1 función objetivo primera etapa Z2 función objetivo segunda etapa EQUATIONS FOC función objetivo problema completo FO1 función objetivo primera etapa FO2 función objetivo segunda etapa R1(m1) restricciones primera etapa R2(m2) restricciones segunda etapa CORTESA(l) cortes de Benders CORTESB(l) cortes de Benders ; FOC .. Z1 =E= SUM(n1, C1(n1)*X1(n1)) + SUM(n2, C2(n2)*X2(n2)) ; FO1 .. Z1 =E= SUM(n1, C1(n1)*X1(n1)) + TT ; FO2 .. Z2 =E= SUM(n2, C2(n2)*X2(n2)) ; R1(m1) .. SUM(n1, A1(m1,n1)*X1(n1)) =L= B1(m1) ; R2(m2) .. SUM(n1, BM1(m2,n1)*X1(n1)) + SUM(n2, A2(m2,n2)*X2(n2)) =L= B2(m2) ; CORTESA(j) .. SUM(m2, PI2(j,m2)* SUM(n1, BM1(m2,n1)*X1(n1))) + DELTA1(j) * TT =G= SUM(m2, PI2(j,m2)*B2(m2)) ; CORTESB(j) .. DELTA1(j) * TT =G= Z2_J(j) + SUM(m2, PI2(j,m2)*SUM(n1, BM1(m2,n1)*(X1_J(n1,j) - X1(n1)))) ; *MODEL MAESTRO / FO1, R1, CORTESA / MODEL MAESTRO / FO1, R1, CORTESB / MODEL SUB / FO2, R2 / MODEL COMPLETO / FOC, R1, R2 / FILE COPT / cplex.opt / ; PUT COPT PUT 'scaind -1' / 'lpmethod 1' / 'preind 0' / 'epopt 1.1e-9' / 'eprhs 1.1e-9' PUTCLOSE COPT ; SUB.OPTFILE = 1 ; * inicialización de parámetros del problema J(l) = NO ; TT.FX = 0 ; DELTA1(l) = 0 ; PI2(l,m2) = 0 ; X1_J(n1,l) = 0 ; Z2_J(l) = 0 ; LOOP(l $(ABS(1-Z_INF/Z_SUP) > TOL), IF (ORD(l) = 1, * alternativamente en la primera iteración se puede dar una solución X1.L(n1) = 3 ; Z1.L = SUM(n1, C1(n1)*X1.L(n1)) ; * o resolver directamente el problema maestro * SOLVE MAESTRO USING LP MINIMIZING Z1 ; ELSE SOLVE MAESTRO USING LP MINIMIZING Z1 ; ) ; X1_J(n1,l) = X1.L(n1) ; * fijación de la variable de la primera etapa X1 X1.FX(n1) = X1.L(n1) ; SOLVE SUB USING LP MINIMIZING Z2 ; * adquisición de los parámetros para formar un nuevo corte IF(SUB.MODELSTAT = 4, * subproblema infactible DELTA1(l) = 0 ; Z2_J(l) = SUB.SUMINFES ; ELSE * actualización de la cota inferior y superior Z_INF = Z1.L ; Z_SUP = MIN(Z_SUP, Z1.L - TT.L + Z2.L) ; DELTA1(l) = 1 ; Z2_J(l) = Z2.L; TT.LO = -INF ; TT.UP = INF ; ) ; DISPLAY Z_INF, Z_SUP ; PI2(l,m2) = R2.M(m2) ; X1.LO(n1) = 0 ; X1.UP(n1) = INF ; * Incremento del conjunto de cortes J(l) = YES ; ) ; ABORT $(ABS(1-Z_INF/Z_SUP) > TOL) 'Máximo número de iteraciones alcanzado' ; * resolución del problema completo SOLVE COMPLETO USING LP MINIMIZING Z1 ;