]> ruin.nu Git - germs.git/blobdiff - src/genesorter.cpp
genesorter now uses models to score actions, specific actions are now derived from...
[germs.git] / src / genesorter.cpp
index 3ce89ad493d6163ee568a0f4e3697a1face13946..602a6dde276318e069fa8e1496c005110e9b27d4 100644 (file)
 
 #include "genealgorithms.h"
 
+#include "model.h"
+
 #include <queue>
-#include <iostream>
-#include <iterator>
 using namespace std;
 
-GeneSorter::ActionList GeneSorter::sort(const GeneOrder& go){
+struct ScoreCmp {
+       template<typename T>
+       bool operator()(T s1, T s2){
+               return s1.first < s2.first;
+       }
+};
+
+GeneSorter::ActionList GeneSorter::sort(const GeneOrder& go, const Model& m){
        ActionList al;
        GeneOrder temp(go);
        while(inversionDistance(temp) > 0){
@@ -40,24 +47,19 @@ GeneSorter::ActionList GeneSorter::sort(const GeneOrder& go){
                //cout << endl;
                ActionList safe = safeActions(temp);
                if (safe.size() > 0){
-                       safe[0](temp);
-                       cout << "Action: " << safe[0].toString() << endl;
-                       al.push_back(safe[0]);
+                       priority_queue<pair<double,SortAction>,vector<pair<double,SortAction> >, ScoreCmp > pq;
+                       for (ActionList::iterator sa = safe.begin(); sa != safe.end(); ++sa){
+                               pq.push(pair<double,SortAction>(m.score(*sa),*sa));
+                       }
+                       SortAction sa = pq.top().second;
+                       sa(temp);
+                       al.push_back(sa);
                }else
                        return ActionList(); //TODO: Need to handle hurdles.
        }
-       cout << "Distance: " << inversionDistance(temp) << " : ";
-       copy(temp.begin(), temp.end(), ostream_iterator<int>(cout, " "));
-       cout << endl;
        return al;
 }
 
-struct ScoreCmp {
-       template<typename T>
-       bool operator()(T s1, T s2){
-               return s1.first < s2.first;
-       }
-};
 
 GeneSorter::ActionList GeneSorter::safeActions(const GeneOrder& go){
        if (countCycles(go) == go.size() - 1)
@@ -73,7 +75,8 @@ GeneSorter::ActionList GeneSorter::safeActions(const GeneOrder& go){
                        pq.push(pair<size_t,SortAction>(score,sa));
                }                               
        }
-       while (pq.size() > 0){
+       size_t max = pq.top().first;
+       while (pq.size() > 0 && pq.top().first >= max){
                al.push_back(pq.top().second);
                pq.pop();
        }