如何在 Pyomo AbstractModel 中迭代创建多个目标?

How to create multiple objectives iteratively in Pyomo AbstractModel?

我正在尝试实现一个 AbstractModel,它希望在同一可行集上迭代优化多个 objective 函数。 因为我想在周围的脚本中获得最大的透明度,更准确地说是迭代激活不同 objective 函数的脚本,所以我想将所有 objective 函数包含在一个 obj 属性中模型的。我应该怎么做?

由于有两种类型的 objective 在不同的集合上建立索引,我尝试分别创建这两种类型,然后将两者合并到一个 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 中,我无法迭代单个 objective 容器。

您可以在规则中执行此操作:

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)

只需确保在将模型发送到求解器之前停用除一个以外的所有 objective。