2016-07-01 19 views
0

私のコードを少しきれいにしようとしているうちに、私は理解できないような問題に遭遇しました。私は関数にベクトル値を渡そうとしているので、メインコードではなく関数で評価を行うことができますが、実際にベクトルを正しく渡す方法はわかりません。ベクトルを関数に渡す

#include "stdafx.h" 
#include <vector> 
#include <random> 
#include <string> 
#include <fstream> 
#include <algorithm> 
#include <iterator> 

int population_size = 10; 
int number_of_variables = 3; 

struct one_individual 
{ 
std::vector<std::vector<double>>chromosomes; 
double evaluation1 = 0; 
double evaluation2 = 0; 
double evaluation3 = 0; 
double fitness = 0; 
double probability = 0; 
}; 

std::vector<one_individual> individuals; 

double evaluation(std::vector<one_individual> individuals[i]) 
{ 
individuals[i].evaluation1 = 1 * individuals[i].chromosomes[0].at(0) + 2 * individuals[i].chromosomes[0].at(1) + 3 * individuals[i].chromosomes[0].at(2); 
individuals[i].evaluation2 = 1.5 * individuals[i].chromosomes[0].at(0) + 3 * individuals[i].chromosomes[0].at(1) + 4.5 * individuals[i].chromosomes[0].at(2); 
individuals[i].evaluation3 = 2 * individuals[i].chromosomes[0].at(0) + 4 * individuals[i].chromosomes[0].at(1) + 6 * individuals[i].chromosomes[0].at(2); 

individuals[i].fitness = 1/(individuals[i].evaluation1 + individuals[i].evaluation2 + individuals[i].evaluation3); 

return individuals[i].fitness; 
} 

int main() 
{ 
    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); 

    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)); 
     } 
     individuals[i].chromosomes.push_back(variables); 
    } 


    for (int i = 0; i < population_size; i++) 
    { 
     evaluation(individuals[i]); 
     std::cout << "Individual " << i << " has fitness of " << individuals[i].fitness; 
    }  
} 

私はそれを読んでても過言ではありませんように、できるだけ多くのコードを凝縮しようとした、私は実際にそこにする必要がありませんまだ、すべてを考えます。

とにかく、私はベクトルの値を関数に渡そうとしましたが、うまくいきませんでした。答えは私の間違いです。

ご協力いただければ幸いです。あなたはベクトルを反復処理し、一度に一つの要素を処理したい場合は

+0

「ベクターを正しく渡す」とはどういう意味ですか? – GMichael

+1

あなたの意図であれば、 'double evaluation(std :: vector 個体[i])'を 'double evaluation(std :: vector 個体)'に変更する必要があります。私は代わりに参照を使用して値渡しを避けるだろう... –

+0

@Gmichael、今すぐコードがコンパイルされないので、関数に正しくベクトルを渡していないと言うでしょう。私がしたいのは、 "染色体"を関数に渡して関数内で計算ができるようにすることです。 – Milan

答えて

1

、あなたはちょうどあなたが

ような何かを考え、あなたのベクトルを反復処理するには
double evaluation(one_individual& person) 
{ 
    // do stuff with person 
} 

上で反復されているタイプを渡す必要があります
for (auto& person : individuals) 
{ 
    evaluation(person); 
} 
0
double evaluation(std::vector<one_individual> individuals[i]) 

でなければなりません

double evaluation(std::vector<one_individual>& individuals) 

また、パラメータと同じ名前のグローバル変数を削除します。最初にグローバルとして宣言する理由はありません。

+0

グローバルについての良い点。しかし、この答えは、OPが索引「i」で渡されたり、おそらく一番良いリファクタリングが、Coryが示すように一度に1つの要素で作業することなく、そのまま動作することはありません。 –

+0

@underscore_d私はベクトルを関数に渡す方法に答えました。 OPのコードを変更して意味をなさないようにする方法は別の問題です。 – Lundin

関連する問題