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; }
int main() { PairWiseMove move; Dimension atvsize(1,1); Dimension coptersize(1,1); Dimension searchSize(2,2); VirtualQuadCopter copter(coptersize,searchSize,4,4); VirtualATV atv(atvsize, 0, 0); Map mapp; Route atvRoute; //atvRoute.push_back(WayPoint(1, 1)); Route * result = move.generatePairRoute(atvRoute, atv, copter, mapp )->first; bool error = false; if(result->getSize() == 1){ //Quad must move te atv if(!(result->getWaypoint(0)->x == 0 && result->getWaypoint(0)->y == 0)){ error = true; std::cout << "Quad must move to atv waypoint ERROR" << std::endl; } std::cout << "Quad must move te atv SUCCES" << std::endl; } else{ std::cout << "Quad must move te atv size ERROR" << std::endl; } copter = VirtualQuadCopter(coptersize,searchSize,0,0); atv = VirtualATV(atvsize, 0, 0); atvRoute.clearRoute(); atvRoute.pushWayPoint( new WayPoint(1, 1)); result = move.generatePairRoute(atvRoute, atv, copter, mapp)->first; if(!(result->getSize() == 0)){ //Atv is just in range of quadsight error = true; std::cout << "Atv is just in range of quadsight ERROR"<< std::endl; }else{ std::cout << "Atv is just in range of quadsight SUCCES"<< std::endl; } atvRoute.clearRoute(); atvRoute.pushWayPoint( new WayPoint(2, 2)); result = move.generatePairRoute(atvRoute, atv, copter, mapp)->first; if(result->getSize() == 1){ //Atv is just out range of quadsight if(!(result->getWaypoint(0)->x == 2 && result->getWaypoint(0)->y == 2)){ error = true; std::cout << "Atv is just out range of quadsight waypoint ERROR"<< std::endl; } std::cout << "Atv is just out range of quadsight SUCCES" << std::endl; } else{ std::cout << "Atv is just out range of quadsight size ERROR"<< std::endl; } atvRoute.clearRoute(); result = move.generatePairRoute(atvRoute, atv, copter, mapp)->first; if(!result->getSize() == 0){//Empty atv route returns... error = true; std::cout << "Empty atv route returns empty pair route ERROR"<< std::endl; }else{ std::cout << "Empty atv route returns empty pair route SUCCES"<< std::endl; } copter.goTo(1, 4); result = move.generatePairRoute(atvRoute, atv, copter, mapp)->first; if(!result->getSize() == 1){//Empty atv route returns... error = true; std::cout << "Empty atv route returns sync waypoint size ERROR"<< std::endl; } else{ if(result->getWaypoint(0)->x == 0 && result->getWaypoint(0)->y == 0){ std::cout << "Empty atv route returns sync waypoint SUCCES"<< std::endl; } else{ error = true; std::cout << "Empty atv route returns sync waypoint waypoint ERROR"<< std::endl; } } copter.goTo(0,0); atvRoute.pushWayPoint(new WayPoint(1, 2)); atvRoute.pushWayPoint(new WayPoint(2, 3)); atvRoute.pushWayPoint(new WayPoint(4, 2)); atvRoute.pushWayPoint(new WayPoint(5, 3)); atvRoute.pushWayPoint(new WayPoint(-1, -1)); result = move.generatePairRoute(atvRoute, atv, copter, mapp)->first; if(result->getSize() == 3){//Longer route std::cout << "Long route size: Good, SUCCES" << std::endl; if(!(result->getWaypoint(0)->x == 1 && result->getWaypoint(0)->y == 2)){ error = true; std::cout << " Point 1,2 ERROR" << std::endl; } else{ std::cout << " Point 1,2 SUCCES" << std::endl; } if(!(result->getWaypoint(1)->x == 4 && result->getWaypoint(1)->y == 2)){ error = true; std::cout << " Point 4,2 ERROR" << std::endl; } else{ std::cout << " Point 4,2 SUCCES" << std::endl; } if(!(result->getWaypoint(2)->x == -1 && result->getWaypoint(2)->y == -1)){ error = true; std::cout << " Point -1,-1 ERROR" << std::endl; } else{ std::cout << " Point -1,-1 SUCCES" << std::endl; } } else{ error = true; std::cout << "Long route size: fault, ERROR" << std::endl; } return error; }