Route *AnnealingAlgorithm::makeMutation(Route *route)
{
    Route * result = new Route(route->getSize(),route->getAdjacencyMatrix());
    for(unsigned int i = 0; i < route->getSize(); i++)
    {
        result->insertNode(i,route->at(i));
    }
    unsigned int firstPosition = 0;
    unsigned int secondPosition = 0;
    unsigned int tempNodeNumber = 0;
    unsigned int tempNodeNumber2 = 0;

    do
    {
        firstPosition = qrand() % route->getSize();
        secondPosition = qrand() % route->getSize();
    }
    while(!((firstPosition != 0) && (secondPosition != 0)));

    if(firstPosition > secondPosition)
    {
        unsigned int tempValue = firstPosition;
        firstPosition = secondPosition;
        secondPosition = tempValue;
    }

    if(firstPosition == secondPosition)
    {
        if(firstPosition > 1)
        {
            firstPosition = firstPosition - 1;
        }
        if(secondPosition != (result->getSize() - 1))
        {
            secondPosition = secondPosition + 1;
        }
    }

    tempNodeNumber = route->at(firstPosition);
    tempNodeNumber2 = route->at(secondPosition);

    result->insertNode(firstPosition,-1);
    result->insertNode(secondPosition,-2);

    result->insertNode(firstPosition,tempNodeNumber2);
    result->insertNode(secondPosition,tempNodeNumber);

    return result;
}
Route *GeneticAlgorithm::crossbreedRoutes(Route *firstRoute, Route *secondRoute)
{
    Route * result = new Route(firstRoute->getSize(),firstRoute->getAdjacencyMatrix());
    //QMap<unsigned int,unsigned int> nodeMap;
    QList<unsigned int> unusedNodes;

    unsigned int firstPosition = 0;
    unsigned int secondPosition = 0;

    do
    {
        firstPosition = qrand() % firstRoute->getSize();
        secondPosition = qrand() % firstRoute->getSize();
    }
    while(!((firstPosition != 0) && (secondPosition != 0)));

    for(unsigned int m = 0; m < firstRoute->getSize(); m++)
    {
        unusedNodes.append(m);
    }

    if(firstPosition > secondPosition)
    {
        unsigned int tempValue = firstPosition;
        firstPosition = secondPosition;
        secondPosition = tempValue;
    }
    if(firstPosition == secondPosition)
    {
        if(firstPosition > 1)
        {
            firstPosition = firstPosition - 1;
        }
        if(secondPosition < (result->getSize() - 1))
        {
            secondPosition = secondPosition + 1;
        }

    }
    result->insertNode(0,firstRoute->at(0));
    unusedNodes.removeOne(firstRoute->at(0));

    for(unsigned int i = firstPosition; i<=secondPosition; i++)
    {
        result->insertNode(i,firstRoute->at(i));
        unusedNodes.removeOne(firstRoute->at(i));
    }
    for(unsigned int j = 1; j < firstPosition; j++)
    {
        if(!result->containsNode(secondRoute->at(j)))
        {
            result->insertNode(j,secondRoute->at(j));
            unusedNodes.removeOne(secondRoute->at(j));
        }
    }
    for(unsigned int k = secondPosition + 1; k < firstRoute->getSize(); k++)
    {
        if(!result->containsNode(secondRoute->at(k)))
        {
            result->insertNode(k,secondRoute->at(k));
            unusedNodes.removeOne(secondRoute->at(k));
        }
    }
    for(unsigned int n = 1; n < firstRoute->getSize(); n++)
    {
        if(result->at(n) == -1)
        {
            if(unusedNodes.size() != 0)
            {
                unsigned int randomNodePosition = qrand() % unusedNodes.size();
                result->insertNode(n,unusedNodes.at(randomNodePosition));
                unusedNodes.removeAt(randomNodePosition);
            }
            else
            {
                qDebug() << "Watch here";
            }
        }


    }
    //qDebug() << "First position:" << firstPosition << "Second position" << secondPosition;
    return result;

}