Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- std::vector<int> GeneticAlgorithm::PMX(std::vector<int> p1, std::vector<int> p2)
- {
- std::vector<std::vector<int>> children;
- int slicePoint1, slicePoint2;
- slicePoint1 = rand() % instanceSize;
- do
- slicePoint2 = rand() % (instanceSize + 1);
- while (slicePoint2 <= slicePoint1);
- std::vector<int> child;
- std::vector<int> child2;
- for (int j = 0; j < slicePoint1; j++) {
- child.push_back(-1);
- child2.push_back(-1);
- }
- std::vector<int> sliceToInsertChild = std::vector<int>(p2.begin() + slicePoint1, p2.begin() + slicePoint2);
- std::vector<int> sliceToInsertChild2 = std::vector<int>(p1.begin() + slicePoint1, p1.begin() + slicePoint2);
- child.insert(child.end(), sliceToInsertChild.begin(), sliceToInsertChild.end());
- child2.insert(child2.end(), sliceToInsertChild2.begin(), sliceToInsertChild2.end());
- for (int j = slicePoint2; j < instanceSize; j++) {
- child.push_back(-1);
- child2.push_back(-1);
- }
- for (int j = 0; j < instanceSize; j++) {
- if (j >= slicePoint1 && j < slicePoint2)
- continue;
- if (std::find(child.begin(), child.end(), p1[j]) == child.end()) {
- child[j] = p1[j];
- }
- else {
- int p1Temp = p1[j];
- int index = j;
- do {
- index = findIndexOfElem(p2, p1Temp);
- p1Temp = p1[index];
- } while (std::find(child.begin(), child.end(), p1Temp) != child.end());
- child[j] = p1Temp;
- }
- if (std::find(child2.begin(), child2.end(), p2[j]) == child2.end()) {
- child2[j] = p2[j];
- }
- else {
- int p2Temp = p2[j];
- int index = j;
- do {
- index = findIndexOfElem(p1, p2Temp);
- p2Temp = p2[index];
- } while (std::find(child2.begin(), child2.end(), p2Temp) != child2.end());
- child2[j] = p2Temp;
- }
- }
- std::vector<int> offspring = (tsp.countTC(child) < tsp.countTC(child2) ? child : child2);
- //return child;
- return offspring;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement