c ++ Нейронная сеть не находит путь к поиску - PullRequest
0 голосов
/ 30 ноября 2018

Я делаю нейронную сеть в 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 "";}

однако функция всегда не возвращает никакого движения, и я не уверен, почему даже после нескольких минут ожидания нет скрытых слоев в сети, я начинаю просто с входов, напрямую связанных с выходом, я не уверенесли мой расчет ошибок верен, то отрегулируйте веса.я не уверен, что я должен использовать, чтобы позволить ай определить, как двигаться

...