/*
* Copyright © 2010 by Ondrej Skalicka. All Rights Reserved
*/
package cz.cvut.felk.cig.jcop.problem.tsp.inverting;
import cz.cvut.felk.cig.jcop.problem.Configuration;
import cz.cvut.felk.cig.jcop.problem.Operation;
import cz.cvut.felk.cig.jcop.problem.OperationHistory;
import java.util.List;
/**
* Inverts part of a path using a 2-opt method.
*
* @author Ondrej Skalicka
*/
public class InvertPathOperation implements Operation {
/**
* Source index to find switched city on.
*/
protected int sourceIndex;
/**
* Destination index to find switched city on.
*/
protected int destinationIndex;
public InvertPathOperation(int sourceIndex, int destinationIndex) {
this.destinationIndex = destinationIndex;
this.sourceIndex = sourceIndex;
}
public Configuration execute(Configuration configuration) {
List<Integer> newConfiguration = configuration.asList();
int si = sourceIndex;
int di = destinationIndex;
int dimension = configuration.getDimension();
if (si > di) {
di += dimension;
}
while (di > si) {
newConfiguration.set(si % dimension, configuration.valueAt(di % dimension));
newConfiguration.set(di % dimension, configuration.valueAt(si % dimension));
di--;
si++;
}
return new Configuration(newConfiguration, new OperationHistory(this, configuration.getOperationHistory()));
}
@Override
public String toString() {
return "InvertPathOperation{" +
"sourceIndex=" + sourceIndex +
", destinationIndex=" + destinationIndex +
'}';
}
}