//Capacitated Facility Location Problem: int I = ...; int J = ...; float f[0..(I-1)] = ...; //Kosten Depot i float s[0..(I-1)] = ...; //KAP Depot i float d[0..(J-1)] = ...; //Bedarf Kunde j float c[0..(I-1)][0..(J-1)] = ...; //Wegkosten von i nach j range RI = 0..(I-1); range RJ = 0..(J-1); dvar float+ x[0..(I-1)][0..(J-1)]; //Transportmenge dvar boolean y[0..(I-1)]; //Eröffnung Depot i dvar boolean z[0..(I-1)][0..(J-1)]; //Depot i beliefert Kunde j execute { cplex.threads=1; } minimize ( sum ( i in 0..(I-1) ) ( f[i] * y[i] ) ); subject to { //Für jedes Depot gilt: Ausliefermenge x kann maximal so groß sein wie Depot-KAP y forall ( i in 0..(I-1) ) sum ( j in 0..(J-1) ) ( x[i][j] ) <= s[i] * y[i]; //Die Ausliefermenge x kann maximal so groß sein wie der Bedarf des Kunden und es kann nur ausgeliefert werden, wenn das Depot eröffnet wird forall ( i in 0..(I-1), j in 0..(J-1) ) ( x[i][j] ) == ( d[j] * z[i][j] ); //Jeder Kunde muss insgesamt genau den Bedarf d geliefert bekommen: forall ( j in 0..(J-1) ) sum ( i in 0..(I-1) ) ( x[i][j] ) == d[j]; forall ( j in 0..(J-1) ) sum ( i in 0..(I-1) ) ( z[i][j] ) == 1; forall ( i in 0..(I-1) ) sum ( j in 0..(J-1) ) z[i][j] <= J * y[i]; }