Source code for metaheuristic_designer.operators.factories.permutation
"""
Permutation operator registry and factory.
"""
from typing import Optional
from ...encoding import Encoding
from ...operator import OperatorFromLambda
from ..operator_functions.permutation import permute_mutation, roll_mutation, invert_mutation, pmx, order_cross
from ..operator_functions.utils import OperatorFnDef
# fmt: off
permutation_ops_map = {
# Swap components
"swap": OperatorFnDef(permute_mutation, forced_params={"N": 2}),
"swap_mutation": OperatorFnDef(permute_mutation, forced_params={"N": 2}),
"two_swap": OperatorFnDef(permute_mutation, forced_params={"N": 2}),
# Shift
"shift": OperatorFnDef(roll_mutation, forced_params={"N": 1}),
"insert": OperatorFnDef(roll_mutation, forced_params={"N": 1}),
"roll1": OperatorFnDef(roll_mutation, forced_params={"N": 1}),
"block_shift": OperatorFnDef(roll_mutation, forced_params={"N": 1}),
# Scramble
"scramble": OperatorFnDef(permute_mutation),
"perm": OperatorFnDef(permute_mutation),
"permutate": OperatorFnDef(permute_mutation),
"scramble_mutation": OperatorFnDef(permute_mutation),
"permutation_mutation": OperatorFnDef(permute_mutation),
"permute_components": OperatorFnDef(permute_mutation),
# Reverse
"invert": OperatorFnDef(invert_mutation),
"reverse": OperatorFnDef(invert_mutation),
"inversion_mutation": OperatorFnDef(invert_mutation),
# Roll
"roll": OperatorFnDef(roll_mutation),
"roll_mutation": OperatorFnDef(roll_mutation),
"cyclic_shift": OperatorFnDef(roll_mutation),
# Partially mapped crossover
"pmx": OperatorFnDef(pmx),
"pmx_crossover": OperatorFnDef(pmx),
"partially_mapped_crossover": OperatorFnDef(pmx),
# Ordered crossover
"ox": OperatorFnDef(order_cross),
"order_cross": OperatorFnDef(order_cross),
"order_crossover": OperatorFnDef(order_cross),
}
# fmt: on
[docs]
def create_permutation_operator(
method: str,
encoding: Optional[Encoding] = None,
name: Optional[str] = None,
**kwargs
) -> OperatorFromLambda:
"""
Create a permutation operator by name.
Parameters
----------
method : str
Key into :data:`permutation_ops_map`.
encoding : Encoding, optional
Encoding applied to the genotype.
name : str, optional
Display name; defaults to *method*.
**kwargs
Forwarded to the operator function.
Returns
-------
OperatorFromLambda
The wrapped permutation operator.
"""
if name is None:
name = method
return OperatorFromLambda(operator_fn=permutation_ops_map[method.lower()], name=method, encoding=encoding, preserves_order=False, **kwargs)