Как создать несколько целей итеративно в Pyomo AbstractModel? - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь реализовать AbstractModel, который пытается итеративно оптимизировать несколько целевых функций по одному и тому же возможному набору.Поскольку я хочу иметь наибольшую прозрачность в окружающих скриптах, точнее, в том, который активирует различные целевые функции итеративно, я хотел бы содержать все целевые функции в одном атрибуте obj модели.Как мне поступить так?

Поскольку существует два типа целей, проиндексированных для разных наборов, я попытался создать оба типа по отдельности, а затем объединить их в ObjectiveList.

Это может привести к следующему:

import pyomo.environ as pyo

model=pyo.AbstractModel()

model.i=pyo.Set(initialize=[1,2])
model.a=pyo.Set(initialize=[(1,2),(2,1)])

model.x=pyo.Var()

model.obj=pyo.ObjectiveList()

def obj_type1(model,i):
  return x**2

obj_type1=pyo.Objective(model.i,rule=obj_type1)
for key, new_obj in obj_type1.items():
  model.obj.add(new_obj)

def obj_type2(model,a):
  return x+1

obj_type2=pyo.Objective(model.a,rule=obj_type2)
for key, new_obj in obj_type2.items():
  model.obj.add(new_obj)

Это не работает, поскольку в AbstractModel я не могу перебирать отдельные целевые контейнеры.

1 Ответ

0 голосов
/ 02 июля 2019

Вы можете сделать это в правиле:

def _obj(m, j):
    if j < 3:
        return m.x**2
    else:
        return m.x+1
m.obj = Objective([1,2,3,4], rule=_obj)

Просто обязательно деактивируйте все, кроме одной цели, перед отправкой модели в решатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...