1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- """Continuous solution classes implementation
- """
- import numpy as np
- # modules imports
- from macop.solutions.base import Solution
- class ContinuousSolution(Solution):
- """
- Continuous solution class
- - store solution as a float array (example: [0.5, 0.2, 0.17, 0.68, 0.42])
- - associated size is the size of the array
- - mainly use for selecting or not an element in a list of valuable objects
- Attributes:
- data: {ndarray} -- array of float values
- size: {int} -- size of float array values
- score: {float} -- fitness score value
- """
- def __init__(self, data, size):
- """
- initialise continuous solution using specific data
- Args:
- data: {ndarray} -- array of float values
- size: {int} -- size of float array values
- Example:
- >>> from macop.solutions.continuous import ContinuousSolution
- >>>
- >>> # build of a solution using specific data and size
- >>> data = [0.2, 0.4, 0.6, 0.8, 1]
- >>> solution = ContinuousSolution(data, len(data))
- >>>
- >>> # check data content
- >>> sum(solution.data) == 3
- True
- >>> # clone solution
- >>> solution_copy = solution.clone()
- >>> all(solution_copy.data == solution.data)
- True
- """
- super().__init__(np.array(data), size)
- @staticmethod
- def random(size, interval, validator=None):
- """
- Intialize float array with use of validator to generate valid random solution
- Args:
- size: {int} -- expected solution size to generate
- interval: {(float, float)} -- tuple with min and max expected interval value for current solution
- validator: {function} -- specific function which validates or not a solution (if None, not validation is applied)
- Returns:
- {:class:`~macop.solutions.discrete.Continuous`}: new generated continuous solution
- Example:
- >>> from macop.solutions.continuous import ContinuousSolution
- >>>
- >>> # generate random solution using specific validator
- >>> validator = lambda solution: True if sum(solution.data) > 5 else False
- >>> solution = ContinuousSolution.random(10, (-2, 2), validator)
- >>> sum(solution.data) > 5
- True
- """
- mini, maxi = interval
- data = np.random.random(size=size) * (maxi - mini) + mini
- solution = ContinuousSolution(data, size)
- if not validator:
- return solution
- while not validator(solution):
- data = np.random.random(size=size) * (maxi - mini) + mini
- solution = ContinuousSolution(data, size)
- return solution
- def __str__(self):
- return f"Continuous solution {self._data}"
|