Оптимизация муравьиного колонии в действии

Mуравьиная оптимизация в действии

Работающий муравей. Изображение создано автором с помощью Dall-E 2.

Решение задач оптимизации и улучшение результатов с ACO в Python

Добро пожаловать обратно! В моем предыдущем сообщении я ввел основы муравьиной оптимизации (ACO). В этой статье мы рассмотрим реализацию алгоритма ACO с нуля для решения двух различных типов проблем.

Мы решим проблемы Traveling Salesman Problem (TSP) и Quadratic Assignment Problem (QAP). Почему именно эти две? Ну, TSP – это классическая задача, и ACO является эффективным алгоритмом для нахождения наиболее экономичного пути через граф. С другой стороны, Quadratic Assignment Problem представляет собой другой класс проблем, связанных с оптимизацией расположения предметов, и в этой статье я хочу продемонстрировать, что ACO также может быть ценным инструментом для решения таких проблем, связанных с назначением. Эта универсальность делает алгоритм ACO применимым к широкому спектру задач. Наконец, я поделюсь некоторыми советами по достижению улучшенных решений более быстро.

Проблема коммивояжера

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

Определение проблемы

С помощью следующего кода мы можем создать экземпляр TSP с заданным количеством узлов:

import itertoolsimport mathimport randomfrom typing import Tupleimport networkx as nximport networkx.algorithms.shortest_paths.dense as nxalgclass TSP:    """    Создает проблему TSP с определенным количеством узлов    """    def __init__(self, nodes: int = 30, dimensions: Tuple[int, int] = (1000, 1000), seed: int = 5):        if seed:            random.seed(seed)        graph = nx.Graph()        nodes_dict = dict()        for i in range(nodes):            nodes_dict[i] =…