Source code for mealpy.utils.fuzzy

#!/usr/bin/env python
# Created by "Thieu" at 23:20, 17/07/2025 ----------%
#       Email: nguyenthieu2102@gmail.com            %
#       Github: https://github.com/thieu1995        %
# --------------------------------------------------%


[docs]class FuzzySystem: """Fuzzy System for hierarchical pyramid weights""" def __init__(self, pyramid_type='increase'): """ Args: pyramid_type: 'increase' or 'decrease' """ self.pyramid_type = pyramid_type
[docs] def triangular_membership(self, x, a, b, c): """Triangular membership function""" if x <= a or x >= c: return 0 elif a < x <= b: return (x - a) / (b - a) else: return (c - x) / (c - b)
[docs] def fuzzify_iterations(self, iteration_percent): """Fuzzify input iterations (0-1)""" low = self.triangular_membership(iteration_percent, 0, 0, 0.5) medium = self.triangular_membership(iteration_percent, 0, 0.5, 1) high = self.triangular_membership(iteration_percent, 0.5, 1, 1) return {'low': low, 'medium': medium, 'high': high}
[docs] def defuzzify_centroid(self, membership_values): """Defuzzification using centroid method""" # Triangular membership functions for output (0-100) low_center = 25 medium_center = 50 high_center = 75 numerator = (membership_values['low'] * low_center + membership_values['medium'] * medium_center + membership_values['high'] * high_center) denominator = sum(membership_values.values()) if denominator == 0: return 50 # Default value return numerator / denominator
[docs] def get_fuzzy_weights(self, current_iteration, max_iterations): """Get fuzzy weights for alpha, beta, delta""" iteration_percent = current_iteration / max_iterations input_membership = self.fuzzify_iterations(iteration_percent) if self.pyramid_type == 'increase': # Rules for increase pyramid alpha_membership = { 'low': input_membership['low'], 'medium': max(input_membership['medium'], input_membership['low']), 'high': input_membership['high'] } beta_membership = { 'low': input_membership['high'], 'medium': max(input_membership['low'], input_membership['medium'], input_membership['high']), 'high': 0 } delta_membership = { 'low': max(input_membership['medium'], input_membership['high']), 'medium': input_membership['low'], 'high': 0 } else: # decrease # Rules for decrease pyramid alpha_membership = { 'low': input_membership['high'], 'medium': max(input_membership['medium'], input_membership['high']), 'high': input_membership['low'] } beta_membership = { 'low': input_membership['high'], 'medium': max(input_membership['low'], input_membership['medium'], input_membership['high']), 'high': 0 } delta_membership = { 'low': max(input_membership['low'], input_membership['medium']), 'medium': input_membership['high'], 'high': 0 } alpha_weight = self.defuzzify_centroid(alpha_membership) beta_weight = self.defuzzify_centroid(beta_membership) delta_weight = self.defuzzify_centroid(delta_membership) return alpha_weight, beta_weight, delta_weight