std::vector<std::unique_ptr<IMove>> RandomSwapNeighborhood::getMoves(const ISolution& solution) const
{
    auto distribution = solution.getDistribution();
    std::vector< std::unique_ptr<IMove> > result;

    auto swapPairs = getSomePairDisk(solution);

    for (auto pair : swapPairs)
    {
        std::vector<IMove::AtomMove> AtomMoves;
        AtomMoves.emplace_back(distribution[pair.second].serverId, distribution[pair.first].serverId, pair.first);
        AtomMoves.emplace_back(distribution[pair.first].serverId, distribution[pair.second].serverId, pair.second);
        std::unique_ptr<IMove> move(new CompoundMove(std::move(AtomMoves)));
        if (solution.moveIsCorrect(*move))
        {
            result.emplace_back(std::move(move));
        }
    }

    return result;
}