misma - sumar valores en excel sólo si cumplen una condición
¿Cómo es posible una suma condicional en Cplex? como sumifs en Excel? (2)
Quiero sumar todos los recursos usados en mi modelo (es el modelo rcpsp) ¿cómo puedo hacerlo en CPLEX? al principio escribí esto:
forall(k in K)
forall(t in 1..f[nAct])
sum(i in I:f[i]-d[i]<=t-1 && t<=f[i]) r[i,k] <= aR[k];
(nota: K es un rango de recursos, nAct es el número de actividades, f [i] es una matriz dvar e indica el tiempo de finalización de la actividad i, d [i] es la duración de i, r [i, k] es un recurso necesario de k para la actividad i y aR [k] son los recursos disponibles de k.)
El problema es que el cplex no acepta la variable de decisión en la condición de suma. Lo cambié a:
forall(k in K)
forall(t in 1..f[nAct])
sum(i in I) (f[i]-d[i]<=t-1 && t<=f[i])*r[i,k] <= aR[k];
Pero no funcionó. hizo True constraints en Problem Browser después de la ejecución (no sé por qué) e hizo que esta restricción fuera ineficaz.
¿Alguna de idea de cómo arreglarlo?
Hay varias maneras de poner su problema en un marco de programación entero. Hay libros escritos sobre este tema. Creo que esta es la formulación más simple.
Supongo que en su problema, r [i, k] yd [i] son conocidos y que el horizonte temporal se divide en períodos de tiempo discretos.
- en el indicador [i, t] de que la actividad i está activa en el tiempo t
- start [i, t] Indica que la actividad i comienza al comienzo del período t
- end [i, t] indicador de que la actividad i termina al final del período t
Entonces en [i, t] reemplaza la condición f [i] -d [i] <= t-1 && t <= f [i]) * r [i, k] Su restricción se vuelve
forall(k in K)
forall(t in 1..f[nAct])
sum(i in I : r[i,k] = 1) on[i,t] <= aR[k];
También necesita agregar restricciones para aplicar la definición de encendido, inicio y apagado.
forall(t in 2..f[nAct])
forall(i in I)
on[i,t-1] - on[i,t] = end[i,t-1] - start[i,t];
forall(i in I)
on[i,0] = start[i,0];
forall(i in I)
sum(t in 1..f[nAct]) start[i,t] = 1;
forall(i in I)
sum(t in 1..f[nAct]) end[i,t] = 1;
forall(i in I)
sum(t in 1..f[nAct]) on[i,t] = d[i];
Puede usar dexpr para manipular variables de decisión. Aquí hay un ejemplo del mismo recurso IBM Knowledge Center .
Sin dexpr
dvar int x in 0..20;
dvar int y in 0..20;
dvar int d;
dvar int s;
maximize (d);
subject to {
d==x-y;
s==x+y;
s<=15;
s<=x-2*y;
d>=2;
d<=y+8;
1<=d;
}
Con dexpr
dvar int x in 0..20;
dvar int y in 0..20;
dexpr int d=x-y;
dexpr int s=x+y;
maximize (d);
subject to {
s<=15;
s<=x-2*y;
d>=2;
d<=y+8;
1<=d;
}