如何在 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。
我正在尝试实现一个 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。