# The WDM wavelength routing and assignment model set N; set W; set D within {N,N}; set S; set C; set P; set H within {P,P}; set J {D} within P; set K {S} within P; set L {C} within P; set R0 within H default {}; # b's fixed to 0 set R1 within H default {}; # b's fixed to 1 param r {D}; param a {S,W}; param f {C,W}; param B default sum{s in S} a[s,80] + sum{c in C} f[c,80] + 1; var x {P} integer >= 0; var l {P} integer >= 1; var h {P} >= 0, <= 80; var m {P} >= 0; var b {P, P} >= 0, <=1; var dp{P, P} >= 0; var dm{P, P} >= 0; var u {D} >= 0; var y {S, W} binary; var z {C, W} binary; minimize cost: sum {s in S, w in W} a[s,w] * y[s,w] + sum {c in C, w in W} f[c,w] * z[c,w] + sum {(o,d) in D} B * u[o,d]; subject to satisfy_demand {(o,d) in D}: sum {p in J[o,d]} x[p] + u[o,d] = r[o,d]; subject to assign_wavelengths {p in P}: h[p] = l[p] + x[p] - 1; subject to determine_midpoint {p in P}: m[p] = (l[p] + h[p])/2; subject to determine_distance {(p,q) in H}: m[p] - m[q] = dp[p,q] - dm[p,q]; subject to minimum_distance {(p,q) in H}: dp[p,q] + dm[p,q] >= (x[p] + x[q])/2; subject to distinct_assign1 {(p,q) in H}: dp[p,q] <= 80*b[p,q]; subject to distinct_assign2 {(p,q) in H}: dm[p,q] <= 80*(1- b[p,q]); subject to construct_design1 {s in S, p in K[s]}: sum{w in W} w * y[s,w] >= h[p]; subject to construct_design2 {c in C, p in L[c]}: sum{w in W} w * z[c,w] >= h[p]; subject to struct_1_size {s in S}: sum {w in W} y[s,w] <= 1; subject to coupler_1_size {c in C}: sum {w in W} z[c,w] <= 1; subject to x_upper {(o,d) in D, p in J[o,d]}: x[p] <= r[o,d]; subject to round_down {(p,q) in R0}: b[p,q] = 0; subject to round_up {(p,q) in R1}: b[p,q] = 1;