Hi,

I want to implement the 2-opt algorithm and I have no idea how to proceed.

Please, can someone show me a way to do it in Jsprit?

Thank you

Hi @anasstaha19,

Jspirit uses Ruin and Recreate heuristic to search the solution space. Which is very different from 2-opt algorithm. You can modify Jsprit to use your own heuristic. But first you need to define your problem. Do you really want to solve VRPTW using 2-opt? I would suggest you to try it on TSP first.

This might help you.

HI @Bhoumik_Shah

Thank you for your replay.

Jsprit uses Ruin and Recreate to search for far neighborhoods. During the optimization process, I want to switch between searching for far neighbors and closest one. If I reduce the number of jobs (3% of the total number of jobs) to remove, does it do the trick ?

Hi @anasstaha19,

Is you aim searching close neighbors or implementing 2-opt?

If it is searching close neighbors reducing number of jobs to be removed will work.

Also you might want to use Radial Ruin.

Interesting. Why not trying to integrate classical local search strategies. I think that you should be able to specify your own SearchStrategy. Implement your 2-opt approach there (e.g. as SearchStrategyModule) and add it to the SearchStrategyManager. Assign a weight and according to the weight, the strategy will be selected in the course of the iterations. It sounds like a nice project.

Additionally, it would be nice to have an overview how these different strategies perform (some nice chart or similar). Actually, I wanted to implementend something like this, but have not had the time yet ;).

EDIT: The future will then be that the weights of the strategies change according to their performance. It would then be an adapted neighborhood search.

@Bhoumik_Shah

I think I will use Radial Ruin with low number of removed jobs, it will do the trick.

@stefan

I already implemented a simple adaptative behaviour using StrategySelectedListener , it updates the weights each iteration, not as good as *Stefan Ropke* did in his work, but it works .

```
StrategySelectedListener adaptiveSearch = new StrategySelectedListener() {
@Override
public void informSelectedStrategy(DiscoveredSolution discoveredSolution,VehicleRoutingProblem vehicleRoutingProblem, Collection<VehicleRoutingProblemSolution> vehicleRoutingProblemSolutions,VehicleRoutingAlgorithm vra) {
//if the new solution is accepted after performing ruin and recreate
if (discoveredSolution.isAccepted()) {
// update the weight of the used Strategy by 0.05
vra.getSearchStrategyManager().informStrategyWeightChanged(discoveredSolution.getStrategyId(),
vra.getSearchStrategyManager().getWeight(discoveredSolution.getStrategyId()) + 0.05);
}
}
};
```

Also, Jsprit needs the ruin operator that use historical information in the local search, it has the name of Historical node-pair removal or neighbors graph removal.