12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- """Crossover implementation which generated new solution by splitting at mean size best solution and current solution
- """
- # main imports
- import random
- import sys
- import pkgutil
- # module imports
- from .Crossover import Crossover
- from ...utils.modules import load_class
- # import all available solutions
- # for loader, module_name, is_pkg in pkgutil.walk_packages(
- # path=[
- # str(pathlib.Path(__file__).parent.absolute()) + '/../../solutions'
- # ],
- # prefix='macop.solutions.'):
- # _module = loader.find_module(module_name).load_module(module_name)
- # globals()[module_name] = _module
- class SimpleCrossover(Crossover):
- """Crossover implementation which generated new solution by splitting at mean size best solution and current solution
- Attributes:
- kind: {Algorithm} -- specify the kind of operator
- """
- def apply(self, solution):
- """Create new solution based on best solution found and solution passed as parameter
- Args:
- solution: {Solution} -- the solution to use for generating new solution
- Returns:
- {Solution} -- new generated solution
- """
- size = solution._size
- # copy data of solution
- firstData = solution._data.copy()
- # get best solution from current algorithm
- secondData = self._algo._bestSolution._data.copy()
- splitIndex = int(size / 2)
- if random.uniform(0, 1) > 0.5:
- firstData[splitIndex:(size - 1)] = firstData[splitIndex:(size - 1)]
- currentData = firstData
- else:
- secondData[splitIndex:(size - 1)] = firstData[splitIndex:(size -
- 1)]
- currentData = secondData
- # create solution of same kind with new data
- class_name = type(solution).__name__
- # dynamically load solution class if unknown
- if class_name not in sys.modules:
- load_class(class_name, globals())
- return getattr(globals()['macop.solutions.' + class_name],
- class_name)(currentData, size)
|