Я пытаюсь написать программу на C ++ для канонического генетического алгоритма , где у вас есть популяция индивидуумов (хромосом) длины N, где каждый элемент представляет собой O или 1.
Я начал писать свою программу с использованием векторов STL , но прежде чем углубляться в это, я хотел бы спросить ваше мнение о том, как наиболее эффективно написать функции и структуры данных.
Объем памяти не является проблемой, у меня есть популяция около 100 человек, каждый из которых представляет собой строку длиной 64 символа из 0 и 1.Производительность, с другой стороны, очень важна, так как было бы около тысяч поколений, каждое из которых имеет тысячи операций.
Вот моя реализация до сих пор (только самые важные функции иструктура данных):
typedef vector<int> chromosome;
typedef vector<chromosome> population;
population popul;
float eval[number];
void cross_chromosomes( const chromosome &parent_a, const chromosome &parent_b, chromosome &child_a, chromosome &child_b )
{
int crossing_point = crossing_point_gen( gen );
child_a.reserve( length );
child_a.insert( child_a.end(), parent_a.cbegin(), parent_a.cbegin() + crossing_point );
child_a.insert( child_a.end(), parent_b.cbegin() + crossing_point, parent_b.cend() );
child_b.reserve( length );
child_b.insert( child_b.end(), parent_b.cbegin(), parent_b.cbegin() + crossing_point );
child_b.insert( child_b.end(), parent_a.cbegin() + crossing_point, parent_a.cend() );
}
void calculate_eval()
{
for( int i = 0; i < number; i++ )
{
eval[i] = evaluate_chromosome( popul[i] );
}
}
Как вы думаете, это эффективный способ реализации этого алгоритма? Я изначально использовал вектор для хромосомы, но я прочитал этот вопрос: C ++ Vector vs Array (Time) , и я обновил свой код до vector<int>
.
Как вы думаете, есть ли другие оптимизации, которые я должен сделать с моим кодом, чтобы сделать его более эффективным?Эффективен ли код пересечения, как сейчас?