Source code for niapy.algorithms.basic.mfo
# encoding=utf8
import logging
import numpy as np
from niapy.algorithms.algorithm import Algorithm
logging.basicConfig()
logger = logging.getLogger('niapy.algorithms.basic')
logger.setLevel('INFO')
__all__ = ['MothFlameOptimizer']
[docs]class MothFlameOptimizer(Algorithm):
r"""MothFlameOptimizer of Moth flame optimizer.
Algorithm:
Moth flame optimizer
Date:
2018
Author:
Kivanc Guckiran and Klemen Berkovič
License:
MIT
Reference paper:
Mirjalili, Seyedali. "Moth-flame optimization algorithm: A novel nature-inspired heuristic paradigm." Knowledge-Based Systems 89 (2015): 228-249.
Attributes:
Name (List[str]): List of strings representing algorithm name.
See Also:
* :class:`niapy.algorithms.algorithm.Algorithm`
"""
Name = ['MothFlameOptimizer', 'MFO']
[docs] @staticmethod
def info():
r"""Get basic information of algorithm.
Returns:
str: Basic information.
See Also:
* :func:`niapy.algorithms.Algorithm.info`
"""
return r"""Mirjalili, Seyedali. "Moth-flame optimization algorithm: A novel nature-inspired heuristic paradigm." Knowledge-Based Systems 89 (2015): 228-249."""
[docs] def run_iteration(self, task, population, population_fitness, best_x, best_fitness, **params):
r"""Core function of MothFlameOptimizer algorithm.
Args:
task (Task): Optimization task.
population (numpy.ndarray): Current population.
population_fitness (numpy.ndarray): Current population fitness/function values.
best_x (numpy.ndarray): Current population best individual.
best_fitness (float): Current best individual.
**params (Dict[str, Any]): Additional parameters
Returns:
Tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray, float, Dict[str, Any]]:
1. New population.
2. New population fitness/function values.
3. New global best solution.
4. New global best fitness/objective value.
5. Additional arguments:
* best_flames (numpy.ndarray): Best individuals.
* best_flame_fitness (numpy.ndarray): Best individuals fitness/function values.
* previous_population (numpy.ndarray): Previous population.
* previous_fitness (numpy.ndarray): Previous population fitness/function values.
"""
# Previous positions
# Create sorted population
indexes = np.argsort(population_fitness)
sorted_population = population[indexes]
# Some parameters
flame_no, a = round(self.population_size - (task.iters + 1) * ((self.population_size - 1) / task.max_iters)), -1 + (task.iters + 1) * (
(-1) / task.max_iters)
for i in range(self.population_size):
for j in range(task.dimension):
distance_to_flame, b, t = abs(sorted_population[i, j] - population[i, j]), 1, (a - 1) * self.random() + 1
if i <= flame_no:
population[i, j] = distance_to_flame * np.exp(b * t) * np.cos(2 * np.pi * t) + sorted_population[i, j]
else:
population[i, j] = distance_to_flame * np.exp(b * t) * np.cos(2 * np.pi * t) + sorted_population[
flame_no, j]
population = np.apply_along_axis(task.repair, 1, population, self.rng)
population_fitness = np.apply_along_axis(task.eval, 1, population)
best_x, best_fitness = self.get_best(population, population_fitness, best_x, best_fitness)
return population, population_fitness, best_x, best_fitness, {}