c ++神经网络路径查找不动

时间:2018-11-30 14:04:25

标签: c++ neural-network artificial-intelligence

我正在用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 "";}

但是,该函数始终根本不返回任何运动,而且我不确定为什么即使经过几分钟的等待,网络也没有隐藏的层,我还是从输入直接链接到输出开始简单 我不确定我的错误计算是否正确,然后再调整权重。我不确定我应该使用什么来让AI确定如何移动

0 个答案:

没有答案