Задача оптимизации Pymoo для двоичных переменных и ограничений

#python-3.x #optimization #genetic-algorithm

#python-3.x #оптимизация #генетический алгоритм

Вопрос:

Я очень новичок в этом приятном пакете оптимизации pymoo. После просмотра документов я все еще не могу реализовать этот пакет для моей конкретной проблемы. Вот целевые функции и ограничения:

Цель:

        1) min(f1); 2) min(f2)
 

Ограничения

       1)x =0 or 1; 2) sum(x)=9
 

Вот мой текущий код:

 class MyProblem(Problem):

  def __init__(self):
      super().__init__(n_var=13,
                     n_obj=2,
                     n_constr=1,
                     xl=0,
                     xu=1)
  def first_objective_function(self, x):
      y = ''my main function''
      return y
    
  def second_objective_function(self, x):
          y = ''my second main function''
          return y

  def _evaluate(self, X, out, *args, **kwargs):
          f1 = self.first_objective_function(X)
          f2 = self.second_objective_function(X)
          g = ???????
          out["F"] = np.column_stack([f1, f2])
          out["G"] = np.column_stack([g])

my_problem = MyProblem()

algorithm = NSGA2(
           pop_size=40,
           n_offsprings=10,
           sampling=get_sampling("bin_random"),
           crossover=get_crossover("bin_hux", prob=0.9, eta=15),
           mutation=get_mutation("bin_bitflip", eta=20),
           eliminate_duplicates=True)

res = minimize(my_problem,
           algorithm,
           ('n_gen', 100),
           verbose=False)
 

Мой вопрос в том, как определить мое уравнение ограничения. Сумма (X) равна значению, не меньше значения.

Второй вопрос: использую ли я правильный алгоритм выборки, перекрестного перехода и мутации для этой проблемы? Я надеюсь, что число 1 в x исправлено.

Ответ №1:

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

Тем не менее, код может потребовать дополнительной настройки для вашей конкретной проблемы, но не стесняйтесь использовать его в качестве схемы.