예제 #1
0
    def _crossover(
        self, parent1_weights: np.ndarray, parent2_weights: np.ndarray,
        parent1_bias: np.ndarray, parent2_bias: np.ndarray
    ) -> Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]:
        rand_crossover = random.random()
        crossover_bucket = np.digitize(rand_crossover, self._crossover_bins)
        child1_weights, child2_weights = None, None
        child1_bias, child2_bias = None, None

        # SBX
        if crossover_bucket == 0:
            child1_weights, child2_weights = SBX(parent1_weights,
                                                 parent2_weights,
                                                 self._SBX_eta)
            child1_bias, child2_bias = SBX(parent1_bias, parent2_bias,
                                           self._SBX_eta)

        # Single point binary crossover (SPBX)
        elif crossover_bucket == 1:
            child1_weights, child2_weights = single_point_binary_crossover(
                parent1_weights, parent2_weights, major=self._SPBX_type)
            child1_bias, child2_bias = single_point_binary_crossover(
                parent1_bias, parent2_bias, major=self._SPBX_type)

        else:
            raise Exception(
                'Unable to determine valid crossover based off probabilities')

        return child1_weights, child2_weights, child1_bias, child2_bias
예제 #2
0
파일: snake_app.py 프로젝트: DongPhamBK/git
    def _crossover(
        self, parent1_weights: np.ndarray, parent2_weights: np.ndarray,
        parent1_bias: np.ndarray, parent2_bias: np.ndarray
    ) -> Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]:
        rand_crossover = random.random()
        crossover_bucket = np.digitize(rand_crossover, self._crossover_bins)
        child1_weights, child2_weights = None, None
        child1_bias, child2_bias = None, None

        # SBX
        if crossover_bucket == 0:
            child1_weights, child2_weights = SBX(parent1_weights,
                                                 parent2_weights,
                                                 self._SBX_eta)
            child1_bias, child2_bias = SBX(parent1_bias, parent2_bias,
                                           self._SBX_eta)

        # Crossover nhị phân một điểm (SPBX)
        elif crossover_bucket == 1:
            child1_weights, child2_weights = single_point_binary_crossover(
                parent1_weights, parent2_weights, major=self._SPBX_type)
            child1_bias, child2_bias = single_point_binary_crossover(
                parent1_bias, parent2_bias, major=self._SPBX_type)

        else:
            raise Exception(
                'Không thể xác định lai chéo hợp lệ dựa trên xác suất')

        return child1_weights, child2_weights, child1_bias, child2_bias