Как использовать функцию Merit в Gecode?

Я пытаюсь использовать функцию оценки для своего ветвления в Gecode. В MPG, Руководстве по Gecode, указан пример функции качества и то, как передать ее в разветвление. Но я не могу понять, куда поместить функцию. Должен ли он быть внутри сценария или снаружи? Прямо сейчас я поместил его рядом с функцией копирования и т. д. Я не могу найти ни одного примера кода, где кто-то использует функцию оценки.

Я получаю следующую ошибку:

program.cpp(247): error C2059: syntax error: '}'                                                          
program.cpp(247): error C2853: 'm': a non-static data member cannot have a type that contains 'auto'      
program.cpp(259): fatal error C1004: unexpected end-of-file found   

Это код, который я пробую:

    // ...
    branch(*this, workers, BOOL_VAR_MERIT_MIN(m), BOOL_VAL_MAX());
}

auto m = [](const Space& home, BoolVar x, int i) {
    return i;
}
// ...

Я знаю, что глупо создавать функцию оценки, которая просто возвращает индекс, я просто пытаюсь заставить работать простейшую функцию оценки, прежде чем делать то, что хочу.


person Atonic    schedule 15.01.2018    source источник


Ответы (1)


Согласно документации Gecode, функция качества должна возвращать значение типа double. Как следует из определения типа BoolBranchMerit:

typedef std::function<double(const Space& home, BoolVar x, int i)> Gecode::BoolBranchMerit

Чтобы быть в безопасности, вы также можете объявить m как Gecode::BoolBranchMerit. Поэтому я думаю, что следующее должно исправить ваш пример:

    // ...
    branch(*this, workers, BOOL_VAR_MERIT_MIN(m), BOOL_VAL_MAX());
}

BoolBranchMerit m = [](const Space& home, BoolVar x, int i) -> double {
    return (double) i;
}
// ...
person Dekker1    schedule 31.01.2018