protected int performBestPerturbation(List<Accession> core, int bestRemIndex,
                                          List<Accession> unselected, int bestAddIndex,
                                          List<Integer> tabu){
        SinglePerturbation pert;
        if (bestAddIndex != -1){
            if (bestRemIndex == -1){
                // only add new element (at the end)
                core.add(unselected.remove(bestAddIndex));
                // create history item
                pert = new Addition(bestAddIndex);
            } else {
                // swap element
                Accession rem = core.set(bestRemIndex, unselected.get(bestAddIndex));
                unselected.set(bestAddIndex, rem);
                // create history item
                pert = new Swap(bestRemIndex, bestAddIndex);
            }
        } else {
            // only remove element
            unselected.add(core.remove(bestRemIndex));
            // update tabu indices!
            if (tabu != null){
                for (int i=0; i<tabu.size(); i++){
                    if (tabu.get(i) > bestRemIndex){
                        tabu.set(i, tabu.get(i)-1);
                    }
                }
            }
            // create history item
            pert = new Deletion(bestRemIndex, tabu);
        }
        //update history
        addHistoryItem(pert);

        if (bestAddIndex != -1){
            if (bestRemIndex == -1){
                return core.size()-1; // added at the end
            } else {
                return bestRemIndex; // swapped
            }
        } else {
            return -1; // only removed one
        }
    }