Originally posted by: meletis13forever
My model is that:
{string} infrastructure=...;
{string} terminals=...;
tuple terminaltuple{
key string name;
int x;
int y;
int maxBW;
int availBW1;
int availBW2;
int availBW3;
}
{terminaltuple} terminaldata=...;
terminaltuple dummy;
tuple infratuple{
key string name;
int x;
int y;
{float} PL;
float maxPower;
float cap;
}
{infratuple} infradata=...;
terminaltuple terminal
terminals =
t in terminaldata ;
infratuple infra
infrastructure =
i in infradata ;
{float} powers=...;
float l
powers=...;
float z=...;
execute{
for(var t in terminals){
dummy.x=100000;
dummy.y=100000;
while((infra.x-dummy.x)^2 + (infra.y-dummy.y)^2 >= 500.0){
dummy.x=875+Opl.rand(30);
dummy.y=268+Opl.rand(30);
}
terminal[t].x=dummy.x;
terminal[t].y=dummy.y;
writeln("success adding "
terminal[t].name" "
terminal[t].x" "+terminal[t].y);
}
}
dvar boolean x
terminalsinfrastructure;
dvar boolean y
powersinfrastructure;
dvar boolean N
terminalsinfrastructurepowers;
dvar int b
terminals;
dvar int w
terminalsinfrastructure;
dexpr float Cp
j in infrastructure = sum(k in powers) y[k][j] * l[k] * infra[j].maxPower;
dexpr float cov
j in infrastructure = 10^((Cp[j]/20) + 1.96);
dexpr float d
i in terminalsj in infrastructure = sqrt((terminal[i].x - infra[j].x)^2 + (terminal[i].y - infra[j].y)^2);
dexpr float load
j in infrastructure = sum(i in terminals) w[i][j];
dexpr float T1 = sum(j in infrastructure) Cp[j];
dexpr float T2 = sum(j in infrastructure, j2 in infrastructure : j2!=j) (load[j] - load
j2)^2;
dexpr float T3 = sum(i in terminals, j in infrastructure, i2 in terminals : i2!=i, j2 in infrastructure : j2!=j) (x[i][j] - x
i2j2);
dexpr float T4 = (1/70) * sum(i in terminals, j in infrastructure) x[i][j] * d[i][j];
dexpr float T5 = (1/4) * sum(j in infrastructure) (infra[j].cap - load[j])/ infra[j].cap;
dexpr float T6 = (1/5) * sum(i in terminals) (terminal[i].maxBW - b[i])/terminal[i].maxBW ;
minimize
T1 + T2 + T3 + T4 - T5 + T6;
subject to{
forall(i in terminals)
sum(j in infrastructure)
x[i][j] == 1;
forall(j in infrastructure)
sum(k in powers)
y[k][j] == 1;
forall(i in terminals, j in infrastructure, k in powers)
N[i][j][k] <= y[k][j];
forall(i in terminals, j in infrastructure, k in powers)
x[i][j] <= N[i][j][k] * y[k][j];
forall(i in terminals)
b[i] <= terminal[i].maxBW;
forall(j in infrastructure)
load[j] <= z * infra[j].cap;
forall(i in terminals)
b[i] == terminal[i].availBW1 || b[i] == terminal[i].availBW2 || b[i] == terminal[i].availBW3;
forall(i in terminals, j in infrastructure)
w[i][j] <= 1024 * x[i][j];
forall(i in terminals, j in infrastructure)
w[i][j] >= 64 * x[i][j];
forall(i in terminals, j in infrastructure)
w[i][j] <= (b[i] - 64 * (1 - x[i][j]));
forall(i in terminals, j in infrastructure)
w[i][j] >= (b[i] - 1024 * (1 - x[i][j]));
forall(i in terminals, j in infrastructure)
sum(j in infrastructure) x[i][j] * d[i][j] <= cov[j];
}
I don't have a mistake in syntax but when I run the model I get this errors:
CPLEX(default) cannot extract expression: 10^(Cp[j] / 20+1.96)
CPLEX(default) cannot extract expression: forall(i in terminals, j in infrastructure) sum(j in infrastructure) x[i][j]*d[i][j] <= cov[j]
CPLEX(default) cannot extract model: IloAlgorithm cannot extract extractable
Also the expression 10^(Cp[j] / 20+1.96) has not have any problem before I add the constraint:
forall(i in terminals, j in infrastructure)
sum(j in infrastructure) x[i][j] * d[i][j] <= cov[j];
This constraint has the problem but it is not syntax. Can you help me?
#DecisionOptimization#MathematicalProgramming-General