Первая часть

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

Введение

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

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

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

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

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

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

Хемотаксис 

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

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

Механизмы работы 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()

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

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

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

Заключение

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

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

Комментарии (8)


  1. michael108
    10.07.2024 08:44
    +2

    Правильно ли я понял, что это -- что-то вроде комбинации градиентного спуска и генетического алгоритма?


    1. Hanamime Автор
      10.07.2024 08:44
      +1

      Да, вы понимаете всё верно.

      Хотя, в целом, как разновидность градиентного спуска и генетического алгоритма можно описать в той или иной мере все модели машинного обучения :)


  1. Asker1987
    10.07.2024 08:44
    +2

    Согласен с комментарием выше, все операторы есть в генетическом алгоритме.

    Хемотаксис = оператор мутации в ГА

    Репродукция = оператор репродукции в ГА

    Элиминация-дисперсия = оператор разнообразия в ГА или реализация модели де Фриза для ГА

    Алгоритм использовал когда-то. Не впечатлил. Достаточно примитивная метаэвристика. Я бы предложил, что не к той задаче приложил, но это не отменяет того факта, что доступные инструменты в BFA являются лишь скромным подмножеством инструментов в ГА. Но да, BFA более легковесное.


    1. OrkBiotechnologist
      10.07.2024 08:44
      +1

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

      А когда смотришь на их названия и источники вдохновения более «экзотических» алгоритмов из разряда: алгоритм кукушки, стаи волков, голодного студента в ожидание степухи и т.п., ощущение что ещё и проверяют грань дозволенного, где наконец-то поймут что они откровенно стебутся и журнал отклонит публикацию статьи.


      1. Asker1987
        10.07.2024 08:44
        +1

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


        1. OrkBiotechnologist
          10.07.2024 08:44

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

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

          У меня в планах всё лежит пет-проект с целью попробовать самостоятельную реализацию роевого алгоритма с нуля в реалтайме, с визуализацией, но в рамках KISS - Keep It Super Simple.
          Отдельно хочется ещё его в железо запихнуть, какие-нибудь простенькие танкетки на esp32 сделать, простенькими квадриками или руками-манипуляторами.


          1. Asker1987
            10.07.2024 08:44
            +1

            По бенчмаркам - это обычно к зарубежным статьям, там легче с этим. Я обычно по задачам быстро нахожу, например "TSP benchmarks" - мне нравится именно задача коммивояжёра, потому что для неё есть много решений и бенчмарок известных, это такая тестовая классическая NP полная задача, можно найти статьи в которых пишут о своих результатах. Есть проект с предзагруженными бенчмарками:

            https://github.com/optimizationBenchmarking/tspSuite/tree/master/src/main/resources/org/logisticPlanning/tsp/benchmarking/instances

            У каждой бенчмарки свое название, можно искать прямо по названию. Но опять же, легче находить в англоязычных статьях.


            1. OrkBiotechnologist
              10.07.2024 08:44
              +1

              Спасибо большое!

              С англоязычними статьями проблем не имею, знаю язык на С1, думаю в этом году попробовать сдать IELTS на C2. Но всё никак не соберусь чтобы каждый день выделять время на решение типовых тестов и повторение теории.