X-Git-Url: https://ruin.nu/git/?p=germs.git;a=blobdiff_plain;f=src%2Fgenesorter.cpp;h=03f19db1d8949ced3f18cb229671b590cb19acc0;hp=8126d6aaa5781336ab03ba3a822f4d72f4c8820d;hb=7e811915a713eeef44f03385a1fc1f74a5301c30;hpb=e81855989d0f0e124e0ec770b417bcb099959391 diff --git a/src/genesorter.cpp b/src/genesorter.cpp index 8126d6a..03f19db 100644 --- a/src/genesorter.cpp +++ b/src/genesorter.cpp @@ -27,26 +27,69 @@ #include "genealgorithms.h" #include +#include +#include using namespace std; GeneSorter::ActionList GeneSorter::sort(const GeneOrder& go){ ActionList al; GeneOrder temp(go); - while(inversionDistance(go) > 0){ - ActionList safe = safeActions(go); + while(inversionDistance(temp) > 0){ + cout << "AL: " << al.size() << " : "; + cout << "Distance: " << inversionDistance(temp) << " : "; + copy(temp.begin(), temp.end(), ostream_iterator(cout, " ")); + cout << endl; + ActionList safe = safeActions(temp); if (safe.size() > 0){ safe[0](temp); al.push_back(safe[0]); + cout << "AL: " << al.size() << " : "; }else return ActionList(); //TODO: Need to handle hurdles. } + cout << "Distance: " << inversionDistance(temp) << " : "; + copy(temp.begin(), temp.end(), ostream_iterator(cout, " ")); + cout << endl; return al; } +struct ScoreCmp { + template + bool operator()(T s1, T s2){ + return s1.first < s2.first; + } +}; + GeneSorter::ActionList GeneSorter::safeActions(const GeneOrder& go){ if (countCycles(go) == go.size() - 1) return ActionList(); ActionList al; - //al.push_back(SortAction(new ReverseAction(2,3))); + vector intervals = findIntervals(go); + priority_queue,vector >, ScoreCmp > pq; + for (size_t i = 0; i < intervals.size(); ++i){ + if (intervals[i].oriented && intervals[i].first != intervals[i].second){ + SortAction sa(new ReverseAction(intervals[i])); + size_t score = scoreActions(go,sa); + cout << "Inversion: " << min(intervals[i].first,intervals[i].second) << ":" << max(intervals[i].first,intervals[i].second)-1 << " Score: " << score << endl; + pq.push(pair(score,sa)); + } + } + while (pq.size() > 0){ + al.push_back(pq.top().second); + pq.pop(); + } return al; } + +size_t GeneSorter::scoreActions(const GeneOrder& go, SortAction& sa){ + GeneOrder temp(go); + sa(temp); + vector intervals = findIntervals(temp); + int o = 0; + for (vector::iterator in = intervals.begin(); in != intervals.end(); ++in){ + if (in->oriented) + ++o; + } + return o; +} +