00001
00002
00003
00004 #include <vector>
00005 #include <iostream>
00006 #include <limits>
00007 #include <time.h>
00008 #include "defines.h"
00009
00010
00011
00012 typedef std::vector<int> assignments_t;
00013 typedef std::vector<track_t> distMatrix_t;
00014
00015 class AssignmentProblemSolver
00016 {
00017 private:
00018
00019
00020
00021 void assignmentoptimal(assignments_t& assignment, track_t& cost, const distMatrix_t& distMatrixIn, size_t nOfRows,
00022 size_t nOfColumns);
00023 void buildassignmentvector(assignments_t& assignment, bool* starMatrix, size_t nOfRows, size_t nOfColumns);
00024 void computeassignmentcost(const assignments_t& assignment, track_t& cost, const distMatrix_t& distMatrixIn,
00025 size_t nOfRows);
00026 void step2a(assignments_t& assignment, track_t* distMatrix, bool* starMatrix, bool* newStarMatrix, bool* primeMatrix,
00027 bool* coveredColumns, bool* coveredRows, size_t nOfRows, size_t nOfColumns, size_t minDim);
00028 void step2b(assignments_t& assignment, track_t* distMatrix, bool* starMatrix, bool* newStarMatrix, bool* primeMatrix,
00029 bool* coveredColumns, bool* coveredRows, size_t nOfRows, size_t nOfColumns, size_t minDim);
00030 void step3(assignments_t& assignment, track_t* distMatrix, bool* starMatrix, bool* newStarMatrix, bool* primeMatrix,
00031 bool* coveredColumns, bool* coveredRows, size_t nOfRows, size_t nOfColumns, size_t minDim);
00032 void step4(assignments_t& assignment, track_t* distMatrix, bool* starMatrix, bool* newStarMatrix, bool* primeMatrix,
00033 bool* coveredColumns, bool* coveredRows, size_t nOfRows, size_t nOfColumns, size_t minDim, size_t row,
00034 size_t col);
00035 void step5(assignments_t& assignment, track_t* distMatrix, bool* starMatrix, bool* newStarMatrix, bool* primeMatrix,
00036 bool* coveredColumns, bool* coveredRows, size_t nOfRows, size_t nOfColumns, size_t minDim);
00037
00038
00039
00040 void assignmentsuboptimal1(assignments_t& assignment, track_t& cost, const distMatrix_t& distMatrixIn, size_t nOfRows,
00041 size_t nOfColumns);
00042
00043
00044
00045 void assignmentsuboptimal2(assignments_t& assignment, track_t& cost, const distMatrix_t& distMatrixIn, size_t nOfRows,
00046 size_t nOfColumns);
00047
00048 public:
00049 enum TMethod
00050 {
00051 optimal,
00052 many_forbidden_assignments,
00053 without_forbidden_assignments
00054 };
00055
00056 AssignmentProblemSolver();
00057 ~AssignmentProblemSolver();
00058 track_t Solve(const distMatrix_t& distMatrixIn, size_t nOfRows, size_t nOfColumns, assignments_t& assignment,
00059 TMethod Method = optimal);
00060 };