es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo acceder a la Solución de Optimización formulada usando Drake Toolbox.

¡Hola! Soy un traductor de español de documentos de informática. Aquí está la traducción solicitada:

¡Soy un novato en c++!

La información detallada en la salida del terminal indica que se ha resuelto el problema con éxito, pero no puedo acceder a la solución. ¿Cuál es el problema con la última línea?

drake::solvers::MathematicalProgram prog;
auto x = prog.NewContinuousVariables(n_x);

// Coste y Restricciones

drake::solvers::MathematicalProgramResult result;
drake::solvers::OsqpSolver osqp_solver;
if (osqp_solver.available()) {
    // Estableciendo opciones del solucionador.
    for (int print_to_console : {0, 0}) {           //{0,1} para verboso, {0,0} para sin salida al terminal
        drake::solvers::SolverOptions opciones;
        opciones.SetOption(drake::solvers::OsqpSolver::id(), "verbose", print_to_console);
        osqp_solver.Solve(prog, {}, opciones);
    }
}
const auto u = result.GetSolution(x);

¿Qué pasa si no quiero elegir OSQP y dejar que Drake decida qué solucionador usar para QP? ¿Cómo puedo hacer esto?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con la última línea es que está intentando acceder a la solución desde el objeto result, pero el objeto result aún no se ha actualizado con la solución. La solución debe obtenerse después de que se haya ejecutado el solucionador (solver) y se haya actualizado el objeto result con la solución. El código debe modificarse de la siguiente manera:

    drake::solvers::MathematicalProgramResult result;
    drake::solvers::OsqpSolver osqp_solver;
    if (osqp_solver.available()) {
        //Estableciendo opciones del solucionador.
        for (int print_to_console : {0, 0}) {           //{0,1} para verbose, {0,0} para no output por terminal
            drake::solvers::SolverOptions options;
            options.SetOption(drake::solvers::OsqpSolver::id(), "verbose", print_to_console);
            result = osqp_solver.Solve(prog, {}, options);
        }
    }
    const auto u = result.GetSolution(x);
    

    Para permitir que Drake decida qué solucionador (solver) usar para el QP, simplemente puede eliminar la declaración explícita del solucionador y permitir que el mecanismo de selección de solucionador de Drake elija automáticamente el solucionador. El código se vería así:

    drake::solvers::MathematicalProgram prog;
    auto x = prog.NewContinuousVariables(n_x);
    
    //Costo y restricciones 
    
    drake::solvers::MathematicalProgramResult result = drake::Solve(prog);
    const auto u = result.GetSolution(x);
    

Comments are closed.