2016-09-13 8 views
0

私のMCVCはコンパイル中ですが、意図したとおりに機能していません。目標は、基本、すなわち交叉、突然変異、進化を行う遺伝的アルゴリズムである。私が提供したコードでは、良い仕事のステートメントを印刷する必要がありますが、そうではありません。私は新しいプログラマーです、ごめんなさい。 私の質問は次のとおりです:私のアレイは高速なCPUとメモリの構築の原因ですか?

1)CPUとラムがアップされ、この配列の宣言と実装がコントロールされていないスパイクの原因ですか?

2)私の2.53 GHz Intel Core 2 Duoはそれに対応していませんか?

3)ループの量を減らすべきですか?

いつでも助けが歓迎されます!

Individual.h

#include <stdio.h> 
#include <cstdlib> 
#include <ctime> 
#include <vector> 
#include <array> 
#include <iostream> 
class Individual 
{ 
public: 

    inline int getRandomNumber(int min = 0, int max = 1) 
    { 
     srand(static_cast<unsigned int>(time(0))); 
     static const double fraction = 1.0/(static_cast<double>(RAND_MAX) + 1.0); 
     return static_cast<int>(rand() * fraction * (max - min + 1) + min); 
    } 
private: 
    int defaultGeneLength = 64; 
    std::vector<char>genes; 
    int fitness = 0; 

public: 
    Individual() 
    { 
     std::cout<<"Good Job"; 

    } 

    //setters and getters 
    void generateIndividual(); 
    void setDefaultGeneLength(int length); 
    char getGene(int index); 
    void setGene(int index, char value); 

    //public methods 
    unsigned int size(); 
    int getFitness(); 
    std::string toString(); 
}; 

Individual.cpp

#include "Individual.h" 

void Individual::generateIndividual() 
{ 
    for (int i = 0; i < size(); i++) 
    { 
     genes.push_back(getRandomNumber()); 
    } 
} 


//setters and getters 
void Individual::setDefaultGeneLength(int length) 
{ 
    defaultGeneLength = length; 
} 


char Individual::getGene(int index) 
{ 
    return genes.at(index); 

} 


void Individual::setGene(int index, char value) 
{ 
    genes[index] = value; 
    fitness = 0; 
} 


//public methods 
unsigned int Individual::size() 
{ 
    return genes.max_size(); 
} 


int Individual::getFitness() 
{ 
    if(fitness == 0) 
    { 
     fitness = 1; 

    } return fitness; 

} 


std::string Individual::toString() 
{ 
    std::string geneString = ""; 
    for (int i = 0; i < size(); i++) 
    { 
     geneString.append(getGene(i),1); 
    } 
    return geneString; 

} 

Population.h

#include "Individual.h" 

class Population 
{ 
std::array<std::auto_ptr<Individual>,50>myarray; 

public: 


    Population(int populationSize, bool initialise) 
    { 
     std::cout<<"Good Job2"; 
     if(initialise) 
     { 
      for (int i = 0; i < populationSize; ++i) 
      { 
       std::auto_ptr<Individual>newIndividual(new Individual()); 
       myarray.at(i) = newIndividual; 
       myarray.at(i)->generateIndividual(); 
       saveIndividual(i,*(myarray.at(i))); 
      } 
     } 
     std::cout<<"Good Job 3"; 
    } 

    Individual getIndividual(int index); 
    Individual getFittest(); 
    unsigned long size(); 
    void saveIndividual (int index, Individual indiv); 

    ~Population() 
    { 

    } 
}; 

Population.cpp

#include "Population.h" 
Individual Population::getIndividual(int index) 
{ 
    return *myarray.at(index); 
} 

Individual Population::getFittest() 
{ 
    Individual fittest = *myarray.at(0); 

    for (int i = 0; i < myarray.max_size(); i++) 
    { 
     if (fittest.getFitness() <= getIndividual(i).getFitness()) 
     { 
      fittest = getIndividual(i); 
     } 
    } 
    return fittest; 
} 

unsigned long Population::size() 
{ 
    return myarray.max_size(); 
} 

void Population::saveIndividual (int index, Individual indiv) 
{ 
    *myarray.at(index) = indiv; 
} 

MAIN.CPP

int main(int argc, const char * argv[]) { 

    Population *mypop = new Population(2,true); 
    delete mypop; 
    mypop = nullptr; 
return 0; 
} 
+2

一般的なコメント: 'auto_ptr'をもう使用しないでください。代わりに' unique_ptr'を使用してください。 – Mine

答えて

2
unsigned int Individual::size() 
{ 
    return genes.max_size(); 
} 

あなたgenesは次のよう

std::vector<char> genes; 

C++標準はstd::vector::max_size()を定義:

距離((開始)、終了します() )可能な限り大きい容器の場合

「可能な限り大きな容器」とは何も指定されていません。 「可能」とは、システムに10テラバイトのハードドライブが搭載されている場合など、オペレーティングシステムがハードドライブ全体を使用して仮想メモリのアドレス空間をページングできるようなものを意味します。それは確かに "可能"な言葉の意味です。しかし、10テラバイトのページングにはしばらく時間がかかります。 64ビットのgcc、以下の簡単なプログラムで

#include <iostream> 
#include <vector> 

int main() 
{ 
    std::vector<char> c; 

    std::cout << c.max_size() << std::endl; 
    return 0; 
} 

は、次の出力を生成します。

18446744073709551615 

しかし、実際には、このような大きさのベクトルを作成することができるという私のチャンスはありませんとても良い。

しかしさんが戻ってあなたのコードを取得してみましょう:

void Individual::generateIndividual() 
{ 
    for (int i = 0; i < size(); i++) 
    { 
     genes.push_back(getRandomNumber()); 
    } 
} 

[OK]をクリックします。あなたは非常に幸運に感じる必要があります。あなたはを作成することが可能であると信じています。これはmax_size()です。

あなたはそれについてかなり確信していますか?

私は幾分懐疑的です。

+1

:)幸いなことに、彼のコードは2^32( 'unsigned'の使用により)に制限されます - スーパーファミリーの人は4GBの遺伝子しか持たないでしょう - 塩基対*(遺伝子)は約3Gである。残念なことに、彼はそれらの4G人口を進化させようとしている(彼は 'Population'クラスで同じテクニックとデータ型を使っていた)。彼が成功するチャンスがあれば心配です。 –

関連する問題