MATLAB Gurobi [en cvx] solucionador falla

Cuando estaba tratando de resolver un problema de empaquetado de basura muy simple, el solucionador de Gurobi no funcionará. Trato de un problema de optimización muy simple con 1 restricción de desigualdad con Gurobi y funciona. Pero siempre devuelve NA para pequeños complicados. Estoy muy frustrado. Muy apreciado por la ayuda si alguien puede ayudar

%% By Linear programming
clear;clc;
weight = [4,4,5,7]';
cvx_begin
cvx_solver SDPT3
variables I(4,1) X(4,4)
minimize sum(I)
subject to
    X * weight <= 10 * I;
    sum(X) == [1,1,1,1];
    X >= 0
    X <= 1
    I >= 0
    I <= 1
cvx_end

X
I

%% By Integer programming
clear;clc;
weight = [4,4,5,7]';
cvx_begin
cvx_solver Gurobi
variables I(4,1) X(4,4)
minimize sum(I)
subject to
    X * weight <= 10 * I
    sum(X) == [1,1,1,1]
    X >= 0
    X <= 1
    I >= 0
    I <= 1
cvx_end

X
I

Y este es el mensaje de error

 
Calling Gurobi 9.00: 44 variables, 28 equality constraints
------------------------------------------------------------
------------------------------------------------------------
Status: Error
Optimal value (cvx_optval): NaN
 
Error using cvx_end (line 267)
model.quadcon must be a struct array with fields q, and rhs

Pregunta hecha hace 3 años, 5 meses, 1 días - Por compilercaptain


3 Respuestas:

  • Pruebe usar estos comandos en lugar de Gurobi solver

    cvx_solver Gurobi_3
    

    o

    cvx_solver Gurobi_2
    

    Parece que usar Gurobi como solucionador externo de cvx no es una elección sabia. Véase: http://ask.cvxr.com/t/cvx-with-gurobi-error-warning/7072/3. Han reportado el fallo hace unos meses.

    Respondida el Dec 16, 2020 a las 13:24 - por bitwisewizard

    Votos positivos: 0 | Votos negativos: 0

  • El mensaje de error indica que el problema se debe a que Gurobi no admite restricciones cuadráticas directamente a través de CVX. Para solucionar este problema, puedes reformular tu problema de optimización para evitar las restricciones cuadráticas.

    Una posible solución es transformar la restricción cuadrática en una forma lineal mediante la introducción de variables adicionales. Por ejemplo, puedes utilizar una variable adicional Y para representar la multiplicación X <strong> weight y luego utilizar Y en lugar de X </strong> weight en la restricción. Aquí te muestro cómo puedes realizar esta modificación en tu código:

    matlab
    clear;clc;
    weight = [4,4,5,7]';
    cvx_begin
    cvx_solver Gurobi
    variables I(4,1) X(4,4) Y(4,1)
    minimize sum(I)
    subject to
        Y == X  weight;
        Y <= 10  I;
        sum(X) == [1,1,1,1];
        X >= 0;
        X <= 1;
        I >= 0;
        I <= 1;
    cvx_end
    
    X
    I
    

    En este código, hemos introducido la variable Y para representar X * weight y hemos reescrito la restricción cuadrática como una restricción lineal utilizando Y. Espero que esta modificación ayude a resolver tu problema de optimización con Gurobi en CVX.

    Respondida el Dec 17, 2020 a las 13:23 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error indica que el solucionador de Gurobi no puede manejar restricciones cuadráticas en este problema. Para resolver este problema, puedes utilizar el solucionador SDPT3, que está diseñado para manejar restricciones cuadráticas.

    Aquí tienes el código modificado para utilizar el solucionador SDPT3:

    
    % By Gurobi
    clear;
    weight = [4,4,5,7]';
    cvx_begin
    cvx_solver SDPT3
    variables I(4,1) X(4,4)
    minimize sum(I)
    subject to
        X  weight <= 10  I;
        sum(X) == [1,1,1,1];
        X >= 0
        X <= 1
        I >= 0
        I <= 1
    cvx_end
    
    X
    I
    

    También puedes utilizar el solucionador Gurobi para problemas de programación lineal (LP). En este caso, como tu problema es un LP, deberías poder utilizar Gurobi sin problemas. Aquí tienes el código modificado para utilizar el solucionador Gurobi:

    
    % By Integer
    clear;
    weight = [4,4,5,7]';
    cvx_begin
    cvx_solver Gurobi
    variables I(4,1) X(4,4) integer
    minimize sum(I)
    subject to
        X  weight <= 10  I;
        sum(X) == [1,1,1,1];
        X >= 0
        X <= 1
        I >= 0
        I <= 1
    cvx_end
    
    X
    I
    

    Respondida el Dec 17, 2020 a las 13:31 - por Gemini

    Votos positivos: 0 | Votos negativos: 0