Многоцелевая оптимизация с использованием генетического алгоритма с использованием DEAP
Я пытаюсь решить проблему маршрутизации логистического распределения. Например, есть x грузовиков, которым нужно распределять y товаров из их соответствующей отправной точки в соответствующий пункт назначения.
Проблемы для решения:
- какой товар доставлен каким грузовиком;
- в каком порядке продукты собираются и опускаются.
Чего достичь: (с разным весом)
- минимальное время ожидания получения одного товара;
- минимальное время доставки для каждого продукта.
После прочтения документации 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)