Решение многозадачной оптимизации графа в Python


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

Вот в чем проблема: я хочу найти граф из n вершин (n постоянно, скажем, 100) и m ребер (m может меняться), где оптимизируется набор метрик:

  • Метрика а должна быть как можно выше
  • Метрика B должна быть как можно ниже
  • Метрика C должна быть как можно выше
  • Метрика D должна быть такой же низкой, как возможно

Мое лучшее предположение-пойти с GA. Я не очень хорошо знаком с генетическими алгоритмами, но могу потратить немного времени, чтобы изучить основы. Из того, что я читаю до сих пор, я должен пойти как таковой:

  1. генерировать популяцию графов из n узлов, случайно связанных с друг друга через m = случайные [1,2000] (например) ребра
  2. запустите метрики A, B, C, D на каждом графике
  3. Найдено ли оптимальное решение (как определено в задаче)?

Если да, идеальный. Если нет:

  1. выберите лучшие графики
  2. кроссовер
  3. мутировать (добавлять или удалять ребра случайным образом?)
  4. перейти к пункту 3.

Теперь я обычно использую Python для моих маленьких экспериментов. Мог бы DEAP (https://code.google.com/p/deap / ) помогите мне с этой проблемой? Если да, то у меня есть еще много вопросов (особенно по шагам crossover и mutate), но вкратце: достаточно ли просты шаги (в Python, используя DEAP), чтобы их можно было объяснить или обобщить здесь?

Я могу попробуйте и уточните, если это необходимо. Овации.

2 4

2 ответа:

Отказ от ответственности: я являюсь одним из ведущих разработчиков DEAP.

Ваш индивид может быть представлен двоичной строкой. Каждый бит будет указывать, есть ли ребро между двумя вершинами. Таким образом, ваши индивидуумы будут состоять из n * (n - 1) / 2 битов, где n-число вершин. Чтобы оценить вашу индивидуальность, вам просто нужно построить матрицу смежности из индивидуального генотипа. Пример функции оценки см. В следующем документе. https://gist.github.com/cmd-ntrf/7816665 .

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

creator.create("Fitness", base.Fitness, weights=(1.0, -1.0, 1.0, -1.0)

Операторы кроссовера и мутации могут быть такими же, как и в Примере OneMax. http://deap.gel.ulaval.ca/doc/default/examples/ga_onemax_short.html

Однако, поскольку вы хотите сделать многоцелевой, вы потребуется многоцелевой оператор выбора, либо NSGA2, либо SPEA2. Наконец, алгоритм должен быть mu + lambda. Как для многоцелевого выбора, так и для использования алгоритма mu + lambda см. Пример рюкзака GA. http://deap.gel.ulaval.ca/doc/default/examples/ga_knapsack.html

Таким образом, по существу, чтобы встать и работать, вам нужно только объединить часть примера onemax с рюкзаком, используя предложенную функцию оценки.