From 8732edf8f47bacd15c649e608898b84781ef4b0a Mon Sep 17 00:00:00 2001 From: bbod Date: Sun, 29 Mar 2020 23:55:52 -0600 Subject: [PATCH] did some work on perms --- HW10/MakePermutationMatrix.cpp | 36 +++++++++++++++++++---------- HW10/MakePermutationMatrix.h | 4 ++-- HW10/main.cpp | 41 +++++++++++++--------------------- 3 files changed, 42 insertions(+), 39 deletions(-) diff --git a/HW10/MakePermutationMatrix.cpp b/HW10/MakePermutationMatrix.cpp index a722c62..06196aa 100644 --- a/HW10/MakePermutationMatrix.cpp +++ b/HW10/MakePermutationMatrix.cpp @@ -4,31 +4,43 @@ #include "MakePermutationMatrix.h" -std::vector> MakePermutationMatrix::MakePermutation(std::vector source, int rank, int size){ - std::vector> permutations; +#include + +std::vector MakePermutationMatrix::MakePermutation(std::vector source, int rank, int size, std::vector> costMatrix){ + std::vector returnVector; + std::vector localCostVector; std::sort(source.begin(), source.end()); std::vector myPerm = source; std::vector nextPerm = source; auto offset = myPerm.size()/size; - - if(!rank) + if(!rank){ + returnVector.resize(source.size(), 0); + } + if(rank) std::rotate(nextPerm.begin(), nextPerm.begin()+offset*(rank+1), nextPerm.end()); else nextPerm = source; - if(!rank) + if(rank) std::rotate(myPerm.begin(), myPerm.begin()+offset*rank,myPerm.end()); do { - std::vector currentPerm; - for (int i = 0; i < myPerm.size(); i++) { - currentPerm.push_back(myPerm[i]); + double cost; + for (int i = 1; i < myPerm.size(); i++) { + cost += costMatrix[myPerm[i].GetName()][myPerm[i-1].GetName()]; } - permutations.push_back(currentPerm); + localCostVector.push_back(cost); } while (std::next_permutation(myPerm.begin(), myPerm.end()), myPerm != nextPerm); - return permutations; + auto lowest = std::vector(1,localCostVector[0]); + for(int i = 0; i < localCostVector.size(); i++) { + if(localCostVector[i] < lowest[0]) + lowest[0] = localCostVector[i]; + } + MPI_Gather(&localCostVector,1, MPI_DOUBLE, &returnVector,1, MPI_DOUBLE,0, MPI_COMM_WORLD); + + return returnVector; } -std::vector> MakePermutationMatrix::GetLowestCost(std::vector source, int rank, int size, std::vector> costMatrix){ - +std::vector MakePermutationMatrix::GetLowestCost(std::vector source, int rank, int size, std::vector> costMatrix){ + return MakePermutation(source, rank, size, costMatrix); } \ No newline at end of file diff --git a/HW10/MakePermutationMatrix.h b/HW10/MakePermutationMatrix.h index dcfd011..5c86ec9 100644 --- a/HW10/MakePermutationMatrix.h +++ b/HW10/MakePermutationMatrix.h @@ -11,10 +11,10 @@ class MakePermutationMatrix { public: - static std::vector> GetLowestCost(std::vector source, int rank, int size, std::vector> costMatrix); + static std::vector GetLowestCost(std::vector source, int rank, int size, std::vector> costMatrix); private: - static std::vector> MakePermutation(std::vector source, int rank, int size); + static std::vector MakePermutation(std::vector source, int rank, int size, std::vector> costMatrix); }; #endif // HW10_MAKEPERMUTATIONMATRIX_H diff --git a/HW10/main.cpp b/HW10/main.cpp index 2820ab1..3e7ef28 100644 --- a/HW10/main.cpp +++ b/HW10/main.cpp @@ -1,7 +1,7 @@ #include "CostMatrixGenerator.h" -//#import "MakePermutationMatrix.h" -#include "ReadFromFile.h" +#include "MakePermutationMatrix.h" #include "ParseMatrixForMPI.h" +#include "ReadFromFile.h" #include "mpi.h" #include @@ -13,51 +13,42 @@ int main(int argc, char* argv[]) MPI_Init(&argc, &argv); MPI_Comm_rank(MCW, &rank); MPI_Comm_size(MCW, &size); - std::vector> matrix; + std::vector> costMatrix; std::vector cities; std::vector flatMatrix; if (rank == 0) { std::cout << "Reading in file" << std::endl; cities = ReadFromFile::ReadFile("../input"); citiesSize = cities.size(); - //Make matrix - matrix = CostMatrixGenerator::GenerateCostMatrix(cities); + //Make costMatrix + costMatrix = CostMatrixGenerator::GenerateCostMatrix(cities); for(int i =0; i < cities.size(); i++){ for(int j = 0; j< cities.size(); j++){ - std::cout << matrix[i][j] << " "; + std::cout << costMatrix[i][j] << " "; } std::cout << std::endl; } - flatMatrix = matrixTools::FlattenMatrix(matrix); + flatMatrix = matrixTools::FlattenMatrix(costMatrix); } MPI_Bcast(&citiesSize, 1, MPI_INT, 0, MPI_COMM_WORLD); if(rank){ // reserve memory for vectors flatMatrix.resize(citiesSize*citiesSize); - matrix.resize(citiesSize); + + costMatrix.resize(citiesSize); for(int i = 0; i < citiesSize; i++) { - matrix[i].resize(citiesSize); + costMatrix[i].resize(citiesSize); } } MPI_Bcast(&flatMatrix[0], flatMatrix.size(), MPI_DOUBLE, 0, MPI_COMM_WORLD); if(rank){ - std::cout <<"Flat Matrix Size :" << flatMatrix.size() << std::endl; - for(int i = 0; i < citiesSize*citiesSize; i++){ - std::cout << flatMatrix[i] << " "; - } - std::cout << std::endl; - matrix = matrixTools::UnflattenMatrix(flatMatrix, citiesSize, citiesSize); - std::cout << "after unflatten" << std::endl; - std::cout << "Process "<< rank << " has value " << citiesSize << " as size of city" << std::endl; - for(int i = 0; i < citiesSize; i++) { - for (int j = 0; j < citiesSize; j++) { - std::cout << "Process " << rank << " has value " << matrix[i][j] << " at postion" - << "(" << i << "," << j << ")" << std::endl; - } - } + costMatrix = matrixTools::UnflattenMatrix(flatMatrix, citiesSize, citiesSize); + //Make permutations + auto perms = MakePermutationMatrix::GetLowestCost(cities, rank, size, costMatrix); + } + MPI_Finalize(); -// //Make permutations -// auto perms = MakePermutationMatrix::GetLowestCost(cities, rank, size, matrix); + return 0; } \ No newline at end of file