Решение многозадачной оптимизации графа в Python
Я пытаюсь найти то, что кажется сложной и трудоемкой многоцелевой оптимизацией на большом графике.
Вот в чем проблема: я хочу найти граф из n вершин (n постоянно, скажем, 100) и m ребер (m может меняться), где оптимизируется набор метрик:
- Метрика а должна быть как можно выше
- Метрика B должна быть как можно ниже
- Метрика C должна быть как можно выше
- Метрика D должна быть такой же низкой, как возможно
Мое лучшее предположение-пойти с GA. Я не очень хорошо знаком с генетическими алгоритмами, но могу потратить немного времени, чтобы изучить основы. Из того, что я читаю до сих пор, я должен пойти как таковой:
- генерировать популяцию графов из n узлов, случайно связанных с друг друга через m = случайные [1,2000] (например) ребра
- запустите метрики A, B, C, D на каждом графике Найдено ли оптимальное решение (как определено в задаче)?
Если да, идеальный. Если нет:
- выберите лучшие графики
- кроссовер
- мутировать (добавлять или удалять ребра случайным образом?)
- перейти к пункту 3.
Теперь я обычно использую Python для моих маленьких экспериментов. Мог бы DEAP (https://code.google.com/p/deap / ) помогите мне с этой проблемой? Если да, то у меня есть еще много вопросов (особенно по шагам crossover и mutate), но вкратце: достаточно ли просты шаги (в Python, используя DEAP), чтобы их можно было объяснить или обобщить здесь?
Я могу попробуйте и уточните, если это необходимо. Овации.
2 ответа:
Отказ от ответственности: я являюсь одним из ведущих разработчиков DEAP.
Ваш индивид может быть представлен двоичной строкой. Каждый бит будет указывать, есть ли ребро между двумя вершинами. Таким образом, ваши индивидуумы будут состоять из n * (n - 1) / 2 битов, где n-число вершин. Чтобы оценить вашу индивидуальность, вам просто нужно построить матрицу смежности из индивидуального генотипа. Пример функции оценки см. В следующем документе. https://gist.github.com/cmd-ntrf/7816665 .
Ваша физическая форма будет состоять из 4 целей, и на основе того, что вы сказали о минимизации и максимизации каждой цели, класс фитнеса будет создан следующим образом:Операторы кроссовера и мутации могут быть такими же, как и в Примере OneMax. http://deap.gel.ulaval.ca/doc/default/examples/ga_onemax_short.html
creator.create("Fitness", base.Fitness, weights=(1.0, -1.0, 1.0, -1.0)
Однако, поскольку вы хотите сделать многоцелевой, вы потребуется многоцелевой оператор выбора, либо NSGA2, либо SPEA2. Наконец, алгоритм должен быть mu + lambda. Как для многоцелевого выбора, так и для использования алгоритма mu + lambda см. Пример рюкзака GA. http://deap.gel.ulaval.ca/doc/default/examples/ga_knapsack.html
Таким образом, по существу, чтобы встать и работать, вам нужно только объединить часть примера onemax с рюкзаком, используя предложенную функцию оценки.