Многоцелевая оптимизация с использованием генетического алгоритма с использованием DEAP

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

Проблемы для решения:

  1. какой товар доставлен каким грузовиком;
  2. в каком порядке продукты собираются и опускаются.

Чего достичь: (с разным весом)

  • минимальное время ожидания получения одного товара;
  • минимальное время доставки для каждого продукта.

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

Во-вторых, как мне реализовать здесь функцию оценки? Индивидуум, которого я определил, является экземпляром класса, состоящим из набора экземпляров класса грузовика, набора экземпляров класса продукта, списка идентификаторов грузовика, списка идентификаторов продукта и набора вариантов комбинации продукта и грузовика. Связь между индивидом и оцениваемым значением не так проста, с одной функцией оценки это немного сложно (по крайней мере, для меня, как для новичка). Спасибо!

1 ответ

Я знаю, что DEAP может немного сбить с толку, но если вы хотите поиграть с небольшим руководством, вы можете попробовать использовать мой собственный пакет Python, который я использовал для решения многоцелевых задач в рамках своей докторской работы:

https://github.com/tanzairatier/jmoo

Общая идея заключается в том, что у вас есть: - проблемы, которые представляют собой наборы входных данных (решений) и целей для оптимизации - алгоритмы, которые представляют собой комбинации выбора, мутации, сортировки и т. Д.

Затем в jmoo_interface вы можете определить, что вы хотите запустить, то есть, может быть, вы хотите запустить NSGA-II для задач Фонсека и Шаффера. И если вы хотите создавать свои собственные задачи и алгоритмы, вы также должны это делать.

Вы можете реализовать функцию оценки, которая возвращает два значения: одно для времени ожидания, другое для времени доставки.

def waiting(individual):
    # do some calculation

def delivery(individual):
    # do some other calculation

def evaluate(individual):
    return waiting(individual), delivery(individual)

Затем просто зарегистрируйте эту функцию оценки в своем наборе инструментов и установите weights вектор в вашем определении пригодности должен содержать два числа

toolbox = base.Toolbox()
toolbox.register("attr_flt", random.uniform, 0, 1)

creator.create("FitnessMin", base.Fitness, weights=(-1.0, -1.0)) #you want to minimize both times
creator.create("Individual", list, fitness=creator.FitnessMin)

toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_float, n=5)
toolbox.register("evaluate", evaluate)
Другие вопросы по тегам