/********************************************* * OPL 20.1.0.0 Model * Author: conquerer * Creation Date: Nov 24, 2021 at 3:24:24 AM *********************************************/ //Parameters int n=...; range nodes=1..n; int source=...; int destination=...; int relocDestination=...; int s = ... ; //Total number of subcarriers in a link range w = 1 ..s ; range w1 = 1 .. (s-2); range w2 = 1 .. (s-1); int B = ... ; //Bandwidth int G = ... ; //Guard int req=...; range M=1..req; tuple edge { int sourceNode; int destNode; } range modrange=1..4; range modrange1=1..3; {edge} arcs with sourceNode in nodes,destNode in nodes=...; int weight[arcs]=...; int initPrimSpec[M][w][arcs]=...; int initBackSpec[M][w][arcs]=...; int initPrimPath[M][arcs]=...; int initBackPath[M][arcs]=...; int initStreams[M][arcs]=...; int delta=20000; int o[modrange] = ...; float demand=...; float X[modrange]=...; int degree[nodes]=...; float EBVT[modrange]=...; //decision variables dvar boolean primPath[arcs]; dvar boolean backPath[arcs]; dvar boolean specPrim[w][arcs]; dvar boolean specBack[w][arcs]; dvar boolean S[arcs]; dvar int lp; dvar int lb; dvar boolean pu[modrange]; dvar boolean bu[modrange]; dvar int ps; dvar int bs; dvar float BA; dvar float PA; dvar float BOXC; dvar float POXC; dvar float PBVT; dvar float BBVT; dvar float TP; /** Objective Function**/ minimize (sum (i in arcs)weight[i]*primPath[i] + sum (i in arcs) weight[i]*backPath[i]); subject to { PrimaryFlowConserv: forall (i in nodes) { if (i==source) sum ( in arcs) primPath[] - sum ( in arcs) primPath[] == 1; else if (i==destination) sum ( in arcs) primPath[] - sum ( in arcs) primPath[] == -1; else sum ( in arcs) primPath[] - sum ( in arcs) primPath[] == 0; } NoOverlap: forall (i in nodes, j in nodes) { sum ( in arcs) primPath[] + sum ( in arcs) backPath[] <= 1; } CapacityAllocationConstraintforPrimaryPath: forall( in arcs) { (primPath[] == 1) => (sum(k in w) specPrim[k][] == ps ); } SpectrumContiguityCons: forall(k in w2) { forall( in arcs){ (specPrim[k][] - specPrim[k+1][] - 1) * (-s) >= sum (i1 in w1) specPrim[i1][] ; } } NonoverlappingSpecCons: forall(k1 in M) { forall ( in arcs, k in w) { (initPrimSpec[k1][k][] ) * (specPrim[k][] ) <= 0 ; } } PathSelectionCons1: forall ( in arcs) { sum(k in w) specPrim[k][] <= primPath[] * s ; } PathSelectionCons2: forall( in arcs) { primPath[] <= sum(k in w) specPrim[k][]; } SpectrumContinuityCons01: forall( in arcs) { forall( in arcs) { if ( != ){ (primPath[] - primPath[] == 0) => (sum(k in w) specPrim[k][] - sum(k in w) specPrim[k][] == 0 ); } } } /** Constraints for Backup Paths **/ BackupFlowConserv: forall (i in nodes) { if (i==source) sum ( in arcs) backPath[] - sum ( in arcs) backPath[] == 1; else if (i==relocDestination) sum ( in arcs) backPath[] - sum ( in arcs) backPath[] == -1; else sum ( in arcs) backPath[] - sum ( in arcs) backPath[] == 0; } CapacityAllocationConstraint1B: forall( in arcs) { (backPath[] == 1) => (sum(k in w) specBack[k][] == bs ); } SpectrumContiguityConsB: forall(k in w2) { forall( in arcs){ (specBack[k][] - specBack[k+1][] - 1) * (-s) >= sum (i1 in w1) specBack[i1][] ; } } NonoverlappingSpecConsB: forall(k1 in M) { forall ( in arcs, k in w) { (initBackSpec[k1][k][] ) * (specBack[k][] ) <= 0 ; } } PathSelectionCons1B: forall ( in arcs) { sum(k in w) specBack[k][] <= backPath[] * s ; } PathSelectionCons2B: forall( in arcs) { backPath[] <= sum(k in w) specBack[k][]; } NoOverlapSpectrum: forall( in arcs,k in w) { specBack[k][] + specPrim[k][] <= 1 ; } SpectrumContinuityCons02: forall( in arcs) { forall( in arcs) { if ( != ){ (backPath[] - backPath[] == 0) => (sum(k in w) specBack[k][] - sum(k in w) specBack[k][] == 0 ); } } } Distinct: forall(k in M) { forall (k1 in w){ forall ( in arcs) { initPrimSpec[k] [k1] [] + specPrim [k1] [] <= 1; } } } BackupSharing: forall(k1 in M) { forall (k in arcs){ (primPath[k] + initPrimPath[k1][k] <=1) => (backPath[k] + initBackPath[k1][k]<=2); } } MergeNonDiverging: if(req >1) { forall (m in M) { forall (k in arcs) { S[k] == backPath[k] * initStreams[m][k]; } } } /** forall (m in R) { forall ( in arcs) { forall ( in arcs){ if (i == x) { if (j != y) { backPath[] + initStreams[m][] <= 2 => S[] == 0; } else { backPath[] + initStreams[m][] == 2 => S[] == 1; } } else { backPath[] + initStreams[m][] <= 2 => S[] == 0; } } } }**/ //Modulation format equations LengthofPrimPath: lp ==sum (k in arcs)(primPath[k]* weight[k]) ; LengthofBackPath: lb==sum (k in arcs)(backPath[k]* weight[k]) ; SelectOneModulationforPrimary: lp-o[1] >=0 => pu[1] == 1; //path lengths g.t. 4000 lp-o[4] <=0 => pu[4] == 1; //path lengths l.t. 500 forall (i in modrange) { lp-o[i] ==0 => pu[i] == 1; //path lengths e.q. o[i] } forall (i in modrange) { (1-pu[i])*delta >= lp-o[i]; //(lp-o[i]) * (lp-o[i+1]) <= -1 => o[i] == 1; //(lp - o[i]) >=0 && (lp-o[i+1]) <=0 => pu[i] == 1; } sum (k in modrange)pu[k] == 1 ; //sum (k in modrange)bu[k] == 1 ; SelectOneModulationforbackup: lb-o[1] >=0 => bu[1] == 1; //path lengths g.t. 4000 lb-o[4] <=0 => bu[4] == 1; //path lengths l.t. 500 forall (i in modrange) { lb-o[i] ==0 => bu[i] == 1; //path lengths e.q. o[i] } forall (i in modrange) { (1-bu[i])*delta >= lb-o[i]; //(lb - o[i]) >=0 && (lb-o[i+1]) <=0 => bu[i] == 1; } sum (k in modrange)bu[k] == 1 ; NumofCarriers1: //sum (i in modrange) (ceil (demand/X[i]) + G)*pu[i] >= ps; forall(i in modrange) { pu[i] == 1 => ps == (ceil(demand/X[i]) + G); } NumofCarriers2: //sum (i in modrange) (ceil(demand/X[i]) + G)*bu[i] >= bs; forall(i in modrange) { bu[i] == 1 => bs == (ceil(demand/X[i]) + G); } AmplifierPower: PA == sum (k in arcs) primPath[k] * (ps/s) * (floor(weight[k]/80 + 1)*100); BA == sum (k in arcs) backPath[k] * (bs/s) * (floor(weight[k]/80 + 1)*100); PowerOpticalCrossConnect: POXC == sum ( in arcs) primPath[] * (ps/s) * (85*degree[j]+100*9+150); BOXC == sum ( in arcs) primPath[] * (bs/s) * (85*degree[j]+100*9+150); PowerBandwidthVariableTransponder: forall(i in modrange) { pu[i] == 1 => PBVT == EBVT[i]; } forall(i in modrange) { bu[i] == 1 => BBVT == EBVT[i]; } TotalPower: TP == (PA + POXC + PBVT+ BA + BOXC + BBVT)/1000; }