Я работаю над созданием кода, который будет выполнять операцию «кроссовера» для генетического алгоритма. Проще говоря, у меня есть два вектора ‘a’ и ‘b’, и каждый из них будет разбит на две части, так что a дает ‘a1’ и ‘a2’, в то время как ‘b’ дает ‘b1’ и ‘b2’. Эти части должны быть рекомбинированы так, чтобы a стало ‘b2’, а затем ‘a1’, а ‘b’ стало ‘a2’ и затем ‘b1’.
Из-за библиотеки, которую я использую — EvolvingObjects — Мне нужно передать «a» и «b» экземпляру класса, который будет выполнять операцию, описанную выше. У меня проблемы с созданием «a1», «a2», «b1» и «b2» в этом классе, и я надеялся, что кто-нибудь скажет мне, почему. Мой код ниже.
class Quad : public std::vector<int>
{
public:
Quad() : std::vector<int>(4,0) {
}
};
class QuadInit : public eoInit<Quad>
{
public:
void operator()( Quad& q ) {
for( unsigned int i=0, n=4; i<n; ++i) {
// rng is the random number generator of EO
q[i] = rng.random(10);
}
}
};
class QuadVec : public eoVector<double,Quad>
{};class eoQuadCross: public eoQuadOp<QuadVec>{
public:
std::string className() const {return "eoQuadCross";}
QuadVec a1;
QuadVec a2;
QuadVec b1;
QuadVec b2;
bool operator() (QuadVec& a, QuadVec& b){
int cross_position_a = rng.random(a.size()-1);
int cross_position_b = rng.random(b.size()-1);
for (int i = 0; i < cross_position_a; i++){
a1.push_back(a[i]);
}
for (int i = cross_position_a; i < a.size(); i++){
a2.push_back(a[i]);
}
for (int i = 0; i < cross_position_b; i++){
b1.push_back(b[i]);
}
for (int i = cross_position_b; i < b.size(); i++){
b2.push_back(b[i]);
}
//Return bool
return true;
}
Задача ещё не решена.
Других решений пока нет …