【问题标题】:Efficiency in C++ [closed]C ++的效率[关闭]
【发布时间】:2012-11-15 00:41:38
【问题描述】:

我正在尝试设置一棵树(最终用于“神经网络”,并尝试使设置尽可能高效。不幸的是,即使设置树也需要大约 3 分钟,但我不能不知道是什么让它如此低效。我试图尽可能使用指针来最小化负载,但它仍然需要永远。我做错了什么?

PS。这最终适用于井字游戏 AI(是的,我知道这可以通过查看愚蠢的游戏来解决,但我想将其作为一个简单的 AI 来自学。

树的每个分支将有 9 个节点,每个节点分支出另外 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;
}

【问题讨论】:

  • 您是否尝试过通过分析器运行它?或查看其他人如何实现井字游戏 AI?
  • 将其更改为使用指针是个坏主意。现在它变慢了和错误,而不仅仅是慢。
  • 缓慢可能是创建了 512+ 个向量,将数据推入其中,然后立即销毁。
  • 看起来您正在创建一个完整的游戏树,而不是用于玩游戏的神经网络。这里的目标是什么?

标签: c++ performance artificial-intelligence


【解决方案1】:

你有一个完全平衡的 9 叉树吗? 不要为每个元素分配一个节点!相反,为您的节点分配一个数组并使用计算导航树:

  • 要从节点 i 导航到其父节点,您需要计算 (i - 1) / 9
  • 要找到你要计算的最左边的孩子i * 9 + 1

(或类似的东西;现在是半夜,我还没准备好做这个数学)。在任何情况下,您都可以使用这样的公式导航一个完全平衡的 n 叉树。例如,这种方法用于d-heaps。这种方法的优点是您只有一个大的分配,并且导航树变成了计算而不是内存查找。

也就是说,我怀疑你是否真的想要这样的树:每一步选择的数量都会变少,你可能想完全杀死某些树枝。不过,树的技术可能仍然有用。

【讨论】:

  • 关于您的数学的注释,我认为如果您对数据进行 1 索引,您只需执行 i / 9 和 i * 9 分别访问父母和孩子。编辑:不用等待,这也不起作用。
猜你喜欢
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
相关资源
最近更新 更多