2016-05-03 3 views
0

Как практика для себя Я пытаюсь создать генетический алгоритм, который будет решать уравнения. Пока моя программа может генерировать случайные «гены», заполнять людей этими «генами» и делать некоторые базовые вычисления с генами (на данный момент просто суммируя «гены»).Использование 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 (переменные);

Отредактировано для наглядности, извинения, что было неясно.

+4

* «Но очевидно, что это не работает» *, нет, это не очевидно. Почему он не работает? Разве это не компиляция, если не какая именно ошибка вы получаете? Если вы не получаете правильное поведение во время выполнения, описывайте свою проблему с помощью [Минимального, полного и проверяемого примера] (https://stackoverflow.com/help/mcve) – CoryKramer

+0

Что происходит, когда я пытаюсь скомпилировать, я получаю список ошибки, я просто вложил его в pastebin, так как это довольно большой список: http://pastebin.com/EVJaV0Ex. Если я удалю все, кроме частей, необходимых для «создания отдельных частей», остаются следующие ошибки: http://pastebin.com/djw6JmXZ. Все ошибки находятся в строке 41, которая является последней строкой one_individual.individual.push_back (переменные); Это делает его более ясным? Добавил его в мой оригинальный вопрос. – Milan

ответ

1

Рассмотрим Инструкцией

one_individual.individual.push_back(variables); 

где one_individual является типа (struct one_individual).

Я полагаю, вы должны использовать определенную переменную типа one_individual, так

individual.individual.push_back(variables); 
+0

Спасибо, человек, это было действительно! – Milan