• All Implemented Interfaces:
Neighbourhood<SubsetSolution>

extends SubsetNeighbourhood

A subset neighbourhood that generates moves which simultaneously add a fixed number of items to the selection. Generated moves are of type GeneralSubsetMove, which is a subtype of SubsetMove, and always only add IDs to the selection. If desired, a set of fixed IDs can be provided which are not allowed to be selected. Also, a maximum size can be imposed so that it is guaranteed that the subset size will not exceed this maximum after application of a move generated by this neighbourhood. It may happen to be impossible to perform the desired number of additions, e.g. because too few items are unselected or because of the imposed maximum subset size. In such case a lower number of items will be added (as many as possible).

Note that a large amount of moves may be generated when the subset size increases. Therefore, this advanced neighbourhood should be used with care, especially in combination with searches that inspect all moves in every step. Furthermore, searches that inspect random moves may have few chances to find an improvement in case of a huge amount of possible neighbours.

This neighbourhood is thread-safe: it can be safely used to concurrently generate moves in different searches running in separate threads.

Author:
Herman De Beukelaer
• ### Constructor Summary

Constructors
Constructor and Description
Creates a disjoint multi addition neighbourhood that simultaneously adds a fixed number of IDs to the selection.
Creates a disjoint multi addition neighbourhood that simultaneously adds a fixed number of IDs to the selection, taking into account that the subset size may not exceed the given maximum.
Creates a disjoint multi addition neighbourhood that simultaneously adds a fixed number of IDs to the selection, taking into account that the subset size may not exceed the given maximum and that the given set of fixed IDs are not allowed to be selected.
• ### Constructor Detail

Creates a disjoint multi addition neighbourhood that simultaneously adds a fixed number of IDs to the selection. If numAdditions is 1, this neighbourhood generates exactly the same moves as the SingleAdditionNeighbourhood so in such case it is advised to use the latter neighbourhood which has been optimized for this specific scenario.
Parameters:
Throws:
IllegalArgumentException - if numAdditions is not strictly positive

int maxSubsetSize)
Creates a disjoint multi addition neighbourhood that simultaneously adds a fixed number of IDs to the selection, taking into account that the subset size may not exceed the given maximum. If numAdditions is 1, this neighbourhood generates exactly the same moves as the SingleAdditionNeighbourhood so in such case it is advised to use the latter neighbourhood which has been optimized for this specific scenario.
Parameters:
maxSubsetSize - maximum subset size (> 0)
Throws:
IllegalArgumentException - if numAdditions or maxSubsetSize are not strictly positive

int maxSubsetSize,
Set<Integer> fixedIDs)
Creates a disjoint multi addition neighbourhood that simultaneously adds a fixed number of IDs to the selection, taking into account that the subset size may not exceed the given maximum and that the given set of fixed IDs are not allowed to be selected. If numAdditions is 1, this neighbourhood generates exactly the same moves as the SingleAdditionNeighbourhood so in such case it is advised to use the latter neighbourhood which has been optimized for this specific scenario.
Parameters:
maxSubsetSize - maximum subset size (> 0)
fixedIDs - set of fixed IDs which are not allowed to be added to the selection
Throws:
IllegalArgumentException - if numAdditions or maxSubsetSize are not strictly positive
• ### Method Detail

Get the fixed number of additions performed by generated moves.
Returns:
• #### getMaxSubsetSize

public int getMaxSubsetSize()
Get the maximum subset size specified at construction. If no maximum size has been set this method returns Integer.MAX_VALUE.
Returns:
maximum subset size
• #### getRandomMove

public SubsetMove getRandomMove(SubsetSolution solution,
Random rnd)
Generates a move for the given subset solution that selects a random subset of currently unselected IDs. Whenever possible, the requested number of additions is performed. However, taking into account the current number of unselected items, the imposed maximum subset size (if set) and the fixed IDs (if any) may result in fewer additions (as many as possible). If no items can be added, null is returned.
Parameters:
solution - solution for which a random multi addition move is generated
rnd - source of randomness used to generate random move
Returns:
• #### getAllMoves

public List<SubsetMove> getAllMoves(SubsetSolution solution)

Generates the list of all possible moves that perform $$k$$ additions, where $$k$$ is the fixed number specified at construction. Note: taking into account the current number of unselected items, the imposed maximum subset size (if set) and the fixed IDs (if any) may result in fewer additions (as many as possible).

May return an empty list if no moves can be generated.

Parameters:
solution - solution for which all possible multi addition moves are generated
Returns:
list of all multi addition moves, may be empty