mealpy.physics_based package
mealpy.physics_based.ASO module
- class mealpy.physics_based.ASO.OriginalASO(epoch: int = 10000, pop_size: int = 100, alpha: int = 10, beta: float = 0.2, **kwargs: object)[source]
Bases:
OptimizerThe original version of: Atom Search Optimization (ASO)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [5, 10000]. Default is 100.
alpha (int) – Depth weight, in range [1, 100]. Default is 10.
beta (float) – Multiplier weight, in range (0.0, 1.0). Default is 0.2.
Links
References
Zhao, W., Wang, L. and Zhang, Z., 2019. Atom search optimization and its application to solve a hydrogeologic parameter estimation problem. Knowledge-Based Systems, 163, pp.283-304.
Examples
>>> import numpy as np >>> from mealpy import FloatVar, ASO >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = ASO.OriginalASO(epoch=1000, pop_size=50, alpha = 50, beta = 0.2) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='hard', kind='original', name='Atom Search Optimization', year=2019, family=None, scientific_status='normal', concerns=(), evidence_urls=())
- amend_solution(solution: ndarray) ndarray[source]
This function is based on optimizer’s strategy. In each optimizer, this function can be overridden
- Parameters
solution – The position
- Returns
The valid solution based on optimizer’s strategy
- evolve(epoch)[source]
The main operations (equations) of algorithm. Inherit from Optimizer class
- Parameters
epoch (int) – The current iteration
mealpy.physics_based.ArchOA module
- class mealpy.physics_based.ArchOA.OriginalArchOA(epoch: int = 10000, pop_size: int = 100, c1: float = 2, c2: float = 6, c3: float = 2, c4: float = 0.5, acc_max: float = 0.9, acc_min: float = 0.1, **kwargs: object)[source]
Bases:
OptimizerThe original version of: Archimedes Optimization Algorithm (ArchOA)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [5, 10000]. Default is 100.
c1 (float) – Factor, in range [1.0, 3.0]. Default is 2.0.
c2 (float) – Factor, in range [2.0, 6.0]. Default is 6.0.
c3 (float) – Factor, in range [1.0, 3.0]. Default is 2.0.
c4 (float) – Factor, in range (0.0, 1.0). Default is 0.5.
acc_max (float) – Acceleration max, in range (0.3, 1.0). Default is 0.9.
acc_min (float) – Acceleration min, in range (0.0, 0.3). Default is 0.1.
References
Hashim, F.A., Hussain, K., Houssein, E.H., Mabrouk, M.S. and Al-Atabany, W., 2021. Archimedes optimization algorithm: a new metaheuristic algorithm for solving optimization problems. Applied Intelligence, 51(3), pp.1531-1551. https://doi.org/10.1007/s10489-020-01893-z
Examples
>>> import numpy as np >>> from mealpy import FloatVar, ArchOA >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = ArchOA.OriginalArchOA(epoch=1000, pop_size=50, c1 = 2, c2 = 5, c3 = 2, c4 = 0.5, acc_max = 0.9, acc_min = 0.1) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='medium', kind='original', name='Archimedes Optimization Algorithm', year=2021, family=None, scientific_status='normal', concerns=(), evidence_urls=())
mealpy.physics_based.CDO module
- class mealpy.physics_based.CDO.OriginalCDO(epoch: int = 10000, pop_size: int = 100, **kwargs: object)[source]
Bases:
OptimizerThe original version of: Chernobyl Disaster Optimizer (CDO)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [5, 10000]. Default is 100.
Links
References
Shehadeh, H. A. (2023). Chernobyl disaster optimizer (CDO): a novel meta-heuristic method for global optimization. Neural Computing and Applications, 1-17.
Examples
>>> import numpy as np >>> from mealpy import FloatVar, CDO >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = CDO.OriginalCDO(epoch=1000, pop_size=50) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='medium', kind='original', name='Chernobyl Disaster Optimizer', year=2023, family=None, scientific_status='normal', concerns=(), evidence_urls=())
mealpy.physics_based.CEO module
- class mealpy.physics_based.CEO.OriginalCEO(epoch: int = 1000, pop_size: int = 50, w1: float = 0.1, p_base: float = 0.2, alpha: float = 0.7, **kwargs: object)[source]
Bases:
OptimizerThe original version of: Cosmic Evolution Optimization (CEO)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 1000.
pop_size (int) – Number of population size, in range [10, 10000]. Default is 50.
w1 (float) – Expansion weight, in range (0.0, 1.0). Default is 0.1.
p_base (float) – Base collision probability, in range (0.0, 1.0). Default is 0.2.
alpha (float) – Alignment parameter, in range (0.0, 1.0). Default is 0.7.
References
Wang, Rui, Zhengxuan Jiang, and Guowen Ding. “Cosmic Evolution Optimization: A Novel Metaheuristic Algorithm for Numerical Optimization and Engineering Design.” Mathematics 13.15 (2025): 2499. https://doi.org/10.3390/math13152499
Examples
>>> import numpy as np >>> from mealpy import FloatVar, CEO >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = CEO.OriginalCEO(epoch=1000, pop_size=50, w1=0.1, p_base=0.2, alpha=0.7) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='hard', kind='original', name='Cosmic Evolution Optimization', year=2025, family=None, scientific_status='normal', concerns=(), evidence_urls=())
mealpy.physics_based.EFO module
- class mealpy.physics_based.EFO.DevEFO(epoch: int = 10000, pop_size: int = 100, r_rate: float = 0.3, ps_rate: float = 0.85, p_field: float = 0.1, n_field: float = 0.45, **kwargs: object)[source]
Bases:
OptimizerOur developed version: Electromagnetic Field Optimization (EFO)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [5, 10000]. Default is 100.
r_rate (float) – Like mutation parameter in GA but for one variable, in range (0.0, 1.0). Default is 0.3.
ps_rate (float) – Like crossover parameter in GA, in range (0.0, 1.0). Default is 0.85.
p_field (float) – Portion of population, positive field, in range (0.0, 1.0). Default is 0.1.
n_field (float) – Portion of population, negative field, in range (0.0, 1.0). Default is 0.45.
References
Abedinpourshotorban, H., Shamsuddin, S.M., Beheshti, Z. and Jawawi, D.N., 2016. Electromagnetic field optimization: a physics-inspired metaheuristic optimization algorithm. Swarm and Evolutionary Computation, 26, pp.8-22.
Examples
>>> import numpy as np >>> from mealpy import FloatVar, EFO >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = EFO.DevEFO(epoch=1000, pop_size=50, r_rate = 0.3, ps_rate = 0.85, p_field = 0.1, n_field = 0.45) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='medium', kind='original', name='Electromagnetic Field Optimization', year=None, family=None, scientific_status='normal', concerns=(), evidence_urls=())
- class mealpy.physics_based.EFO.OriginalEFO(epoch: int = 10000, pop_size: int = 100, r_rate: float = 0.3, ps_rate: float = 0.85, p_field: float = 0.1, n_field: float = 0.45, **kwargs: object)[source]
Bases:
DevEFOThe original version of: Electromagnetic Field Optimization (EFO)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [5, 10000]. Default is 100.
r_rate (float) – Like mutation parameter in GA but for one variable, in range (0.0, 1.0). Default is 0.3.
ps_rate (float) – Like crossover parameter in GA, in range (0.0, 1.0). Default is 0.85.
p_field (float) – Portion of population, positive field, in range (0.0, 1.0). Default is 0.1.
n_field (float) – Portion of population, negative field, in range (0.0, 1.0). Default is 0.45.
Links
References
Abedinpourshotorban, H., Shamsuddin, S.M., Beheshti, Z. and Jawawi, D.N., 2016. Electromagnetic field optimization: a physics-inspired metaheuristic optimization algorithm. Swarm and Evolutionary Computation, 26, pp.8-22.
Examples
>>> import numpy as np >>> from mealpy import FloatVar, EFO >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = EFO.OriginalEFO(epoch=1000, pop_size=50, r_rate = 0.3, ps_rate = 0.85, p_field = 0.1, n_field = 0.45) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='medium', kind='original', name='Electromagnetic Field Optimization', year=2016, family=None, scientific_status='normal', concerns=(), evidence_urls=())
- amend_solution(solution: ndarray) ndarray[source]
This function is based on optimizer’s strategy. In each optimizer, this function can be overridden
- Parameters
solution – The position
- Returns
The valid solution based on optimizer’s strategy
mealpy.physics_based.EO module
- class mealpy.physics_based.EO.AdaptiveEO(epoch: int = 10000, pop_size: int = 100, **kwargs: object)[source]
Bases:
OriginalEOThe original version of: Adaptive Equilibrium Optimization (AEO)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [5, 10000]. Default is 100.
References
Wunnava, A., Naik, M.K., Panda, R., Jena, B. and Abraham, A., 2020. A novel interdependence based multilevel thresholding technique using adaptive equilibrium optimizer. Engineering Applications of Artificial Intelligence, 94, p.103836. https://doi.org/10.1016/j.engappai.2020.103836
Examples
>>> import numpy as np >>> from mealpy import FloatVar, EO >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = EO.AdaptiveEO(epoch=1000, pop_size=50) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='medium', kind='variant', name='Adaptive Equilibrium Optimization', year=2020, family=None, scientific_status='normal', concerns=(), evidence_urls=())
- class mealpy.physics_based.EO.ModifiedEO(epoch: int = 10000, pop_size: int = 100, **kwargs: object)[source]
Bases:
OriginalEOThe original version of: Modified Equilibrium Optimizer (MEO)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [5, 10000]. Default is 100.
References
Gupta, S., Deep, K. and Mirjalili, S., 2020. An efficient equilibrium optimizer with mutation strategy for numerical optimization. Applied Soft Computing, 96, p.106542. https://doi.org/10.1016/j.asoc.2020.106542
Examples
>>> import numpy as np >>> from mealpy import FloatVar, EO >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = EO.ModifiedEO(epoch=1000, pop_size=50) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='medium', kind='variant', name='Modified Equilibrium Optimizer', year=2020, family=None, scientific_status='normal', concerns=(), evidence_urls=())
- class mealpy.physics_based.EO.OriginalEO(epoch: int = 10000, pop_size: int = 100, **kwargs: object)[source]
Bases:
OptimizerThe original version of: Equilibrium Optimizer (EO)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [5, 10000]. Default is 100.
Links
References
Faramarzi, A., Heidarinejad, M., Stephens, B. and Mirjalili, S., 2020. Equilibrium optimizer: A novel optimization algorithm. Knowledge-Based Systems, 191, p.105190.
Examples
>>> import numpy as np >>> from mealpy import FloatVar, EO >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = EO.OriginalEO(epoch=1000, pop_size=50) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='medium', kind='original', name='Equilibrium Optimizer', year=2020, family=None, scientific_status='normal', concerns=(), evidence_urls=())
mealpy.physics_based.ESO module
- class mealpy.physics_based.ESO.OriginalESO(epoch: int = 10000, pop_size: int = 100, **kwargs: object)[source]
Bases:
OptimizerThe original version of: Electrical Storm Optimization (ESO)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [5, 10000]. Default is 100.
References
Soto Calvo, Manuel, and Han Soo Lee. 2025. “Electrical Storm Optimization (ESO) Algorithm: Theoretical Foundations, Analysis, and Application to Engineering Problems” Machine Learning and Knowledge Extraction 7, no. 1: 24. https://doi.org/10.3390/make7010024
Examples
>>> import numpy as np >>> from mealpy import FloatVar, ESO >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = ESO.OriginalESO(epoch=1000, pop_size=50) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='hard', kind='original', name='Electrical Storm Optimization', year=2025, family=None, scientific_status='normal', concerns=(), evidence_urls=())
mealpy.physics_based.EVO module
- class mealpy.physics_based.EVO.OriginalEVO(epoch: int = 10000, pop_size: int = 100, **kwargs: object)[source]
Bases:
OptimizerThe original version of: Energy Valley Optimizer (EVO)
Links
Note
The algorithm is straightforward and does not require any specialized knowledge or techniques.
The algorithm may not perform optimally due to slow convergence and no good operations, which could be improved by implementing better strategies and operations.
The problem is that it is stuck at a local optimal around 1/2 of the max generations because fitness distance is being used as a factor in the equations.
References
Azizi, M., Aickelin, U., A. Khorshidi, H., & Baghalzadeh Shishehgarkhaneh, M. (2023). Energy valley optimizer: a novel metaheuristic algorithm for global and engineering optimization. Scientific Reports, 13(1), 226.
Examples
>>> import numpy as np >>> from mealpy import FloatVar, EVO >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = EVO.OriginalEVO(epoch=1000, pop_size=50) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='medium', kind='original', name='Energy Valley Optimizer', year=2023, family=None, scientific_status='normal', concerns=(), evidence_urls=())
mealpy.physics_based.FLA module
- class mealpy.physics_based.FLA.OriginalFLA(epoch: int = 10000, pop_size: int = 100, C1: float = 0.5, C2: float = 2.0, C3: float = 0.1, C4: float = 0.2, C5: float = 2.0, DD: float = 0.01, **kwargs: object)[source]
Bases:
OptimizerThe original version of: Fick’s Law Algorithm (FLA)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [10, 10000]. Default is 100.
C1 (float) – Factor C1, in range (-100.0, 100.0). Default is 0.5.
C2 (float) – Factor C2, in range (-100.0, 100.0). Default is 2.0.
C3 (float) – Factor C3, in range (-100.0, 100.0). Default is 0.1.
C4 (float) – Factor C4, in range (-100.0, 100.0). Default is 0.2.
C5 (float) – Factor C5, in range (-100.0, 100.0). Default is 2.0.
DD (float) – Factor D in the paper, in range (-100.0, 100.0). Default is 0.01.
Note
The algorithm contains a high number of parameters, some of which may be unnecessary.
Despite the complexity of the algorithms, they may not perform optimally and could potentially become trapped in local optima.
Division by the fitness value may cause overflow issues to arise.
https://www.mathworks.com/matlabcentral/fileexchange/121033-fick-s-law-algorithm-fla
References
Hashim, F. A., Mostafa, R. R., Hussien, A. G., Mirjalili, S., & Sallam, K. M. (2023). Fick’s Law Algorithm: A physical law-based algorithm for numerical optimization. Knowledge-Based Systems, 260, 110146. https://doi.org/10.1016/j.knosys.2022.110146
Examples
>>> import numpy as np >>> from mealpy import FloatVar, FLA >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = FLA.OriginalFLA(epoch=1000, pop_size=50, C1 = 0.5, C2 = 2.0, C3 = 0.1, C4 = 0.2, C5 = 2.0, DD = 0.01) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='nightmare', kind='original', name="Fick's Law Algorithm", year=2023, family=None, scientific_status='normal', concerns=(), evidence_urls=())
mealpy.physics_based.GRSA module
- class mealpy.physics_based.GRSA.OriginalGRSA(epoch: int = 10000, pop_size: int = 100, n_geometry: int = 5, w_max: float = 0.9, w_min: float = 0.4, g_max: float = 0.5, g_min: float = 0.1, **kwargs: object)[source]
Bases:
OptimizerThe original version of: General Relativity Search Algorithm (GRSA)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [10, 10000]. Default is 100.
n_geometry (int) – Number of geometries used to partition the population, in range [1, int(pop_size / 2)]. Default is 5.
w_max (float) – Maximum weight factor for kinetic energy calculation, in range (0.0, 1.0). Default is 0.9.
w_min (float) – Minimum weight factor for kinetic energy calculation, in range (0.0, 1.0). Default is 0.4.
g_max (float) – Maximum kinetic energy coefficient, in range (0.0, 1.0). Default is 0.5.
g_min (float) – Minimum kinetic energy coefficient, in range (0.0, 1.0). Default is 0.1.
Links
References
Beiranvand, Hamzeh, and Esmaeel Rokrok. “General relativity search algorithm: a global optimization approach.” International journal of computational intelligence and applications 14.03 (2015): 1550017.
Examples
>>> import numpy as np >>> from mealpy import FloatVar, GRSA >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = GRSA.OriginalGRSA(epoch=100, pop_size=50, n_geometry=5, w_max=0.9, w_min=0.4, g_max=0.5, g_min=0.1) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='hard', kind='original', name='General Relativity Search Algorithm', year=2015, family=None, scientific_status='normal', concerns=(), evidence_urls=())
mealpy.physics_based.HGSO module
- class mealpy.physics_based.HGSO.OriginalHGSO(epoch: int = 10000, pop_size: int = 100, n_clusters: int = 2, **kwargs: object)[source]
Bases:
OptimizerThe original version of: Henry Gas Solubility Optimization (HGSO)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [10, 10000]. Default is 100.
n_clusters (int) – Number of clusters, in range [2, int(pop_size/5)]. Default is 2.
References
Hashim, F.A., Houssein, E.H., Mabrouk, M.S., Al-Atabany, W. and Mirjalili, S., 2019. Henry gas solubility optimization: A novel physics-based algorithm. Future Generation Computer Systems, 101, pp.646-667. https://doi.org/10.1016/j.future.2019.07.015
Examples
>>> import numpy as np >>> from mealpy import FloatVar, HGSO >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = HGSO.OriginalHGSO(epoch=1000, pop_size=50, n_clusters = 3) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='hard', kind='original', name='Henry Gas Solubility Optimization', year=2019, family=None, scientific_status='normal', concerns=(), evidence_urls=())
mealpy.physics_based.KLA module
- class mealpy.physics_based.KLA.OriginalKLA(epoch: int = 10000, pop_size: int = 100, **kwargs: object)[source]
Bases:
OptimizerThe original version of: Kirchhoff’s Law Algorithm (KLA)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [10, 10000]. Default is 100.
Links
References
Ghasemi, Mojtaba, Nima Khodadadi, Pavel Trojovský, Li Li, Zulkefli Mansor, Laith Abualigah, Amal H. Alharbi, and El-Sayed M. El-Kenawy. “Kirchhoff’s law algorithm (KLA): A novel physics-inspired non-parametric metaheuristic algorithm for optimization problems.” Artificial Intelligence Review 58, no. 10 (2025): 325.
Examples
>>> import numpy as np >>> from mealpy import FloatVar, KLA >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = KLA.OriginalKLA(epoch=100, pop_size=50) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='medium', kind='original', name="Kirchhoff's Law Algorithm", year=2025, family=None, scientific_status='normal', concerns=(), evidence_urls=())
mealpy.physics_based.KOA module
- class mealpy.physics_based.KOA.OriginalKOA(epoch: int = 10000, pop_size: int = 25, tc: int = 3, lamda: float = 15, mu0: float = 0.1, **kwargs: object)[source]
Bases:
OptimizerThe original version of: Kepler Optimization Algorithm (KOA)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [5, 10000]. Default is 25.
tc (int) – Cycle parameter (tc in the paper), in range [1, 1000]. Default is 3.
lamda (float) – Decay factor (lambda in the paper), in range (0.0, 1000.0). Default is 15.
mu0 (float) – Initial mass parameter (M0 in the paper), in range (0.0, 10.0). Default is 0.1.
References
Abdel-Basset, Mohamed, et al. “Kepler optimization algorithm: A new metaheuristic algorithm inspired by Kepler’s laws of planetary motion.” Knowledge-based systems 268 (2023): 110454. https://doi.org/10.1016/j.knosys.2023.110454
Examples
>>> import numpy as np >>> from mealpy import FloatVar, KOA >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = KOA.OriginalKOA(epoch=100, pop_size=50, tc=3, lamda=15.0, mu0=0.1) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='hard', kind='original', name='Kepler Optimization Algorithm', year=2023, family=None, scientific_status='normal', concerns=(), evidence_urls=())
mealpy.physics_based.LSO module
- class mealpy.physics_based.LSO.DevLSO(epoch: int = 10000, pop_size: int = 100, Ps: float = 0.05, Pe: float = 0.6, B: float = 0.05, **kwargs: object)[source]
Bases:
OptimizerOur developed version of: Light Spectrum Optimizer (LSO)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [5, 10000]. Default is 100.
Ps (float) – Probability of first and second scattering stages, in range (0.0, 1.0). Default is 0.05.
Pe (float) – Controlling parameter to exchange between scattering stages, in range (0.0, 1.0). Default is 0.6.
B (float) – Exploitation probability in the first scattering stage, in range (0.0, 1.0). Default is 0.05.
Note
- This version includes some improvements:
Uses adaptive parameters that change based on epoch
Simplified boundary handling
More efficient implementation
References
Abdel-Basset, M., Mohamed, R., 2022. Light Spectrum Optimizer: A Novel Physics-Inspired Metaheuristic Optimization Algorithm. Mathematics, 10(19), 3466. https://doi.org/10.3390/math10193466
Examples
>>> import numpy as np >>> from mealpy import FloatVar, LSO >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = LSO.DevLSO(epoch=1000, pop_size=50, Ps=0.05, Pe=0.7, B=0.06) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='nightmare', kind='developed', name='Light Spectrum Optimizer (Dev)', year=None, family=None, scientific_status='normal', concerns=(), evidence_urls=())
- class mealpy.physics_based.LSO.OriginalLSO(epoch: int = 10000, pop_size: int = 100, Ps: float = 0.05, Pe: float = 0.6, Ph: float = 0.4, B: float = 0.05, **kwargs: object)[source]
Bases:
OptimizerThe original version of: Light Spectrum Optimizer (LSO)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [5, 10000]. Default is 100.
Ps (float) – Probability of first and second scattering stages, in range (0.0, 1.0). Default is 0.05.
Pe (float) – Controlling parameter to exchange between scattering stages, in range (0.0, 1.0). Default is 0.6.
Ph (float) – Probability of hybridization between boundary handling methods, in range (0.0, 1.0). Default is 0.4.
B (float) – Exploitation probability in the first scattering stage, in range (0.0, 1.0). Default is 0.05.
Links
References
Abdel-Basset, M., Mohamed, R., 2022. Light Spectrum Optimizer: A Novel Physics-Inspired Metaheuristic Optimization Algorithm. Mathematics, 10(19), 3466.
Examples
>>> import numpy as np >>> from mealpy import FloatVar, LSO >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = LSO.OriginalLSO(epoch=1000, pop_size=50, Ps=0.2, Pe=0.3, Ph=0.4, B=0.05) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='nightmare', kind='original', name='Light Spectrum Optimizer', year=2022, family=None, scientific_status='normal', concerns=(), evidence_urls=())
mealpy.physics_based.MSO module
- class mealpy.physics_based.MSO.OriginalMSO(epoch: int = 10000, pop_size: int = 100, **kwargs: object)[source]
Bases:
OptimizerThe original version of: Mirage Search Optimization (MSO)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [5, 10000]. Default is 100.
Links
References
He, J., Zhao, S., Ding, J., & Wang, Y. (2025). Mirage search optimization: Application to path planning and engineering design problems. Advances in Engineering Software, 203, 103883.
Examples
>>> import numpy as np >>> from mealpy import FloatVar, MSO >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = MSO.OriginalMSO(epoch=1000, pop_size=50) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='medium', kind='original', name='Mirage Search Optimization', year=2025, family=None, scientific_status='normal', concerns=(), evidence_urls=())
mealpy.physics_based.MVO module
- class mealpy.physics_based.MVO.DevMVO(epoch: int = 10000, pop_size: int = 100, wep_min: float = 0.2, wep_max: float = 1.0, **kwargs: object)[source]
Bases:
OptimizerOur developed version: Multi-Verse Optimizer (MVO)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [5, 10000]. Default is 100.
wep_min (float) – Wormhole Existence Probability (min in Eq.(3.3) paper), in range (0.0, 0.5). Default is 0.2.
wep_max (float) – Wormhole Existence Probability (max in Eq.(3.3) paper), in range [0.5, 3.0]. Default is 1.0.
Note
New routtele wheel selection can handle negative values
Removed condition when self.generator.normalize fitness. So the chance to choose while whole higher –> better
References
Mirjalili, S., Mirjalili, S.M. and Hatamlou, A., 2016. Multi-verse optimizer: a nature-inspired algorithm for global optimization. Neural Computing and Applications, 27(2), pp.495-513. https://dx.doi.org/10.1007/s00521-015-1870-7
Examples
>>> import numpy as np >>> from mealpy import FloatVar, MVO >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = MVO.DevMVO(epoch=1000, pop_size=50, wep_min = 0.2, wep_max = 1.0) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='medium', kind='developed', name='Multi-Verse Optimizer (Dev)', year=2016, family=None, scientific_status='normal', concerns=(), evidence_urls=())
- class mealpy.physics_based.MVO.OriginalMVO(epoch: int = 10000, pop_size: int = 100, wep_min: float = 0.2, wep_max: float = 1.0, **kwargs: object)[source]
Bases:
DevMVOThe original version of: Multi-Verse Optimizer (MVO)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [5, 10000]. Default is 100.
wep_min (float) – Wormhole Existence Probability (min in Eq.(3.3) paper), in range (0.0, 0.5). Default is 0.2.
wep_max (float) – Wormhole Existence Probability (max in Eq.(3.3) paper), in range [0.5, 3.0]. Default is 1.0.
Links
References
Mirjalili, S., Mirjalili, S.M. and Hatamlou, A., 2016. Multi-verse optimizer: a nature-inspired algorithm for global optimization. Neural Computing and Applications, 27(2), pp.495-513.
Examples
>>> import numpy as np >>> from mealpy import FloatVar, MVO >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = MVO.OriginalMVO(epoch=1000, pop_size=50, wep_min = 0.2, wep_max = 1.0) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='medium', kind='original', name='Multi-Verse Optimizer', year=2016, family=None, scientific_status='normal', concerns=(), evidence_urls=())
mealpy.physics_based.NRO module
- class mealpy.physics_based.NRO.OriginalNRO(epoch: int = 10000, pop_size: int = 100, **kwargs: object)[source]
Bases:
OptimizerThe original version of: Nuclear Reaction Optimization (NRO)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [5, 10000]. Default is 100.
References
1. Wei, Z., Huang, C., Wang, X., Han, T. and Li, Y., 2019. Nuclear reaction optimization: A novel and powerful physics-based algorithm for global optimization. IEEE Access, 7, pp.66084-66109. https://doi.org/10.1109/ACCESS.2019.2918406.
2. Wei, Z.L., Zhang, Z.R., Huang, C.Q., Han, B., Tang, S.Q. and Wang, L., 2019, June. An Approach Inspired from Nuclear Reaction Processes for Numerical Optimization. In Journal of Physics: Conference Series (Vol. 1213, No. 3, p. 032009). IOP Publishing.
Examples
>>> import numpy as np >>> from mealpy import FloatVar, NRO >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = NRO.OriginalNRO(epoch=1000, pop_size=50) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='nightmare', kind='original', name='Nuclear Reaction Optimization', year=2019, family=None, scientific_status='normal', concerns=(), evidence_urls=())
mealpy.physics_based.RIME module
- class mealpy.physics_based.RIME.OriginalRIME(epoch: int = 10000, pop_size: int = 100, sr: float = 5.0, **kwargs: object)[source]
Bases:
OptimizerThe original version of: physical phenomenon of RIME-ice (RIME)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [5, 10000]. Default is 100.
sr (float) – Soft-rime parameters, in range (0.0, 100.0). Default is 5.0.
Links
References
Su, H., Zhao, D., Heidari, A. A., Liu, L., Zhang, X., Mafarja, M., & Chen, H. (2023). RIME: A physics-based optimization. Neurocomputing.
Examples
>>> import numpy as np >>> from mealpy import FloatVar, RIME >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = RIME.OriginalRIME(epoch=1000, pop_size=50, sr = 5.0) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='easy', kind='original', name='physical phenomenon of RIME-ice', year=2023, family=None, scientific_status='normal', concerns=(), evidence_urls=())
mealpy.physics_based.SA module
- class mealpy.physics_based.SA.GaussianSA(epoch: int = 10000, pop_size: int = 2, temp_init: float = 100, cooling_rate: float = 0.99, scale: float = 0.1, **kwargs: object)[source]
Bases:
OptimizerOur Gaussian-based version of: Gaussian Simulated Annealing (GaussianSA)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [2, 10000]. Default is 2.
temp_init (float) – Initial temperature, in range [1, 10000]. Default is 100.
cooling_rate (float) – Cooling rate, in range (0.0, 1.0). Default is 0.99.
scale (float) – The scale in gaussian random, in range (0.0, 100.0). Default is 0.1.
Note
SA is single-based solution, so the pop_size parameter is not matter in this algorithm
The temp_init is very important factor. Should set it equal to the distance between LB and UB
References
Kirkpatrick, S., Gelatt Jr, C. D., & Vecchi, M. P. (1983). Optimization by simulated annealing. science, 220(4598), 671-680.
Examples
>>> import numpy as np >>> from mealpy import FloatVar, SA >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = SA.GaussianSA(epoch=1000, pop_size=2, temp_init = 100, cooling_rate = 0.99, scale = 0.1) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='easy', kind='developed', name='Simulated Annealing (Dev)', year=None, family=None, scientific_status='normal', concerns=(), evidence_urls=())
- class mealpy.physics_based.SA.OriginalSA(epoch: int = 10000, pop_size: int = 2, temp_init: float = 100, step_size: float = 0.1, **kwargs: object)[source]
Bases:
OptimizerThe original version of: Simulated Annealing (SA)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [2, 10000]. Default is 2.
temp_init (float) – Initial temperature, in range [1, 10000]. Default is 100.
step_size (float) – The step size of random movement, in range (-100.0, 100.0). Default is 0.1.
Note
SA is single-based solution, so the pop_size parameter is not matter in this algorithm
References
Kirkpatrick, S., Gelatt Jr, C. D., & Vecchi, M. P. (1983). Optimization by simulated annealing. science, 220(4598), 671-680.
Examples
>>> import numpy as np >>> from mealpy import FloatVar, SA >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = SA.OriginalSA(epoch=1000, pop_size=50, temp_init = 100, step_size = 0.1) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='easy', kind='original', name='Simulated Annealing', year=1983, family=None, scientific_status='normal', concerns=(), evidence_urls=())
- class mealpy.physics_based.SA.SwarmSA(epoch: int = 10000, pop_size: int = 100, max_sub_iter: int = 5, t0: int = 1000, t1: int = 1, move_count: int = 5, mutation_rate: float = 0.1, mutation_step_size: float = 0.1, mutation_step_size_damp: float = 0.99, **kwargs: object)[source]
Bases:
OptimizerOur swarm version of: Simulated Annealing (SwarmSA)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [5, 10000]. Default is 100.
max_sub_iter (int) – Maximum Number of Sub-Iteration (within fixed temperature), in range [1, 100000]. Default is 5.
t0 (int) – Initial Temperature, in range [500, 2000]. Default is 1000.
t1 (int) – Final Temperature, in range [1, 100]. Default is 1.
move_count (int) – Move Count per Individual Solution, in range [2, int(pop_size / 2)]. Default is 5.
mutation_rate (float) – Mutation Rate, in range (0.0, 1.0). Default is 0.1.
mutation_step_size (float) – Mutation Step Size, in range (0.0, 1.0). Default is 0.1.
mutation_step_size_damp (float) – Mutation Step Size Damp, in range (0.0, 1.0). Default is 0.99.
References
Van Laarhoven, P.J. and Aarts, E.H., 1987. Simulated annealing. In Simulated annealing: Theory and applications (pp. 7-15). Springer, Dordrecht. https://doi.org/10.1007/978-94-015-7744-1_2
Examples
>>> import numpy as np >>> from mealpy import FloatVar, SA >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = SA.SwarmSA(epoch=1000, pop_size=50, max_sub_iter = 5, t0 = 1000, t1 = 1, >>> move_count = 5, mutation_rate = 0.1, mutation_step_size = 0.1, mutation_step_size_damp = 0.99) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='easy', kind='developed', name='Simulated Annealing (Dev)', year=None, family=None, scientific_status='normal', concerns=(), evidence_urls=())
mealpy.physics_based.SOO module
- class mealpy.physics_based.SOO.OriginalSOO(epoch: int = 10000, pop_size: int = 100, **kwargs: object)[source]
Bases:
OptimizerThe original version of: Stellar Oscillation Optimizer (SOO)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [5, 10000]. Default is 100.
Danger
The MATLAB code in the link below by the author is completely different from the pseudocode in the original paper. I don’t understand how the first author could write such an incorrect implementation and still obtain good results. There are only two possibilities: either the author fabricated the results in the paper, or the paper itself is fundamentally flawed.
For example, you can see equation number 8 — it involves taking the average of two new positions. However, in the code, it is incorrectly implemented as position 1 plus half of position 2. Even more concerning is that the pseudocode in the paper is completely different from the actual code. The MATLAB coding quality is really poor. In the pseudocode, it states that the fitness should be calculated and the global best as well as the top 3 best should be updated, yet this is entirely missing in the code.
Therefore, I do not recommend users to use this algorithm, as it lacks integrity between the results in the paper and the actual experimental implementation.
Links
References
Rodan, A., Al-Tamimi, A. K., Al-Alnemer, L., & Mirjalili, S. (2025). Stellar oscillation optimizer: a nature-inspired metaheuristic optimization algorithm. Cluster Computing, 28(6), 362.
Examples
>>> import numpy as np >>> from mealpy import FloatVar, SOO >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = SOO.OriginalSOO(epoch=1000, pop_size=50) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='medium', kind='original', name='Stellar Oscillation Optimizer', year=2025, family=None, scientific_status='questionable', concerns=(<ScientificConcern.INCORRECT_EQUATIONS: 'incorrect_equations'>, <ScientificConcern.CODE_PSEUDOCODE_MISMATCH: 'code_pseudocode_mismatch'>, <ScientificConcern.AMBIGUOUS_METHODOLOGY: 'ambiguous_methodology'>, <ScientificConcern.POOR_REPRODUCIBILITY: 'poor_reproducibility'>), evidence_urls=())
mealpy.physics_based.TWO module
- class mealpy.physics_based.TWO.EnhancedTWO(epoch: int = 10000, pop_size: int = 100, **kwargs: object)[source]
-
The original version of: Enhanced Tug of War Optimization (ETWO)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [5, 10000]. Default is 100.
References
Nguyen, T., Hoang, B., Nguyen, G. and Nguyen, B.M., 2020. A new workload prediction model using extreme learning machine and enhanced tug of war optimization. Procedia Computer Science, 170, pp.362-369. https://doi.org/10.1016/j.procs.2020.03.063
Examples
>>> import numpy as np >>> from mealpy import FloatVar, TWO >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = TWO.EnhancedTWO(epoch=1000, pop_size=50) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='medium', kind='variant', name='Enhanced Tug of War Optimization', year=2020, family=None, scientific_status='normal', concerns=(), evidence_urls=())
- class mealpy.physics_based.TWO.LevyTWO(epoch: int = 10000, pop_size: int = 100, **kwargs: object)[source]
Bases:
OriginalTWOThe Levy-flight version of: Tug of War Optimization (LevyTWO)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [5, 10000]. Default is 100.
Examples
>>> import numpy as np >>> from mealpy import FloatVar, TWO >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = TWO.LevyTWO(epoch=1000, pop_size=50) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='medium', kind='developed', name='Tug of War Optimization (Dev)', year=None, family=None, scientific_status='normal', concerns=(), evidence_urls=())
- class mealpy.physics_based.TWO.OppoTWO(epoch: int = 10000, pop_size: int = 100, **kwargs: object)[source]
Bases:
OriginalTWOThe opossition-based learning version: Tug of War Optimization (OTWO)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [5, 10000]. Default is 100.
Examples
>>> import numpy as np >>> from mealpy import FloatVar, TWO >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = TWO.OppoTWO(epoch=1000, pop_size=50) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='medium', kind='developed', name='Tug of War Optimization (Dev)', year=None, family=None, scientific_status='normal', concerns=(), evidence_urls=())
- class mealpy.physics_based.TWO.OriginalTWO(epoch: int = 10000, pop_size: int = 100, **kwargs: object)[source]
Bases:
OptimizerThe original version of: Tug of War Optimization (TWO)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [5, 10000]. Default is 100.
References
Kaveh, A., 2017. Tug of war optimization. In Advances in metaheuristic algorithms for optimal design of structures (pp. 451-487). Springer, Cham. https://doi.org/10.1007/978-3-030-59392-6_15
Examples
>>> import numpy as np >>> from mealpy import FloatVar, TWO >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = TWO.OriginalTWO(epoch=1000, pop_size=50) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='medium', kind='original', name='Tug of War Optimization', year=2017, family=None, scientific_status='normal', concerns=(), evidence_urls=())
- evolve(epoch)[source]
The main operations (equations) of algorithm. Inherit from Optimizer class
- Parameters
epoch (int) – The current iteration
mealpy.physics_based.WDO module
- class mealpy.physics_based.WDO.OriginalWDO(epoch: int = 10000, pop_size: int = 100, RT: int = 3, g_c: float = 0.2, alp: float = 0.4, c_e: float = 0.4, max_v: float = 0.3, **kwargs: object)[source]
Bases:
OptimizerThe original version of: Wind Driven Optimization (WDO)
- Parameters
epoch (int) – Maximum number of iterations, in range [1, 100000]. Default is 10000.
pop_size (int) – Number of population size, in range [10, 10000]. Default is 100.
RT (int) – RT coefficient, in range [1, 4]. Default is 3.
g_c (float) – Gravitational constant, in range (0.0, 1.0). Default is 0.2.
alp (float) – Constants in the update equation, in range (0.0, 1.0). Default is 0.4.
c_e (float) – Coriolis effect, in range (0.0, 1.0). Default is 0.4.
max_v (float) – Maximum allowed speed, in range (0.0, 1.0). Default is 0.3.
Note
pop is the set of “air parcel” - “position”
air parcel: is the set of gas atoms. Each atom represents a dimension in position and has its own velocity
pressure represented by fitness value
References
Bayraktar, Z., Komurcu, M., Bossard, J.A. and Werner, D.H., 2013. The wind driven optimization technique and its application in electromagnetics. IEEE transactions on antennas and propagation, 61(5), pp.2745-2757. https://doi.org/10.1109/TAP.2013.2238654
Examples
>>> import numpy as np >>> from mealpy import FloatVar, WDO >>> >>> def objective_function(solution): >>> return np.sum(solution**2) >>> >>> problem_dict = { >>> "bounds": FloatVar(lb=(-10.,) * 30, ub=(10.,) * 30, name="delta"), >>> "minmax": "min", >>> "obj_func": objective_function >>> } >>> >>> model = WDO.OriginalWDO(epoch=1000, pop_size=50, RT = 3, g_c = 0.2, alp = 0.4, c_e = 0.4, max_v = 0.3) >>> g_best = model.solve(problem_dict) >>> print(f"Solution: {g_best.solution}, Fitness: {g_best.target.fitness}") >>> print(f"Solution: {model.g_best.solution}, Fitness: {model.g_best.target.fitness}")
- OPT_INFO: ClassVar[OptInfo | None] = OptInfo(difficulty='medium', kind='original', name='Wind Driven Optimization', year=2013, family=None, scientific_status='normal', concerns=(), evidence_urls=())