Skip to content

Генетический алгоритм #6

Description

@Minoru

Akon32 в начале контеста предлагал вместо A* использовать генетический алгоритм. Мы таки реализовали A*, но мне уже надоело бесуспешно тюнить его целевую функцию, так что я подумал-таки и про ГА.

Что нам понадобится:

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

Генератор решений

В первом приближении просто random walk — на каждом шаге делает первое попавшееся действие, приводящее его в новое валидное состояние. Будет генерировать огромные решения, зато быстро.

Также при наличии решения от A* (файла .sol) можно подгружать и его — оно наверняка гораздо оптимальнее и будет отличной основой для мутаций и скрещиваний.

Мутатор решений

Делает одно из:

  • удаляет произвольное количество действий с произвольной позиции в решении
  • добавляет в произвольную позицию решения произвольное количество произвольных действий.

В результате не обязательно получится валидное решение, но на это у нас будет фиксер.

Скрещивалка решений

  • Берёт два существующих валидных решения
  • для каждого решения строит множество точек, через которые проходит центр бота
  • ищет пересечение этих множеств
  • для каждого элемента пересечения:
    • находит все разбиения первого решения этой точкой (например, решение AAAAAFDDDFWWWW разбивается элементом F на пары (AAAAAF,DDDFWWWW) и (AAAAAFDDDF,WWWW))
    • находит такие же разбиения для второго решения
    • склеивает все возможные пары разбиений, чтобы получить новые валидные решения

В результате не обязательно получаем валидное решение, но, опять-таки, есть фиксер.

Функция починки мутированных решений

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

Управляющая функция

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions