Encontrar que Maximum toma demasiado tiempo en ILP, ¿por qué?

En resumen, ahora estamos tratando de convertir el IQP en el ILP. Con la implementación anterior, tardó aproximadamente 2 días en completarse, ahora con herramientas lineales, debería acelerarse. Básicamente, el problema es maximizar (con aproximadamente 50 vars binarias):

$$ \ sum_ {g = 1} ^ {5} sum_ {p = 1} ^ {10} (S [p] x [g] [p] -Cansancio [g] [p] -Dormir [g] [p ]) $$

Noticias

Creo que David está en el camino correcto, pero cuando trato de maximizar la expresión con variables de bonificación, siempre son cero, ¿por qué? Debajo de algún código, las puntuaciones podrían ser como S[1..10]=[1,2,3,4,5,6,7,8,9,10];.

int S[1..10] = ...; // Scores per player =s

dvar int x1[1..10] in 0..1;
dvar int x2[1..10] in 0..1;
dvar int x3[1..10] in 0..1;
dvar int x4[1..10] in 0..1;
dvar int x5[1..10] in 0..1;

dvar int b1[1..10] in 0..100;
dvar int b2[1..10] in 0..100;


//ERR: the values of b1 and b2 should be maximized...
// WHY not here so?

maximize 
sum(i in 1..10) 
(
S[i] *
    (
    (x1[i]+x2[i]+x3[i]+x4[i]+x5[i]) 
    - 1/10 * ( b1 +b2) 
    )
);

subject to 
{
    //We must play in 5 games.
    //It means that there are 5 players in each game.
    sum(i in 1..10) x1[i]==5;
    sum(i in 1..10) x2[i]==5;
    sum(i in 1..10) x3[i]==5;
    sum(i in 1..10) x4[i]==5;
    sum(i in 1..10) x5[i]==5;

    // IQP problem into ILP -problem

    forall (i in 1..10)
    {
        //ERROR HERE!
        //it returns zero for b1 and b2, they should be maximized... 
        //I am trying to use the tip by David here, see his answer.

        // EQ1: x2[i] * (x1[i]+x3[i])
        b1 <= 2*x2[i];
        b1 <= x1[i]+x3[i];

        // EQ2: x4[i] * (x3[i]+x5[i]+x1[i])
        b2 <= 3*x4[i];
        b2 <= x3[i]+x5[i]+x1[i];

    }

};

preguntado el 08 de noviembre de 11 a las 12:11

No es sorprendente que sea lento, porque este no es un problema de programación lineal (sino un entero problema de programación lineal) y tienes 50 variables, no 20. ¿Cuál es el problema que estás tratando de resolver? -

Entonces necesitas asignar a los jugadores a los juegos, ¿verdad? No ha restringido el número de jugadores en el juego en su problema de ILP, ¿está bien? -

1 Respuestas

Expresiones como

x1 * x2

son cuadráticas si x1, x2 son ambas variables. Tiene un problema de programación cuadrática de enteros de 50 variables. Además, su función objetivo no es cóncava, por lo que CPLEX lo pasará especialmente mal.
Sin embargo, dado que tiene todas las variables 0-1, puede convertir esto en un problema lineal agregando una variable adicional, digamos prima para la expresión con coeficientes positivos y pena para aquellos con coeficientes negativos, colocándolos en la función objetivo en lugar de los términos cuadráticos y agregando las siguientes restricciones

bonus <= x1
bonus <= x2

o en caso de un coeficiente negativo

penalty >= x1 + x2 - 1

Dado que está maximizando, cplex forzará prima or pena a los valores correctos en soluciones óptimas. Las variables de penalización y bonificación deben declararse no negativas.

dvar float+ penalty;
dvar float+ bonus;

Haga esto para todas las expresiones cuadráticas y su problema se convertirá en un problema de entero lineal y se resolverá mucho más rápido.

respondido 10 nov., 11:21

@hhh: Eso es porque esta respuesta es un poco incorrecta. Debido a que tiene un coeficiente negativo en su función objetivo, no es un prima, Pero una pena que buscas minimizar. Las restricciones también se cambian, sugiero penalty >= 0 y penalty >= x1[y] + x3[y] - 2 + 2*x2[y]. - jpalecek

@DavidNehme: ... pero incorrectamente. Los límites deben ajustarse para el caso de penalización. Imagínese lo que sucede cuando x2 es 0 (necesita que la otra restricción desaparezca en ese caso) o 1 (quiere lo contrario). Para el caso de bonificación, funciona así, para la penalización, no. - jpalecek

@jpalecek gracias de nuevo. Ahora esto debería funcionar. En el caso de penalización, si x1 o x2 son 0, entonces la penalización puede ser cero, pero si ambos son distintos de cero, la penalización debe ser al menos 1 y el objetivo debe llevarlo a 1. En el caso de bonificación, la bonificación debe ser 0 a menos que tanto x1 como x2 sean 1. Si ambos son 1, el objetivo debe llevarlo a 1. - David Nehme

@hhh todas las variables deberían tener límites inferiores a 0. Así que implícitamente debería haber una penalización> = 0 también. Obtienes esto declarando dvar como un float +. - David Nehme

Su función de optimización es una función lineal, por lo que siempre es cóncava (y convexa). - Proyecto Chthonic

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.