我正在尝试使用C ++构建优化库以进行参数优化。
问题和参数类型可能会有所不同,例如如果问题是最小化Ackley Function,则我们有一个vector<double>
,大小为2
(x的索引为0,y的索引为1)。但是,当参数是整数甚至是字符串时,我们可能会遇到问题。
[存在许多用于这种类型优化的算法,例如遗传算法,差异进化算法等。在大多数算法中,一旦我们根据其优化策略修改了参数,就必须调用一个评估函数来接收参数,并给出一个目标函数,将返回一个值(适合度)。
我的问题是我如何在C ++中实现抽象类Problem
,使其包含一个virtual double evaluate
函数,在该函数中接收相关问题的通用类型的向量作为参考?例如,用户的问题应继承Problem
,并且需要指定类型T
,在这种情况下,评估函数应类似于virtual double evaluate(const vector<T> ¶meters){}
。
如果我上面提到的策略对C ++不可行。请提出替代策略。
这样的事情会吗?
#include <memory>
#include <iostream>
#include <vector>
class Problem {
public:
virtual double evaluate() = 0;
};
class MyProblem : public Problem {
public:
MyProblem(const std::vector<float>& parameters) : mParameters(parameters) {}
double evaluate() override {
// Do evaluation based on mParameters
return 47.11;
}
private:
const std::vector<float>& mParameters;
};
int main() {
std::vector<float> v = {1.0f, 2.0f};
std::unique_ptr<Problem> p{new MyProblem(v)};
std::cout << p->evaluate() << '\n'; // Calls MyProblem::evaluate()
return 0;
}