Как практика для себя Я пытаюсь создать генетический алгоритм, который будет решать уравнения. Пока моя программа может генерировать случайные «гены», заполнять людей этими «генами» и делать некоторые базовые вычисления с генами (на данный момент просто суммируя «гены»).Использование structs/генетический алгоритм
Однако, я понял, что хочу реализовать свою функцию фитнеса, что мне было бы лучше создать структуру для отдельного человека, так как мне нужно, чтобы гены и результат фитнеса были вместе, чтобы получить наиболее подходящие гены еще раз.
Во всяком случае, вот мой код:
// GA.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <random>
#include <string>
const int population_size = 10;
const int number_of_variables = 7;
struct one_individual
{
std::vector<std::vector<double>>individual;;
double evaluation = 0;
double fit = 0;
};
int main()
{
// Generate random number
std::random_device rd;
std::mt19937 rng(rd()); // random-number engine (Mersenne-Twister in this case)
std::uniform_real_distribution<double> dist(-10.0, 10.0);
// Create vector that holds vectors called individual and fill size it to the amount of individuals I want to have.
std::vector<std::vector<double>>individual;
for (int i = 0; i < population_size; i++)
{
std::vector<double>variables;
for (int j = 0; j < number_of_variables; j++)
{
variables.push_back(dist(rng));
}
individual.push_back(variables);
}
// Display entire population
for (auto &count : individual)
{
for (auto &count2 : count)
{
std::cout << count2 << " ";
}
std::cout << "\n";
}
// Do calculation with population. At the moment I just add up all the genes (sum) and display the sum for each individual.
for (int i = 0; i < population_size; i++)
{
int j = 0;
std::cout << "Organism "<< i;
double sum = individual[i].at(j) + individual[i].at(j + 1) + individual[i].at(j + 2) + individual[i].at(j + 3) + individual[i].at(j + 4) + individual[i].at(j + 5) + individual[i].at(j + 6);
std::cout << " is " << sum << "\n";
}
std::cout << "\n";
return 0;
}
То, что я думаю, что я должен делать что-то вроде этого:
for (int i = 0; i < population_size; i++)
{
one_individual individual;
std::vector<double>variables;
for (int j = 0; j < number_of_variables; j++)
{
variables.push_back(dist(rng));
}
one_individual.individual.push_back(variables);
}
Приведенный выше код не работает. Что происходит, когда я пытаюсь скомпилировать, я получаю список ошибок, я просто вложил их в pastebin, так как это довольно большой список: www.pastebin.com/EVJaV0Ex. Если я удалю все, кроме частей, необходимых для «создания отдельной части», остаются следующие ошибки: www.pastebin.com/djw6JmXZ. Все ошибки находятся в строке 41, которая является последней строкой one_individual.individual.push_back (переменные);
Отредактировано для наглядности, извинения, что было неясно.
* «Но очевидно, что это не работает» *, нет, это не очевидно. Почему он не работает? Разве это не компиляция, если не какая именно ошибка вы получаете? Если вы не получаете правильное поведение во время выполнения, описывайте свою проблему с помощью [Минимального, полного и проверяемого примера] (https://stackoverflow.com/help/mcve) – CoryKramer
Что происходит, когда я пытаюсь скомпилировать, я получаю список ошибки, я просто вложил его в pastebin, так как это довольно большой список: http://pastebin.com/EVJaV0Ex. Если я удалю все, кроме частей, необходимых для «создания отдельных частей», остаются следующие ошибки: http://pastebin.com/djw6JmXZ. Все ошибки находятся в строке 41, которая является последней строкой one_individual.individual.push_back (переменные); Это делает его более ясным? Добавил его в мой оригинальный вопрос. – Milan