【问题标题】:How to create multiple objectives iteratively in Pyomo AbstractModel?如何在 Pyomo AbstractModel 中迭代地创建多个目标?
【发布时间】:2019-07-02 08:36:21
【问题描述】:

我正在尝试实现一个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 中,我无法遍历各个目标容器。

【问题讨论】:

    标签: python scripting mathematical-optimization pyomo


    【解决方案1】:

    您可以在规则中这样做:

    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)
    

    在将模型发送给求解器之前,请确保停用除一个目标之外的所有目标。

    【讨论】:

    • 我看不出这如何解决我的问题。我如何处理我在示例中展示的情况,其中第一个目标的索引集与第二个类型不同(甚至不同维度)?
    • 您可以手动将第一个和第二个目标的索引映射到单个目标“列表”中的索引。我真的不明白您希望在单个组件中实现两种类型的目标的动机,或者您使用 AbstractModel 的原因。
    • 因为它被集成到一个脚本中,该脚本迭代地检查所有目标是否不超过某个阈值(在我的例子中为 0)。然而,周围的脚本应该忽略建模细节,只提供数据并检查阈值。
    • 另一种选择是声明单独的目标组件并使用model.component_data_objects(Objective)循环遍历模型中的所有目标。
    • 感谢您的建议!我最终应用了您在之前的评论中建议的映射技巧!
    猜你喜欢
    • 2022-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多