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; }