Как использовать функцию 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;
}
// ...

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

1 ответ

Решение

Согласно документации Gecode функция заслуг должна возвращать двойное число. Как следует из определения типа 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;
}
// ...
Другие вопросы по тегам