예제 #1
0
float TSPProblem::solveTSP()
{
    allocateTSPCache_();

    //base cases
    {
        for (unsigned int i=0; i<rows_; i++) {
            cache_[i][0] = std::numeric_limits<float>::max();
        }
        Subset s; s.add(0);
        cache_[s.repr()][0] = 0; // from node to itself using exactly itself
    }

    //meat of the algorithm
    for (unsigned int m=2; m <= cities_.size(); m++) {      //subset size (including 0)
        vector<Subset> subsets;
        getSubsets(subsets, m, cities_.size());

        for (const Subset& s : subsets) {

            for (unsigned int j=1; j<cities_.size(); j++) { //omit start node 0
                if (!(s.contains(j))) {                     // omit stuff not in subset
                    continue;
                }

                Subset sprime(s);
                sprime.remove(j);

                float minval = std::numeric_limits<float>::max();
                for (unsigned int k=0; k<cities_.size(); k++) {
                    if (!(s.contains(k)) || k == j) {
                        continue;
                    }
                    float localCost = cache_[sprime.repr()][k] + distance(cities_[k], cities_[j]);
                    if (localCost < minval) {
                        minval = localCost;
                    }
                }
                cache_[s.repr()][j] = minval;
            }
        }
    }

    //finally find minimum of all paths computed so far
    float minval = std::numeric_limits<float>::max();
    {
        Subset s;
        for (unsigned int i=0; i<cities_.size() ; i++) {
            s.add(i);
        }
        for (unsigned int j=1; j < cities_.size(); j++) {
            float localCost = cache_[s.repr()][j] + distance(cities_[j], cities_[0]);
            if (localCost < minval) {
                minval = localCost;
            }
        }
    }

    return minval;
}
예제 #2
0
 bool within(const Subset& other) const {
   return other.contains(*this);
 }