HungarianAlg.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. #include <vector>
  2. #include <iostream>
  3. #include <limits>
  4. #include <time.h>
  5. #include "defines.h"
  6. // http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=hungarianAlgorithm
  7. ///
  8. /// \brief The AssignmentProblemSolver class
  9. ///
  10. class AssignmentProblemSolver
  11. {
  12. private:
  13. // Computes the optimal assignment (minimum overall costs) using Munkres algorithm.
  14. void assignmentoptimal(assignments_t& assignment, track_t& cost, const distMatrix_t& distMatrixIn, size_t nOfRows, size_t nOfColumns);
  15. void buildassignmentvector(assignments_t& assignment, bool *starMatrix, size_t nOfRows, size_t nOfColumns);
  16. void computeassignmentcost(const assignments_t& assignment, track_t& cost, const distMatrix_t& distMatrixIn, size_t nOfRows);
  17. void step2a(assignments_t& assignment, track_t *distMatrix, bool *starMatrix, bool *newStarMatrix, bool *primeMatrix, bool *coveredColumns, bool *coveredRows, size_t nOfRows, size_t nOfColumns, size_t minDim);
  18. void step2b(assignments_t& assignment, track_t *distMatrix, bool *starMatrix, bool *newStarMatrix, bool *primeMatrix, bool *coveredColumns, bool *coveredRows, size_t nOfRows, size_t nOfColumns, size_t minDim);
  19. void step3_5(assignments_t& assignment, track_t *distMatrix, bool *starMatrix, bool *newStarMatrix, bool *primeMatrix, bool *coveredColumns, bool *coveredRows, size_t nOfRows, size_t nOfColumns, size_t minDim);
  20. void step4(assignments_t& assignment, track_t *distMatrix, bool *starMatrix, bool *newStarMatrix, bool *primeMatrix, bool *coveredColumns, bool *coveredRows, size_t nOfRows, size_t nOfColumns, size_t minDim, size_t row, size_t col);
  21. // Computes a suboptimal solution. Good for cases with many forbidden assignments.
  22. void assignmentsuboptimal1(assignments_t& assignment, track_t& cost, const distMatrix_t& distMatrixIn, size_t nOfRows, size_t nOfColumns);
  23. // Computes a suboptimal solution. Good for cases with many forbidden assignments.
  24. void assignmentsuboptimal2(assignments_t& assignment, track_t& cost, const distMatrix_t& distMatrixIn, size_t nOfRows, size_t nOfColumns);
  25. public:
  26. enum TMethod
  27. {
  28. optimal,
  29. many_forbidden_assignments,
  30. without_forbidden_assignments
  31. };
  32. AssignmentProblemSolver();
  33. ~AssignmentProblemSolver();
  34. track_t Solve(const distMatrix_t& distMatrixIn, size_t nOfRows, size_t nOfColumns, assignments_t& assignment, TMethod Method = optimal);
  35. };