首页 > 解决方案 > c ++神经网络路径查找不动

问题描述

我正在用c ++制作一个神经网络来遍历迷宫,知道玩家在哪里,它可以移动的2d方向(上,下,左,右)以及目标在哪里,我可以随时获得距离球员也达到目标

到目前为止,这是我的代码

std::string NeuralNetwork::evolve(player p)
{
        openMoves = p.getMoves();
playerPos = p.getListPos();
goalPos = p.getGoalPos();

values.clear();

for (auto item : openMoves)
    values.push_back(item);
values.push_back(playerPos.x);
values.push_back(playerPos.y);

if (outputs.size() == 0)
    outputs.resize(4);
if (inputs.size() == 0)
    inputs.resize(values.size());

for (int i = 0; i < inputs.size(); i++)
{
    inputs[i].srcValue = values[i];
    if (inputs[i].weightList.size() == 0)
    {           
        for (int j = 0; j < outputs.size(); j++)
        {
            inputs[i].weightList.push_back(dist(100) / 100.0f);
        }
    }
}

for (int i = 0; i < outputs.size(); i++)
{
    outputs[i].out = 0;
    if (outputs[i].theta == NULL)
        outputs[i].theta = dist(-100, 100) / 100.0f;//rand funct to produce int between -100-100 then divide by 100 to get theta between -1 and 1
    for (auto a : inputs)
    {

        outputs[i].out += (a.srcValue * a.weightList[i]);
    }
    outputs[i].finalOut = outputs[i].out / (1.0f + fabs(outputs[i].out));
    //outputs[i].finalOut = 1 / (1 + std::pow(exp(1), -(outputs[i].out - outputs[i].theta)));
}

for (int i = 0; i < outputs.size(); i++)//backwards prop
{
    float e = 1 - outputs[i].finalOut;
    float delta = outputs[i].finalOut * (1 - outputs[i].finalOut)*e;
    for (int j = 0; j < inputs.size(); j++)
    {
        inputs[j].weightList[i] += alpha * inputs[j].srcValue * delta;
    }
    outputs[i].theta += alpha * (-1)*delta;
} 

神经网络是一个每帧都调用的函数,玩家从左上角开始,目标在右下角,该函数返回玩家移动的方向。但是,使用反向传播,每个输出最终都不会是 1这是我用来确定其方向的

for (int i = 0; i < outputs.size(); i++)
{
    if (outputs[0].finalOut == 1)//left
    {
        return "01";
    }
    else if (outputs[1].finalOut == 1)//up
    {
        return "10";
    }
    else if (outputs[2].finalOut == 1)//down
    {
        return "11";
    }
    else if (outputs[3].finalOut == 1)//right
    {
        return "00";
    }
}
return "";}

但是该函数始终根本不返回任何动作,我不知道为什么,即使等待几分钟后,网络也没有隐藏层我开始很简单,输入直接链接到输出我不确定如果我的错误计算是正确的然后调整权重。我不确定我应该使用什么来让人工智能确定如何移动

标签: c++neural-networkartificial-intelligence

解决方案


推荐阅读