Asumiendo es una variable booleana en un programa ILP (es decir , S t ) y , son variables enteras limitadas entre y . Quiero codificar la siguiente restricción de alto nivel:
Hasta ahora tengo esto:
Esto impone que siempre que es verdad, debe ser o la ecuación no se mantendrá. Sin embargo, sinada es restrictivo y así podría ser o .
¿Qué otra ecuación podría agregar para codificar la restricción?
integer-programming
Setzer22
fuente
fuente
Respuestas:
Puedes hacer esto introduciendo las dos desigualdades
y
El primero codifica el requisitoy=1⟹x1≤x2 (puedes ver que si y=1 , entonces el M(1−y) el término desaparece; Siy=0 , entonces M(1−y) se convierte en algo enorme y la desigualdad se satisface automáticamente). Este último codifica el requisitoy=0⟹x1>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.
fuente
Podrías agregar una constante0<A<M y luego agregas esta restricción:
Si entonces te queda cony=1
Y si entonces te quedarás cony=0
fuente
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:
La segunda restricción es equivalente a para enteros, si desea simplemente suelte el 1.x2>x1 x2≥x1
fuente