double X::score(const SortAction& sa, const GeneOrder& go){
- return 1;
+ const ReverseAction* ra = dynamic_cast<const ReverseAction*>(&sa.impl());
+
+ if (ra){
+ int l1 = go.size()/2 - ra->i();
+ int l2 = ra->j() - go.size()/2;
+ double C = abs(l1 - l2)/static_cast<double>(go.size());
+ return 1/(C+1);
+ }
+ return -1;
}
const char* X::name(){
return "X";
}
double Zipper::score(const SortAction& sa, const GeneOrder& go){
- return 1;
+ const ReverseAction* ra = dynamic_cast<const ReverseAction*>(&sa.impl());
+
+ if (ra){
+ return 1.0/(((ra->j()-ra->i())/static_cast<double>(go.size()))+1.0);
+ }
+ return -1;
}
const char* Zipper::name(){
return "Zipper";