Алгоритмы, вдохновлённые природой. Часть 2

aa053f29e2dd2c1010346dee902f5f59.jpg

Первая часть.

В мире современных технологий учёные всё чаще обращаются к природе за вдохновением для создания новых алгоритмов. Одним из таких примеров является бактериальный алгоритм поиска (Bacterial Foraging Algorithm, BFA), который моделирует процесс поиска пищи бактериями. С момента своего появления в 2002 году BFA привлекает внимание благодаря своей эффективности в решении сложных задач оптимизации. Мы рассмотрим, как именно работает этот алгоритм, какие биологические процессы лежат в его основе и как он может быть применён.

Введение

Природа на протяжении миллиардов лет эволюции «разработала» множество эффективных стратегий для выживания и адаптации. Одним из таких удивительных механизмов является способ поиска пищи бактериями. Они, несмотря на их микроскопический размер и простоту, демонстрируют сложное поведение, позволяющее им эффективно находить источники энергии. Этот процесс, называемый хемотаксисом, вдохновил учёных на создание бактериального алгоритма поиска.

Бактерии реагируют на химические градиенты в окружающей среде, перемещаясь к более высокой концентрации питательных веществ. Этот процесс, дополненный фазами репродукции и элиминации-дисперсии, позволяет бактериям не только находить пищу, но и эффективно адаптироваться к изменениям в окружающей среде. На основе наблюдений был разработан BFA, который использует эти биологические принципы для решения задач оптимизации.

a410342a646bf14a78cd234617b36d80.png

История и концепция BFA

Бактериальный алгоритм поиска был впервые предложен в 2002 году Кевином М. Пассиньо из университета Огайо. Идея была основана на моделировании поведения бактерий E. coli при поиске пищи. В статье Пассиньо, опубликованной в журнале IEEE Control Systems Magazine, автор подробно описывает биологические процессы, лежащие в основе поведения бактерий, и как эти процессы могут быть использованы для решения задач оптимизации.

Основы теории 

Эволюция формирует стратегии поиска пищи у животных, обеспечивая выживание и успешное размножение тех особей, которые могут эффективно находить и использовать ресурсы в окружающей их среде. Животные, использующие неэффективные стратегии, вымирают, а их гены не передаются следующему поколению. В результате таких процессов формируются оптимальные стратегии поиска пищи, которые могут быть смоделированы как процессы оптимизации. В теории поиска пищи основное внимание уделяется максимизации энергии, полученной за единицу времени, затраченного на поиск пищи, с учётом физиологических и экологических ограничений.

Хемотаксис 

Основной процесс, на котором основывается BFA, — это хемотаксис, движение бактерий в направлении увеличения концентрации питательных веществ. Бактерии E. coli используют для передвижения жгутики, чередуя режимы «плавания» и «вращения». Когда жгутики вращаются против часовой стрелки, бактерия плывёт в одну сторону, а если жгутики начинают вращаться по часовой стрелке, бактерия начинает двигаться в другую сторону.

efea4bec53c685ec5a34f8fdd104b84d.png

Для обнаружения изменений в концентрации питательных веществ бактерия использует рецепторы. Если концентрация увеличивается, бактерия продолжает плыть. При уменьшении концентрации бактерия возвращается к базовому поведению — чередованию плавания и вращения.

Механизмы работы BFA

Алгоритм BFA состоит из трёх основных этапов: хемотаксис, репродукция и элиминация-дисперсия. Рассмотрим каждый из них подробнее:

  1. Хемотаксис. В алгоритме он реализован через случайные шаги, которые направлены на улучшение текущего решения.

  2. Репродукция. Бактерии, достигшие наилучших результатов, делятся, создавая копии себя. Это позволяет алгоритму сохранять лучшие решения и одновременно исследовать новые области пространства.

  3. Элиминация-дисперсия. Периодически часть популяции бактерий заменяется новыми случайными агентами. Это помогает избежать локальных минимумов и способствует глобальному поиску оптимального решения.

Пример алгоритма с кодом

Для демонстрации работы бактериального алгоритма поиска рассмотрим пример минимизации функции. 

Код

import numpy as np
import random
import matplotlib.pyplot as plt
import seaborn as sns

def objective_function(x):
    # Функция, которую будем минимизировать
    return np.sum(x**2)

class BacterialForagingAlgorithm:
    def __init__(self, num_agents, num_dimensions, lb, ub, max_iters):
        self.num_agents = num_agents
        self.num_dimensions = num_dimensions
        self.lb = lb
        self.ub = ub
        self.max_iters = max_iters
        self.agents = np.random.uniform(lb, ub, (num_agents, num_dimensions))
        self.fitness_history = []

    def chemotaxis(self, agent):
        # Метод отвечает за перемещение бактерий
        step_size = 0.1
        new_agent = agent + step_size * np.random.uniform(-1, 1, self.num_dimensions)
        new_agent = np.clip(new_agent, self.lb, self.ub)
        return new_agent

    def reproduce(self, agents, fitness):
        # Выполняет репродукцию, сохраняет лучших и удваивает их популяцию
        sorted_indices = np.argsort(fitness)
        half_population = self.num_agents // 2
        new_agents = agents[sorted_indices[:half_population]]
        return np.vstack((new_agents, new_agents))

    def eliminate_and_disperse(self, agents):
        # Элиминация и дисперсия, заменяет бактерий новыми случайными агентами
        for i in range(self.num_agents):
            if random.random() < 0.25:
                agents[i] = np.random.uniform(self.lb, self.ub, self.num_dimensions)
        return agents

    def optimize(self):
        for iter in range(self.max_iters):
            new_agents = []
            fitness = np.array([objective_function(agent) for agent in self.agents])
            self.fitness_history.append(np.mean(fitness))
            for agent in self.agents:
                new_agent = self.chemotaxis(agent)
                new_fitness = objective_function(new_agent)
                if new_fitness < objective_function(agent):
                    new_agents.append(new_agent)
                else:
                    new_agents.append(agent)
            self.agents = np.array(new_agents)
            self.agents = self.reproduce(self.agents, fitness)
            self.agents = self.eliminate_and_disperse(self.agents)

        best_agent = self.agents[np.argmin([objective_function(agent) for agent in self.agents])]
        best_fitness = objective_function(best_agent)
        return best_agent, best_fitness

# Параметры алгоритма
num_agents = 50
num_dimensions = 10
lb, ub = -5, 5
max_iters = 100

bfa = BacterialForagingAlgorithm(num_agents, num_dimensions, lb, ub, max_iters)
best_agent, best_fitness = bfa.optimize()

print("Лучшее решение:", best_agent)
print("Наименьшее значение функции:", best_fitness)

# Визуализация истории приспособленности
plt.figure(figsize=(10, 6))
sns.lineplot(x=np.arange(max_iters), y=bfa.fitness_history)
plt.title('История приспособленности')
plt.xlabel('Итерации')
plt.ylabel('Средняя приспособленность')
plt.show()

2bb11fc9c86481de02f8882095a6074e.png

А что там с практикой?

В недавнем исследовании за 2023 год, опубликованном в журнале Energies, бактериальный алгоритм поиска был использован для улучшения обучения нейронных сетей в системе автоматического генерационного контроллера. Исследователи продемонстрировали, что BFA может эффективно определять начальные веса нейронной сети, что позволяет сократить длительность обучения и повысить точность предсказания. В тестах на гибридной энергетической системе с использованием модели MATLAB/Simulink контроллер на основе BFA показал высокую эффективность в корректировке частоты и минимизации перерегулирования при изменениях нагрузки и флуктуациях мощности.

Бактериальный алгоритм поиска нашёл широкое применение в самых разных областях. Например, он успешно используется в задачах управления энергосистемами, где позволяет оптимизировать распределение ресурсов. В статье на платформе MQL5 BFA был протестирован в сравнении с другими алгоритмами, демонстрируя гибкость и эффективность в различных контекстах. В этом исследовании BFA был применён для оптимизации параметров управления в гибридных энергетических системах, показывая высокую производительность и устойчивость к изменениям условий.

Заключение

Использование биологических принципов в алгоритмах оптимизации открывает новые возможности для решения сложных задач в различных областях. BFA показал эффективность в решении различных задач оптимизации благодаря своей способности избегать локальных минимумов и находить глобально оптимальные решения. У алгоритм значительный потенциал для дальнейшего развития. Улучшение моделей хемотаксиса, репродукции и элиминации-дисперсии может сделать BFA ещё мощнее. Возможно, в будущем мы увидим его широкое применение в новых областях, таких как искусственный интеллект и робототехника.

А вы когда-нибудь использовали BFA или одну из его производных версий? Если да, то в каких задачах он оказался наиболее полезным?

© Habrahabr.ru