%% Parameters
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
int: Locations;
int: UsersN;
int: M;
array[1..UsersN] of set of 1..Locations: C;
array[1..UsersN] of int: clusterSize;
array[1..Locations] of set of 1..UsersN: E;
array[1..Locations] of int: usersToServeN;
array[1..UsersN] of float: InterfNoiseBasic;
array[1..UsersN, 1..Locations, 1..M] of float: InterfNoiseAdditional;
array[1..UsersN] of float: fairnessWeight;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Variables
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% array[1..UsersN, 1..Locations, 1..M] of var bool: taurum;
array[1..UsersN, 1..Locations, 1..M] of var 0..1: taurum;
var float: utility;
array[1..UsersN] of var float: denominator;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Constraints
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
constraint forall(j in 1..Locations)(
forall(i in 1..UsersN)(
sum(m in 1..M)(
taurum[i,j,m]
) <= 1
)
);
constraint forall(j in 1..Locations)(
forall(m in 1..M)(
sum(i in E[j])(
taurum[i,j,m] % first usersToServeN[j] values in taurum is what we need
) <= 1
)
);
constraint forall(i in 1..UsersN)(sum(j in C[i])(
sum(m in 1..M)(
taurum[i,j,m]
)) == 0
\/
sum(j in C[i])(
sum(m in 1..M)(
taurum[i,j,m]
)) == clusterSize[i]
);
constraint forall(i in 1..UsersN)(
denominator[i] ==
( InterfNoiseBasic[i] +
sum(k in C[i])(
sum(m_prime in 1..M)(
(1 - taurum[i,k,m_prime]) * InterfNoiseAdditional[i,k,m_prime]
)))
);
constraint utility == sum(i in 1..UsersN)(
fairnessWeight[i] *
%ln(1 +
(
sum(j in C[i])(
sum(m in 1..M)(
taurum[i,j,m] * Usef[i,j,m] ) )
/ denominator[i]
)
%)
);
solve maximize utility;
JaCoP solver works with minizinc and both float_div and float_ln.
Total network utility = 15.94523856112685