2012-11-15 13 views
6

Bir ağaç oluşturmaya çalışıyorum (sonunda bir "sinir ağında" kullanılmak üzere ve kurulumu mümkün olduğunca verimli hale getirmeye çalışıyorum. Maalesef ağacın kurulumu bile yaklaşık 3 dakika sürüyor. Bunun ne kadar verimsiz olduğunu anlayamıyorum: Yükü en aza indirgemek için mümkün olan her yerde işaretçiler kullanmaya çalıştım ama hala sonsuza kadar sürüyor.Ne yanlış yapıyorum? Bir Tic Tac Toe AI (evet biliyorum sadece aptal oyun bakarak çözülebilir, ama ben kendimi nasıl öğretmek için basit bir AI olarak yapmak istedim.Verimlilik C++

Ağacın her dalında 9 düğüm olacaktı, Her düğüm başka bir yapmak için dallara ayrılıyor 9. Bu, son dallar kümesini yaklaşık 400 milyon düğüm verir. Bu kodu daha verimli bir şekilde yapmanın bir yolu var mı?

#include <iostream> 
#include <vector> 


using namespace std; 

class Node; 
class Set; 


class Node { 
    public: 
     Node(double, Set*); 
     Node(); 
     double value; 
     Set * nextSet; 
}; 
class Set { 
    public: 
     Set(vector<Node *>); 
     Set(); 
     vector<Node *> nodes; 
}; 
class NeuralNet { 
    public: 
     Set * firstSet; 
}; 
Node::Node(double val, Set * newSet){ 
    value = val; 
    nextSet = newSet; 
} 
Set::Set(vector<Node *> input){ 
    nodes = input; 
} 
Node::Node(){ 
    Set temp; 
    nextSet = &temp; 
} 
Set::Set(){ 
    vector<Node *> temp; 
    nodes = temp; 
} 
void setUpNeuralNetRecursive(Set * curSet, int curDepth){ 
    if(curDepth<9){ 
     for(int i=0;i<9;i++){ 
      Set newSet; 
      Node newNode(1,&newSet); 
      (*curSet).nodes.push_back(&newNode); 
      setUpNeuralNetRecursive(&newSet, curDepth+1); 
     } 
    } 
} 
void setUpNeuralNet(NeuralNet net){ 
    Set newSet; 
    net.firstSet=&newSet; 
    setUpNeuralNetRecursive(&newSet, 0); 
} 
int main() 
{ 
    cout << "Setting up neural network. This may take up to 3 minutes." << endl; 
    NeuralNet net; 
    setUpNeuralNet(net); 
    cout << "Setup ended." << endl; 

    return 0; 
} 
+2

Bunu bir profiler aracılığıyla çalıştırmayı denediniz mi? ya da başka insanların nasıl bir tac-toe-toe oynuyor? – GWW

+5

işaretçileri kullanmak için değiştirerek kötü bir fikirdi. Şimdi yavaş yavaş yerine yavaş yavaş _and_. –

+2

Yavaşlık muhtemelen, yaratılan veriye sahip olan 512+ vektörün oluşturulduğu ve daha sonra hemen imha edildiği vektörlerdir. –

cevap

3

Tam dengeli, 9-ary ağacı var mı? 'u her bir öğe için bir düğüm ayırmayın! Eğer i * 9 + 1 hesaplamak ediyorum en soldaki çocuğu bulmak için (i - 1)/9

  • hesaplamak istiyorum

    • için üst düğüm i den gezinmek için: Bunun yerine, düğümler için bir dizi tahsis ve hesaplamalar kullanılarak ağaç gezinmek

    (veya bunun gibi bir şey; bu, gecenin tam ortasında ve bu matematiği yapmakta pek başarılı değilim). Her durumda, böyle bir formül kullanarak tam dengeli bir n-ary ağacı gezinebilirsiniz. Bu yaklaşım, örneğin d-heaps için kullanılır. Bu yaklaşımın avantajı, yalnızca tek bir büyük tahsise sahip olmanız ve ağacınızda gezinmenin, bellek aramaları yerine bilgisayarlaşmaya dönüşmesidir.

    Şöyle söyledim, gerçekten böyle bir ağacın olmasını istediğinizden şüpheliyim: Her hareketle seçimlerin sayısı küçülür ve muhtemelen bazı dalları tamamen öldürmek istersiniz. Yine de ağaçlar için teknik hala yararlı olabilir.

  • +0

    Matematiğinizle ilgili bir notta, verilerinizi 1 dizine eklerseniz, sırasıyla ebeveynlere ve çocuklara ulaşmak için 'i/9 've' i * 9' yaparsınız. Düzenleme: Hayır bekle, bu da işe yaramıyor. – Xymostech