2012-11-15 52 views
6

我正在嘗試設置一棵樹(最終用於「神經網絡」並試圖儘可能提高安裝效率。不幸的是,即使設置樹也需要大約3分鐘的時間,我不知道它是如何使它效率低下,我試圖儘可能使用指針來儘量減少負載,但它仍然是永遠存在。我做錯了什麼?C++中的效率

PS。這是最終的Tic Tac Toe AI(是的,我知道只需看看那個愚蠢的遊戲就可以解決問題,但是我想把它當成一個簡單的AI來教自己怎麼做)

樹的每個分支都有9個節點,每個節點分支出另一個節點這給最後一組分支約4億個節點。有沒有辦法更有效地執行此代碼?

#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

你有沒有試過通過探查器運行這個?或者看看其他人是如何實現一個玩AI的井字遊戲? – GWW

+5

改變它使用指針是一個壞主意。現在它慢而且錯,而不是緩慢。 –

+2

緩慢可能是創建的512多個向量,將數據推入其中,然後立即銷燬。 –

回答

3

你有一個完全平衡的9-ary樹? 不要爲每個元素分配一個節點!相反,分配的數組,你節點和使用計算瀏覽樹:

  • 從節點i到其父導航你計算(i - 1)/9
  • 查找要計算i * 9 + 1
  • 最左邊的孩子

(或類似的東西;它在半夜,我不太想做這個數學)。在任何情況下,您都可以使用這樣的公式導航完全平衡的n元樹。這種方法例如用於d-heaps。這種方法的優點是你只有一個大的分配,並且導航樹變成了計算而不是內存查找。這就是說,我懷疑你是否真的想要這樣一棵樹:選擇的數量隨着每一步移動而變小,你可能想完全殺死某些分支。儘管如此,樹木技術仍然有用。

+0

關於你的數學筆記,我認爲如果你對你的數據進行單因子分類,你可以分別做'i/9'和'i * 9'來到父母和孩子身上。編輯:沒有等待,那也不管用。 – Xymostech