Variable booleana verdadera si la ecuación se cumple en ILP

8

Asumiendo y es una variable booleana en un programa ILP (es decir yZ, S t 0<=y<=1) y x1, x2 son variables enteras limitadas entre 0 y M. Quiero codificar la siguiente restricción de alto nivel:

y=1x1x2

Hasta ahora tengo esto:

x1x2+(M+1)y

Esto impone que siempre que x1>x2 es verdad, y debe ser 1o la ecuación no se mantendrá. Sin embargo, six1x2nada es restrictivo y y así podría ser 0 o 1.

¿Qué otra ecuación podría agregar para codificar la restricción?

Setzer22
fuente

Respuestas:

5

Puedes hacer esto introduciendo las dos desigualdades

x1x2+M(1y)

y

x1>x2My.

El primero codifica el requisito y=1x1x2 (puedes ver que si y=1, entonces el M(1y)el término desaparece; Siy=0, entonces M(1y)se convierte en algo enorme y la desigualdad se satisface automáticamente). Este último codifica el requisitoy=0x1>x2 (por razones similares)

Con suerte, esto le dará una idea de cómo manejar otros tipos de implicaciones también, en caso de que surjan. Básicamente, multiplique por algo grande y agréguelo / reste en alguna parte.

DW
fuente
5

Podrías agregar una constante 0<A<M y luego agregas esta restricción:

Ay(A+M)x1x2M(1y).

Si entonces te queda cony=1

Mx1x20,
que dice que .x1x2

Y si entonces te quedarás cony=0

Ax1x2M,
que dice que (ya que ).x1>x20<A<M
Ribz
fuente
3

Examine las restricciones de indicadores y las restricciones de SOS. Si bien puede definir las relaciones de destino linealmente como lo han explicado otras respuestas, el solucionador de IP puede manejar las restricciones especiales de manera más eficiente.

Si decide implementar las restricciones directamente como se describe en la otra respuesta, intente usar la M más pequeña posible y considere reducir la tolerancia de integralidad si su resultado no es correcto. Además, evite las desigualdades estrictas, son ambiguas en el contexto de la aritmética de coma flotante.

Uso de restricciones de indicador:

x1x2y=1

x2x1+1y=0

La segunda restricción es equivalente a para enteros, si desea simplemente suelte el 1.x2>x1x2x1

Septimus G
fuente
¡Gracias por las útiles sugerencias! ¿Puede explicar cómo las restricciones SOS son útiles / útiles en esta situación particular?
DW
Agregué un ejemplo con restricciones de indicador. Para SOS es más complicado y debe introducir variables adicionales, por lo que puede terminar sin ganar mucho al usarlas. Creo que el único aspecto a tener en cuenta aquí son los problemas numéricos que pueden surgir al usar las formulaciones propuestas por otros, y cómo aliviarlos. Si tiene acceso a un solucionador con restricciones de indicador, intente de esa manera ya que el solucionador puede ramificarse directamente sobre ellos o modificar dinámicamente el valor big-M.
Septimus G