varios valores una sólo sumar misma cumplen criterios conjunto condición condiciones con columna buscar avanzado sum constraints conditional mathematical-optimization cplex

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; }