const std::vector<dlib:: function_evaluation> erstellen



  • Hallo,

    ich benutze dlib und dort möchte ich eine Funktion aufrufen (find_gobal_max)

    Momentan rufe ich die Funktion wie folgt auf und es läuft:

      auto result = dlib::find_min_global(opt_func,{ -20,-20,-20},{20,20,20},dlib::FOREVER,0.1);
    

    Nun habe ich in der Doku gesehen, man kann der FUnktion auch einen "initial Vektor mitgeben

     const std::vector<function_evaluation>& initial_function_evals = {}
    

    function_evaluation ist wohl ein struct von dlib und sieht so aus:

            struct function_evaluation
        {
            function_evaluation() = default;
            function_evaluation(const matrix<double,0,1>& x, double y) :x(x), y(y) {}
    
            matrix<double,0,1> x;
            double y = std::numeric_limits<double>::quiet_NaN();
        };
    

    Jetzt möchte ich meinen FUnktionsaufruf ergänzen (z.b. mit den Werten 10,10,10) , genau um dieses "function_evaluation".
    Nur irgendwie bin ich zu dumm so eine Variable zu erstellen.

    Also ich möchte z.b. folgende Funktion aufrufen:

            template <
            typename funct
            >
        function_evaluation find_min_global (
            thread_pool& tp,
            funct f,
            const matrix<double,0,1>& bound1,
            const matrix<double,0,1>& bound2,
            const std::vector<bool>& is_integer_variable,
            const std::chrono::nanoseconds max_runtime,
            double solver_epsilon = 0,
            const std::vector<function_evaluation>& initial_function_evals = {}
        ) 
        {
                return find_min_global(tp, std::move(f), bound1, bound2, is_integer_variable, max_function_calls(), max_runtime, solver_epsilon, initial_function_evals);
            }
    

    Also mein Problem ist die Funktion mit der richtigen initial_function_evals aufzurufen. Wie lege ich einen const vector mit einem struct als Datentyp an ?

    Gruß,
    Robo



  • Warum sollte der vector const sein?



  • Der 'vector' muß nicht zwingend const sein (das ist nur die für die Parameterdeklaration, damit man sieht daß der als Referenz übergebene vector dort nicht verändert wird).

    Und generell kannst du einfach den vector entweder mithilfe der Initialisierung { ... } oder aber dynamisch mittels .push_back(...) (bzw. .emplace_back(...)) füllen.
    Da in der Struktur alle Member public sind, also einfach per:

    std::vector evals = { { x1, y1 }, { x2, y2 } }; 
    

    Es kommt jetzt nur darauf an, wie eine Variable vom Typ matrix<double,0,1> erzeugt wird, damit du die x-Werte passend setzen kannst.


Log in to reply